Amazon Web Services ブログ

Amazon DynamoDB オンデマンドに設定可能な最大スループットの導入

(本記事は 2024/05/03に投稿された Introducing configurable maximum throughput for Amazon DynamoDB on-demand を翻訳した記事です。)

Amazon DynamoDB はあらゆる規模のモダンなアプリケーションを開発できるサーバレスの NoSQL データベースサービスです。DynamoDB オンデマンドモードはキャパシティプランニングなしで毎秒数百万ものリクエストに対応し、テーブルに対してリクエストが発行されていない時には自動的にゼロへスケールダウンするため、真のサーバレスエクスペリエンスを提供します。オンデマンドモードのシンプルなリクエスト単位の料金モデルでは実際に使用したキャパシティに対してのみ料金が発生するため、アイドルキャパシティについて心配する必要がありません。データベースのワークロードを予測することが複雑な新しいアプリケーションを構築する場合や、トラフィックパターンが予測できない、変動しやすいアプリケーションを構築する場合、また、従量課金制のサーバレススタックを使用する場合に、オンデマンドモードを使用するお客様が増えています。オンデマンドモードを使用するテーブルの場合、DynamoDB は需要に合わせてお客様のワークロードの増減に応じてすぐにスケーリングし、アプリケーションがリクエストに応答できるようにします。

各オンデマンドテーブルのデフォルトのスループットレートは毎秒 40,000 回の読み取りリクエストと毎秒 40,000 回の書き込みリクエストです(AWS サービスクォータを利用して増やすことができます)。これはアカウント内のすべてのテーブルに一律に適用され、アカウント内のさまざまなワークロードや要件に合わせてカスタマイズしたり調整することはできません。オンデマンドモードではさまざまなトラフィックパターンに対応するために即座にスケーリングされるため、最適化されていなかったり、急いで書かれたコードによって急速なスケールアップを引き起こしリソースを消費してしまうことで、テーブルレベルの使用量やコストを抑えることが困難になる可能性があります。お客様から、コストとパフォーマンスの最適なバランスを実現するために、オンデマンドモードでの柔軟性と詳細な設定機能を求める声が頻繁に寄せられています。

本日、個々のオンデマンドテーブルと関連するグローバルセカンダリインデックス(GSI)の最大読み取りまたは書き込み(あるはその両方)スループットを設定できる新しいオプション機能をリリースします。これにより、テーブルレベルのコストとパフォーマンスのバランスをより簡単に取ることができます。指定された最大スループットを超えるオンデマンドリクエストは制限されますが、最大スループット設定はアプリケーションの要件に基づいていつでも変更できます。オンデマンドの最大スループットは、新規および既存のシングルリージョンおよびマルチリージョンのテーブル(グローバルテーブル)、インデックス、および Amazon Simple Storage Service(Amazon S3)ワークフローからのテーブルの復元時とデータのインポート時にも設定できます。

この記事では、一般的なユースケースをいくつか紹介し、オンデマンドテーブルの最大スループットを実装して組織の目標を達成する方法を説明します。また、この機能が他の DynamoDB リソースとどのように連携するかについても説明します。

一般的なユースケース

このセクションではオンデマンドテーブルの最大スループットを設定する一般的なユースケースについて説明します。

  • ンデマンドスループットコストの最適化:オンデマンドテーブルの最大スループットの値を柔軟に設定できるため、コストの予測と管理がさらに高まり、お客様はさまざまなワークロード要件や予算に基づいて、本番環境と開発環境全体でサーバレスエクスペリエンスをより幅広く採用できるようになります。
  • コスト急増の防止:オンデマンドテーブルに最大スループットを事前に定義しておくことで、チームは最適化されていないコードや不正なプロセスから発生する可能性のある読み取りまたは書き込み量の偶発的な急増を防ぐことができます。この対策により、アプリケーション開発の初期段階や非生産的な環境であっても、コストへの影響を適切に管理することができます。
  • API使用量の管理:お客様がプロビジョニングされたキャパシティからオンデマンドモードに切り替えるシナリオでは、オンデマンドスループットの上限消費しきい値を設定することで、予期せずテーブルに対して実行できるワークロードトラフィック量にチームが不意を突かれることがないようにすることができます。これにより、組織が一定期間内でリソースを過剰に消費することを防ぎます。
  • ダウンストリームサービスの保護:お客様のアプリケーションにはサーバレスと非サーバレステクノロジーを含めることができます。サーバレスアーキテクチャの部分は需要に合わせてすぐに拡張されますが、キャパシティが固定化されたダウンストリームのコンポーネントは過負荷となる可能性があります。オンデマンドテーブルに最大スループットを設定することで、大量のイベントが複数のダウンストリームコンポーネントに伝播することによる予期しない副作用の発生することを防ぐことができます。

