Suzna Developer Blog

すずな株式会社の開発者が技術情報を発信します。

SymfonyのセッションにDynamoDBを利用する

こんにちは。clonedです。今日からすずな株式会社の開発者ブログを開始することになりました。今後ともよろしくお願いします。

SymfonyのセッションストレージにDynamoDBを使うというアイデアは目新しくないと思いますが、情報が少ないように思ったので書いてみます。

Symfony Session DynamoDB で検索すると GitHub - gwkunze/dynamo-session-bundle: DynamoDb Session Handler for Symfony 2 が上位に出てきます。しかし、更新が止まっており最新の aws/aws-sdk-php が利用できないようです。

また、AWS公式の aws/aws-sdk-phpAws\DynamoDb\SessionHandler があるのにわざわざ他のライブラリを被せるのがスマートではありません。

そういうわけで、Symfonyの設定を楽にする aws/aws-sdk-php-symfony (こちらもAWS公式)を使って設定だけでDynamoDBをセッションに利用する方法を紹介します。

DynamoDBにテーブルを作成

f:id:cloned:20161007234420p:plain

paramters.ymlでテーブル名、プライマリキーの名称はどちらも設定可能なのでこの名前でなくても大丈夫です。

Symfonyを準備

$ symfony new my_project

aws/aws-sdk-php と aws/aws-sdk-php-symfony をインストール

$ cd my_project
$ composer require aws/aws-sdk-php aws/aws-sdk-php-symfony

app/AppKernel.php にAwsBundleを追加

<?php
...
    public function registerBundles()
    {
        $bundles = [
...
            new Aws\Symfony\AwsBundle(),

DynamoDBの設定をする

app/config/parameters.yml

app/config/paramters.yml にdynamodbの設定を追記する

parameters:
    dynamodb:
        table_name: session
        session_lifetime: 7776000

table_name にはDynamoDBで作成したテーブル名を設定します。 session_lifetime にはセッション保存期間を秒で設定します。

app/config/services.yml

services:
    dynamodb_session_connection:
        class: Aws\DynamoDb\StandardSessionConnection
        arguments: ["@aws.dynamodb", "%dynamodb%"]
    dynamodb_session_handler:
        class: Aws\DynamoDb\SessionHandler
        arguments: ["@dynamodb_session_connection"]

DynamoDBクライアントとparameters.ymlで設定したセッションに関する設定値を元にStandardSessionConnectionインスタンスが生成されます。 そして、そのStandardSessionConnectionインスタンスを元にSessionHandlerが生成されます。

app/config/config.yml

セッションのハンドラーをservices.ymlで追加した dynamodb_session_handler に設定します。

framework:
    session:
        handler_id: dynamodb_session_handler
        name: my_project
        cookie_lifetime: 7776000

そして、AWSユーザーであればおなじみの設定を追記します。

aws:
    version: "latest"
    region:  "ap-northeast-1"
    credentials:
        key:    "AWSのkey"
        secret: "AWSのsecret"

動作確認

サイトにアクセスしてみた後にDynamoDBでテーブルを確認するとセッションが保存されています。

f:id:cloned:20161007235219p:plain f:id:cloned:20161007235228p:plain

まとめ

AWS公式ライブラリだけで対処できて素敵です。

動作環境
  • Amazon Linux
  • PHP 5.6.25
  • Symfony 3.1.5
  • aws/aws-sdk-php 3.19.13
  • aws/aws-sdk-php-symfony 1.2.0