AWS CDK で DynamoDB のオンデマンドテーブルの最大スループットを指定可能になりました

AWS CDK で DynamoDB のオンデマンドテーブルの最大スループットを指定可能になりました

Clock Icon2024.08.22

こんにちは、製造ビジネステクノロジー部の若槻です。

AWS CDK の最新のリリースで、下記のアップデートが追加されていました。

https://github.com/aws/aws-cdk/releases/tag/v2.154.0

dynamodb: adding on-demand-throughput to table (#30725) (d5a19bb), closes #30091

on-demand-throughput とは DynamoDB のオンデマンドテーブルの最大スループットのことで、「スループットに応じてキャパシティを自動的に拡大・縮小させつつ、使用量の上限も設ける」というオンデマンドモードとプロビジョンドモードのいいとこ取りをできる機能です。Lambda 関数の同時実行数を制限するのにも似ていますね。

機能自体は今年 5 月にリリースされたていましたが、今回のアップデートにより AWS CDK の L2 Construct でも設定が可能になりました。
https://aws.amazon.com/about-aws/whats-new/2024/05/dynamodb-configurable-maximum-throughput-on-demand-tables/

試してみた

CDK モジュールのアップデート

AWS CDK モジュールを v2.154.0 以上にアップデートします。

npm i aws-cdk-lib@latest aws-cdk@latest

CDK コード

CDK で on-demand-throughput をテーブルと GSI に設定してみます。maxReadRequestUnits および maxWriteRequestUnits プロパティで 1 秒あたりの読み取りリクエスト単位(RRU)と書き込みリクエスト単位(WRU)を指定します。

lib/cdk-sample-stack.ts
import { aws_dynamodb, Stack } from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class CdkSampleStack extends Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    /**
     * DynamoDB Table
     */
    const table = new aws_dynamodb.TableV2(this, 'Table', {
      partitionKey: { name: 'id', type: aws_dynamodb.AttributeType.STRING },
      /**
       * Table Billing Mode の設定
       */
      billing: aws_dynamodb.Billing.onDemand({
        maxReadRequestUnits: 100,
        maxWriteRequestUnits: 115,
      }),
    });

    /**
     * Global Secondary Index
     */
    table.addGlobalSecondaryIndex({
      indexName: 'GSI',
      partitionKey: { name: 'gsi_id', type: aws_dynamodb.AttributeType.STRING },
      /**
       * GSI Billing Mode の設定
       */
      maxReadRequestUnits: 50,
      maxWriteRequestUnits: 60,
    });
  }
}

ここで on-demand-throughput が設定可能になったのは Table ではなく TableV2 Construct クラスのみである点には注意が必要です。TableV2 を使うとグローバルテーブルが作成されるため、複数リージョンでの利用想定が無ければ従来の Table を使う場合が多いと思いますが、TableV2 でのみ利用可能な機能がちょくちょく出てきておりこちらに移行させたい意図があるようです。

動作確認

前述のコードを CDK デプロイし作成されたテーブルおよび GSI を確認すると、on-demand-throughput が設定されていることが確認できました。

オンデマンモードに変更してみる

on-demand-throughput を設定したテーブルおよび GSI のキャパシティモードをオンデマンドに変更してみます。

maxReadRequestUnits および maxWriteRequestUnits プロパティの指定を削除します。

lib/cdk-sample-stack.ts
import { aws_dynamodb, Stack } from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class CdkSampleStack extends Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    /**
     * DynamoDB Table
     */
    const table = new aws_dynamodb.TableV2(this, 'Table', {
      partitionKey: { name: 'id', type: aws_dynamodb.AttributeType.STRING },
      /**
       * Table Billing Mode の設定
       */
      billing: aws_dynamodb.Billing.onDemand(),
    });

    /**
     * Global Secondary Index
     */
    table.addGlobalSecondaryIndex({
      indexName: 'GSI',
      partitionKey: { name: 'gsi_id', type: aws_dynamodb.AttributeType.STRING },
    });
  }
}

CDK デプロイすると、テーブルおよび GSI の on-demand-throughput の設定が無効化されていることが確認できました。

おわりに

AWS CDK で DynamoDB のオンデマンドテーブルの最大スループットを指定可能になったので共有しました。

ちなみに on-demand-throughput を設定したテーブルに実際に負荷を掛けた場合の挙動は下記が参考になるので合わせて御覧ください。
https://dev.classmethod.jp/articles/dynamodb-max-ondemand-ycsb/

以上

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.