6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

`laravel-dynamodb`でキャパシティモードをオンデマンドモードにする

Last updated at Posted at 2023-04-07

はじめに

弊社のいくつかのサービスではDynamoDBを使用しています。
それらのサービスはLaravelで実装されているものが多く、 laravel-dynamodb というパッケージを使用しています。

laravel-dynamodb とは

DynamoDBをEloquent Modelのように扱えるようにしてくれるORMのパッケージです。

また、上の記事を参考にDynamoDBもマイグレーションで管理するようにしました。
(特に以下を参考にさせていただきました)

今回の問題

弊社サービスの現状では、キャパシティモードの調整まで検討できておらず、オンデマンドモードで動かしながら探っていく方針となりました。
そのため、DynamoDBのマイグレーション時にオンデマンドモードで作成したいと思ったのですが、よく見かけるサンプルではプロビジョンドになってしまいました。
そのため、個人的な興味もあって、オンデマンドモードで作成するにはどうすればいいかを調べました。

尚、以下にも記載されていますが、キャパシティモードはマイグレーションよりAWSコンソールで調整する、でいいと思います。
ただ、今回は初回作成時にオンデマンドモードで作成するにはどうしたらいいか興味もあって調べてみました。

マイグレーションは RDBMS と区別しない

コード中のコメントにも記載したとおり、キャパシティユニット(以下、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"
        }

というのが記載されているので、これを参考に試していたらうまくいきました。。。

参考資料

さいごに

運動通信社は
「日本を世界が憧れるスポーツ大国にする」というビジョンを達成するべく、
一緒に働く仲間を募集しています!

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?