はじめに

オンデマンドテーブルを作成すると、デフォルトでは、ワークロードに対する最大スループットの設定は有効になっていません。これは、テーブル毎、および関連するグローバルセカンダリインデックスに設定できるオプション機能です。これにより、読み取りと書き込み最大スループットを個別に設定して、特定の要件に基づいたアプローチを微調整できます。オンデマンドテーブルの最大スループットはベストエフォートで適用されるため、保証されたリクエスト上限ではなく目標として考える必要があります。バーストキャパシティが原因で、ワークロードが指定された最大スループットを一時的に超える可能性があります。この機能を使用するのに追加のコストはなく、AWS コマンドラインインターフェース(AWS CLI)、AWS マネジメントコンソール、AWS SDK、または AWS CloudFormation を使用して開始することができます。

DynamoDB のコンソールを使用してオンデマンドテーブルの最大スループットを有効にするには、次の手順を実行します。

  1. DynamoDB コンソールのナビゲーションペインでテーブルを選択します。
  2. テーブルの作成を選択します。
  3. テーブルの名前、パーティションキー、およびソートキーを指定します。
  4. テーブル設定で、設定をカスタマイズを選択します。
  5. 読み取り/書き込みキャパシティの設定には、オンデマンドを選択します。
  6. 最大テーブルスループットで、読み取り、書き込み、またはその両方の制限を指定します (1 ~ 40,000 リクエストユニット)。
  7. テーブルの作成を選択します。

また、CLI、SDK、または AWS CloudFormation を使用して、MaxReadRequestUnitsMaxWriteRequestUnits を含む OnDemandThroughput パラメータを使用して、テーブルまたはインデックスのオンデマンド最大スループットを設定することもできます。これらのパラメータを使用すると、1AccountMaxTableLevelReads またはAccountMaxTableLevelWrites の有効範囲内で、読み取りと書き込みの最大単位を指定できます。値を -1 に設定すると制限が無効になるため、オンデマンドテーブルのスループット制限を必要としないシナリオに柔軟に対応できます。

テーブルとインデックスの最大スループット設定を個別に構成できる柔軟性があります。さらに、特定の要件に基づいて、これらの設定を読み取り、書き込み、またはその両方に選択的に適用できます。ベストプラクティスに従って、グローバルセカンダリインデックスの最大スループット設定は関連するテーブルの最大スループット設定と一致させることをお勧めします。これは、グローバルセカンダリインデックスがテーブルに書き込まれたデータを効果的に複製できるようにするために MaxWriteRequestUnits において特に重要となります。

次の例は、CLI を使用してテーブルとインデックスのオンデマンド最大スループットを設定する方法を示しています。

aws dynamodb create-table \
    --table-name MusicCollection \
    --attribute-definitions AttributeName=Artist,AttributeType=S AttributeName=SongTitle,AttributeType=S AttributeName=Genre,AttributeType=S \
    --key-schema AttributeName=Artist,KeyType=HASH AttributeName=SongTitle,KeyType=RANGE \
    --billing-mode PAY_PER_REQUEST \
    --on-demand-throughput MaxReadRequestUnits=500,MaxWriteRequestUnits=1000 \
    --global-secondary-indexes \
        "[
            {
                \"IndexName\": \"My-Index\",
                \"KeySchema\": [
                    {\"AttributeName\":\"Genre\",\"KeyType\":\"HASH\"},
                    {\"AttributeName\":\"SongTitle\",\"KeyType\":\"RANGE\"}
                ],
                \"Projection\": {
                    \"ProjectionType\":\"INCLUDE\",
                    \"NonKeyAttributes\":[\"Artist\"]
                },
                \"OnDemandThroughput\": {
                    \"MaxReadRequestUnits\": 500,
                    \"MaxWriteRequestUnits\": 1000
                }
            }
        ]"



