はじめに
弊社のいくつかのサービスではDynamoDBを使用しています。
それらのサービスはLaravelで実装されているものが多く、 laravel-dynamodb
というパッケージを使用しています。
laravel-dynamodb
とは
DynamoDBをEloquent Modelのように扱えるようにしてくれるORMのパッケージです。
また、上の記事を参考にDynamoDBもマイグレーションで管理するようにしました。
(特に以下を参考にさせていただきました)
今回の問題
弊社サービスの現状では、キャパシティモードの調整まで検討できておらず、オンデマンドモードで動かしながら探っていく方針となりました。
そのため、DynamoDBのマイグレーション時にオンデマンドモードで作成したいと思ったのですが、よく見かけるサンプルではプロビジョンド
になってしまいました。
そのため、個人的な興味もあって、オンデマンドモードで作成するにはどうすればいいかを調べました。
尚、以下にも記載されていますが、キャパシティモードはマイグレーションよりAWSコンソールで調整する、でいいと思います。
ただ、今回は初回作成時にオンデマンドモードで作成するにはどうしたらいいか興味もあって調べてみました。
コード中のコメントにも記載したとおり、キャパシティユニット(以下、CU)に関しては、テーブル作成時は仮の値(最小の 5 とか)を入れておき、あとから管理コンソール上で値を更新するようにしています。
CU は環境(本番/ステージングなど)によって変わるうえに、運用の中で変化していく値でもあるため、マイグレーションで管理する必要性が薄いことが理由です。
結論
以下でオンデマンドモードでテーブル作成できました。
public function up()
{
// テスト時には DynamoDB を利用しない
if (app()->environment('testing')) {
return;
}
$params = [
'TableName' => $this->getTableName('Movies'),
'KeySchema' => [
[
'AttributeName' => 'year',
'KeyType' => 'HASH',
],
[
'AttributeName' => 'title',
'KeyType' => 'RANGE',
],
],
'AttributeDefinitions' => [
[
'AttributeName' => 'year',
'AttributeType' => 'N'
],
[
'AttributeName' => 'title',
'AttributeType' => 'S'
],
],
- 'ProvisionedThroughput' => [
- 'ReadCapacityUnits' => 5,
- 'WriteCapacityUnits' => 5,
- ],
+ // キャパシティモード: オンデマンド
+ "BillingMode" => "PAY_PER_REQUEST",
];
resolve(DynamoDbClientService::class)->getClient()->createTable($params);
}
調べた経緯
AWSコンソールでオンデマンドモードにしたテーブルのテーブル定義を AWS CLI で確認してみます。
$ aws dynamodb describe-table --table-name=develop_comments
{
"Table": {
"AttributeDefinitions": [
{
"AttributeName": "comment_id",
"AttributeType": "S"
},
# ...
],
"TableName": "develop_comments",
"KeySchema": [
{
"AttributeName": "comment_id",
"KeyType": "HASH"
}
],
"TableStatus": "ACTIVE",
"CreationDateTime": "2022-08-01T20:11:45.341000+09:00",
"ProvisionedThroughput": {
"NumberOfDecreasesToday": 0,
"ReadCapacityUnits": 0, # ★
"WriteCapacityUnits": 0 # ★
},
# (以降省略)
なので、単純にキャパシティユニットを0
にすればよさそうですが、実行してみるとエラーになってしまいます。
$ aws dynamodb update-table \
--table-name develop_comments \
--provisioned-throughput ReadCapacityUnits=0,WriteCapacityUnits=0
Parameter validation failed:
Invalid value for parameter ProvisionedThroughput.ReadCapacityUnits, value: 0, valid min value: 1
Invalid value for parameter ProvisionedThroughput.WriteCapacityUnits, value: 0, valid min value: 1
次に AWS CLI のリファレンスをよく読んでみます。その中で、
Example 2: To create a table in On-Demand Mode
"BillingModeSummary": {
"BillingMode": "PAY_PER_REQUEST"
}
というのが記載されているので、これを参考に試していたらうまくいきました。。。
参考資料
さいごに
運動通信社は
「日本を世界が憧れるスポーツ大国にする」というビジョンを達成するべく、
一緒に働く仲間を募集しています!