AWSTemplateFormatVersion: '2010-09-09'
Description: "Create DynamoDB Table for Laravel Cache"
Parameters:
DynamoDbTableName:
Description: DynamoDB Table Name
Type: String
Default: cache
Resources:
LaravelCacheTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: !Sub "${DynamoDbTableName}"
AttributeDefinitions:
- AttributeName: key
AttributeType: S
KeySchema:
- AttributeName: key
KeyType: HASH
TimeToLiveSpecification:
AttributeName: expires_at
Enabled: true
BillingMode: PAY_PER_REQUEST
- DynamoDBのテーブル名は cache で作るか、他のテーブル名にするならLaravelのenvファイルの DYNAMODB_CACHE_TABLEの値も書き換える。
- DynamoDBテーブルのメインのキーの名前を key に設定し、SortKeyは未設定。
- TTL用に expires_at を設定。ただし、DynamoDBでは特性上その時間になってもすぐに消えてくれずに48時間くらい残る事もあるが、
https://github.com/laravel/framework/blob/9.x/src/Illuminate/Cache/DynamoDbStore.php の isExpiredメソッドにて、LaravelのCache経由ならexpires_atが期限切れの場合、ちゃんと期限切れ扱いとなるように対応されている。
artisan tinkerで検証
php artisan tinker
>>> Cache::store('dynamodb')->put("test", "hogehoge", 60);
// Laravelのconfig/cache.phpのprefixがデフォルト内容であれば、
// DynamoDBのテーブルには laravel_cache_:test のキーで60秒間保持される。
IAMロールをEC2にアタッチした場合
DynamoDBを操作可能なIAMポリシーを持つIAMロールをEC2にアタッチした場合、DynamoDBを使うconfig設定として、Laravelのconfig/cache.phpのdynamodbの箇所の、key, secret, endpointをコメントアウトするとLaravelからDynamoDBが利用出来る。
'dynamodb' => [
'driver' => 'dynamodb',
// 'key' => env('AWS_ACCESS_KEY_ID'),
// 'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
// 'endpoint' => env('DYNAMODB_ENDPOINT'),
],