{
    "TableDescription": {
        "AttributeDefinitions": [
            {
                "AttributeName": "Artist",
                "AttributeType": "S"
            },
            {
                "AttributeName": "Genre",
                "AttributeType": "S"
            },
            {
                "AttributeName": "SongTitle",
                "AttributeType": "S"
            }
        ],
        "TableName": "MusicCollection",
        "KeySchema": [
            {
                "AttributeName": "Artist",
                "KeyType": "HASH"
            },
            {
                "AttributeName": "SongTitle",
                "KeyType": "RANGE"
            }
        ],
        "TableStatus": "CREATING",
        "CreationDateTime": 1704890776.114,
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 0,
            "WriteCapacityUnits": 0
        },
        "TableSizeBytes": 0,
        "ItemCount": 0,
        "TableArn": "arn:aws:dynamodb:eu-west-1:964157134968:table/MusicCollection",
        "TableId": "26b92833-aaf5-4e66-9d30-283d066785a7",
        "BillingModeSummary": {
            "BillingMode": "PAY_PER_REQUEST"
        },
        "GlobalSecondaryIndexes": [
            {
                "IndexName": "My-Index",
                "KeySchema": [
                    {
                        "AttributeName": "Genre",
                        "KeyType": "HASH"
                    },
                    {
                        "AttributeName": "SongTitle",
                        "KeyType": "RANGE"
                    }
                ],
                "Projection": {
                    "ProjectionType": "INCLUDE",
                    "NonKeyAttributes": [
                        "Artist"
                    ]
                },
                "IndexStatus": "CREATING",
                "ProvisionedThroughput": {
                    "NumberOfDecreasesToday": 0,
                    "ReadCapacityUnits": 0,
                    "WriteCapacityUnits": 0
                },
                "IndexSizeBytes": 0,
                "ItemCount": 0,
                "IndexArn": "arn:aws:dynamodb:eu-west-1:964157134968:table/MusicCollection/index/My-Index",
                "OnDemandThroughput": {
                    "MaxReadRequestUnits": 500,
                    "MaxWriteRequestUnits": 1000
                }
            }
        ],
        "DeletionProtectionEnabled": false,
        "OnDemandThroughput": {
            "MaxReadRequestUnits": 500,
            "MaxWriteRequestUnits": 1000
        }
    }
}

グローバルテーブル

オンデマンドモードの最大スループットを設定してグローバルテーブルの容量を管理できます。これは ProvisionedThroughput と同様のセマンティクスに従います。1つのグローバルテーブルレプリカで読み取りまたは書き込み(あるいはその両方)の最大スループット設定を指定すると、同じ最大スループット設定がすべてのレプリカテーブルに自動的に適用されます。データを適切にレプリケーションするためには、グローバルテーブル内のレプリカテーブルとセカンダリインデックスに同一の書き込みスループット設定がされていることが重要です。UpdateTable API に導入された OnDemandThroughputOverride パラメーターを使用すると、レプリカごとに個別の読み取り制限を設定できるため、他のレプリカ設定から柔軟に独立できます。グローバルテーブルのキャパシティ設定について詳しくは、グローバルテーブルを管理するためのベストプラクティスと要件ガイドを参照してください。

次の例は、CLI を使用してグローバルテーブルレプリカの MaxReadRequestUnits のオーバーライドを追加する方法を示しています。

aws dynamodb update-table \
--table-name MusicCollection \
--replica-updates '[
    {
        "Create": {
            "RegionName": "us-west-2",
            "OnDemandThroughputOverride": {
                "MaxReadRequestUnits": 100
            }
        }
    }
]'

{
    "TableDescription": {
        "AttributeDefinitions": [
            {
                "AttributeName": "Artist",
                "AttributeType": "S"
            },
            {
                "AttributeName": "SongTitle",
                "AttributeType": "S"
            }
        ],
        "TableName": "MusicCollection",
        "KeySchema": [
            {
                "AttributeName": "Artist",
                "KeyType": "HASH"
            },
            {
                "AttributeName": "SongTitle",
                "KeyType": "RANGE"
            }
        ],
        "TableStatus": "UPDATING",
        "CreationDateTime": 1710345744.514,
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 0,
            "WriteCapacityUnits": 0
        },
        "TableSizeBytes": 0,
        "ItemCount": 0,
        "TableArn": "arn:aws:dynamodb:eu-west-1:964157134968:table/MusicCollection",
        "TableId": "4219b238-c3d4-472e-aba3-82ac4e5554ce",
        "BillingModeSummary": {
            "BillingMode": "PAY_PER_REQUEST",
            "LastUpdateToPayPerRequestDateTime": 1710345744.514
        },
        "StreamSpecification": {
            "StreamEnabled": true,
            "StreamViewType": "NEW_AND_OLD_IMAGES"
        },
        "LatestStreamLabel": "2024-03-13T16:03:49.907",
        "LatestStreamArn": "arn:aws:dynamodb:eu-west-1:964157134968:table/MusicCollection/stream/2024-03-13T16:03:49.907",
        "GlobalTableVersion": "2019.11.21",
        "Replicas": [
            {
                "RegionName": "us-west-2",
                "ReplicaStatus": "ACTIVE"
            }
        ],
        "DeletionProtectionEnabled": false,
        "OnDemandThroughput": {
            "MaxReadRequestUnits": 500,
            "MaxWriteRequestUnits": 1000
        }
    }
}

