こんにちは。clonedです。今日からすずな株式会社の開発者ブログを開始することになりました。今後ともよろしくお願いします。
SymfonyのセッションストレージにDynamoDBを使うというアイデアは目新しくないと思いますが、情報が少ないように思ったので書いてみます。
Symfony Session DynamoDB
で検索すると gwkunze/dynamo-session-bundle が上位に出てきます。しかし、更新が止まっており最新の aws/aws-sdk-php が利用できないようです。
また、AWS公式の aws/aws-sdk-php に Aws\DynamoDb\SessionHandler
があるのにわざわざ他のライブラリを被せるのがスマートではありません。
そういうわけで、Symfonyの設定を楽にする aws/aws-sdk-php-symfony (こちらもAWS公式)を使って設定だけでDynamoDBをセッションに利用する方法を紹介します。
DynamoDBにテーブルを作成
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でテーブルを確認するとセッションが保存されています。
まとめ
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