テーブルの更新が完了すると、DescribeTable 応答には読み取り用のオーバーライドされた値が含まれるようになります。

…
"Replicas": [
    {
        "RegionName": "us-west-2",
        "ReplicaStatus": "ACTIVE",
        "OnDemandThroughputOverride": {
            "MaxReadRequestUnits": 100
        }
    }
]
…

S3 ワークフローからの復元とインポート

DynamoDB のバックアップと復元機能は、オンデマンドの最大スループットもサポートします。バックアップは作成時のスループット設定を保持し、手動で上書きしない限り、復元時に新しいテーブルに適用されます。ImportTable を使用して Amazon S3 からデータをインポートする場合、CreateTable オペレーションで提供される柔軟性と同様に、オンデマンドの最大スループット制限を指定するオプションがあります。

復元またはインポートに OnDemandThroughput を指定しても、これらの操作の実行時間には影響しません。

モニタリング、アラートおよびトラブルシューティング

オンデマンドテーブルの最大テーブルスループットを指定する前に、ワークロードとトラフィックを理解することが重要です。AWS には、アプリケーションのモニタリングと理解に役立つさまざまなサービスがあります。たとえば、Amazon CloudWatch はログ、メトリックス、イベントとしてモニタリングデータを収集し、AWS のリソース、アプリケーション、サービスを一元的に把握できるようにします。アプリケーションを効果的にモニタリングすることで、アプリケーションの通常の状態を把握できます。ワークロードを理解したら、レート制限に最適なテーブルを判断できます。モニタリングを簡素化にするために、CloudWatch は OnDemandMaxReadRequestUnitsOnDemandMaxWriteRequestUnits のメトリクスを提供しています。これらのメトリックスは5分間隔で発行され、ProvisionedReadCapacityUnitsProvisionedWriteCapacityUnits のメトリクスの頻度と一致します。

オンデマンドテーブルの最大スループットはベストエフォートベースで適用されるため、保証されたリクエストの上限ではなく目標として考える必要があります。バーストキャパシティが原因で、ワークロードが指定された最大スループットを一時的に超える可能性があります。場合によっては、DynamoDB はバーストキャパシティーを使用して、テーブルのスループット設定を超える読み取りまたは書き込みに対応します。バーストキャパシティーを使用すると、スロットリングされていた可能性のある予期しない読み込みまたは書き込みリクエストに対して一時的に対応できます。詳細については、バーストキャパシティを効果的に使用するを参照してください。

アプリケーションがオンデマンドテーブルに設定した最大読み取りまたは書き込みスループットを超えると、DynamoDB は ThrottlingException メッセージで示されるように、これらのリクエストのスロットリングを開始し、システムが事前に設定されたスループット設定を準拠していることを示します。オンデマンドの最大スループット制限を超えてスロットリングした場合、「Throughput exceeds the maximum OnDemandThroughput configured on table or index」というメッセージが返されます。例外メッセージはこの機能専用のもので、スロットリングしているインスタンスをすばやく識別するために機能します。DynamoDB の例外に関する詳細については、DynamoDB でのエラー処理を参照してください。

まとめ

この記事では、オンデマンドテーブルの最大スループットを設定して、不要な DynamoDB スループットコストの暴走を回避し、ダウンストリームアプリケーションへの影響を抑える方法を示しました。この機能を使用するのに追加コストはかかりません。AWS マネジメントコンソール、AWS CLI、AWS SDK、DynamoDB API、または AWS CloudFormation を使用して開始できます。詳細については、DynamoDB 開発者ガイドを参照してください。

著者について

Lee Hannigan は、アイルランドのドニゴールを拠点とするシニア DynamoDB スペシャリストソリューションアーキテクトです。ビッグデータと分析テクノロジーの強固な基盤に支えられた分散システムに関する豊富な専門知識を持っています。DynamoDB スペシャリストソリューションアーキテクトとして、 DynamoDB の機能を活用したワークロードの設計、評価、最適化に関してお客様を支援することに優れています。

Mazen Ali は AWS の Amazon DynamoDB のプリンシパルプロダクトマネージャーで、ニューヨーク市を拠点としています。プロダクトマネジメントとテクノロジー関連の分野で豊富な経歴を持ち、お客様の要件を理解し、プロダクト戦略を定義し、クロスファンクショナルチームと協力して魅力的なエクスペリエンスを構築することに情熱を注いでいます。仕事以外では、旅行、読書、スキー、ハイキングを楽しんでいます。