Amazon DynamoDB で TransactWriteItems API 呼び出しが失敗します。問題の根本原因を把握したいです。
解決策
TransactWriteItems API リクエストは、さまざまな理由で失敗したり、DynamoDB によって拒否されたりすることがあります。トラブルシューティングの手順については、次の解決策を参照してください。
条件式に、満たされない条件が含まれている
TransactWriteItems リクエスト内のいずれかの操作に設定した条件が満たされない場合、すべての操作が失敗します。TransactWriteItems リクエストは、最大 25 件の操作リクエストをグループ化する同期型書き込み操作です。すべてのアクションリクエストが成功するか、すべてのアクションリクエストが失敗するかのどちらかです。
この問題が原因でリクエストが失敗すると、次のようなエラーメッセージが表示されます。
"message": "Transaction cancelled, please refer cancellation reasons for specific reasons [ConditionalCheckFailed, None, None, None] (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: TransactionCanceledException;..."
この問題を解決するには、リクエストに設定したすべての条件が満たされるようにする必要があります。
操作しているテーブルが別のリージョンまたはアカウントにある
TransactWriteItems リクエストを使用すると、複数テーブルにわたり項目を操作できます。ただし、操作できるのは、リクエストの送信元と同じ AWS リージョンとアカウントにあるテーブルだけです。この問題を解決するには、TransactWriteItems リクエストを行った AWS アカウントと同じ AWS リージョンにあるテーブルのみを使用してください。
TransactWriteItems 操作で、同じ項目が複数のアクションによって処理されている
TransactWriteItems 操作の複数のアクションが同じ項目を処理する場合、リクエストは失敗し、次のようなエラーメッセージが表示されます。
「トランザクションリクエストには、1 つの項目に対する複数の操作を含めることはできません」
たとえば、TransactWriteItems が同じ項目に対して ConditionCheck 操作および Put 操作を実行しようとすると、そのリクエストは TransactionConflictException で失敗します。Amazon CloudWatch で DynamoDB テーブルの TransactionConflict メトリクスを使用すると、この例外を監視できます。
同時に実行される TransactWriteItems リクエスト間の競合
複数のトランザクション内における、1 つの項目に対する項目レベルの同時リクエストにより、トランザクションの競合が発生します。トランザクションの競合は、次の理由で発生する可能性があります。
- ある項目に対する PutItem、UpdateItem、または DeleteItem リクエストが、同じ項目を含む進行中の TransactWriteItems リクエストと競合している。
- ある TransactWriteItems リクエスト内の項目が、進行中の別の TransactWriteItems 項目リクエストの一部である。
この理由で PutItem、UpdateItem、または DeleteItem リクエストが拒否された場合、そのリクエストは **TransactionConflictException **で失敗します。ただし、TransactWriteItems または TransactGetItems 内の項目レベルのリクエストが別の理由で拒否された場合、そのリクエストは TransactionCanceledException で失敗します。
トランザクションを完了するためのプロビジョンドキャパシティが不足している
プロビジョンドキャパシティが十分でないときに TransactWriteItems リクエストを呼び出すと、DynamoDB テーブルでスロットリングが発生します。スロットリングの詳細については、「オンデマンド DynamoDB テーブルでスロットリングが発生する理由を知りたいです」および、「Amazon DynamoDB でプロビジョニングされたテーブルにスロットリングが発生する理由を知りたいです」を参照してください。
IdempotentParameterMismatch 例外によるトランザクションの失敗
TransactWriteItems リクエストにオプションのクライアントトークンを含めると、リクエストをべき等にすることができます。べき等トランザクションは、接続のタイムアウトやその他の接続の問題が原因で、同じ操作が複数回送信された場合のアプリケーションエラーを防ぐのに役立ちます。
クライアントトークンは、それを使用するリクエストが終了してから 10 分間有効です。そのトークンを含むリクエストが 10 分以内に繰り返されるが、トランザクション内で何らかのパラメーターが変更された場合、DynamoDB は IdempotentParameterMismatch 例外を返します。
検証エラーが発生した
項目のサイズが 400 KB を超えるか、ローカルセカンダリインデックス (LSI) が大きくなりすぎると、ValidationError が発生します。DynamoDB により、テーブルに格納できる各項目のサイズは制限されています。アプリケーションがサイズ制限で許可されているよりも多くのデータを項目に保存する必要がある場合は、大きい方の属性を 1 つ以上圧縮します。または、大きい項目をソートキーでインデックス付けされた複数の小さな項目に分割します。項目を Amazon Simple Storage Service (Amazon S3) バケットにオブジェクトとして保存することもできます。その後、Amazon S3 オブジェクト識別子を DynamoDB 項目に保存できます。詳細については、「大きな項目と属性を保存する場合のベストプラクティス」を参照してください。
検証エラーは、トランザクションによる変更が原因で発生することもあります。これは、リクエストのパラメータが DynamoDB サービスによって指定された 1 つ以上の制約を満たしていないことを指します。制約のタイプとそれに関連するエラーメッセージの詳細については、クラス TransactionCanceledException のドキュメントを参照してください。
トランザクション内の項目の合計サイズが 4 MB を超えている
**TransactWriteItems ** 操作は 4 MB を超えることはできません。これはハードリミットです。詳細については、「DynamoDB トランザクション」を参照してください。
4xx エラーが発生した
無効なデータ形式などのユーザーエラーは、さまざまな理由で発生する可能性があります。たとえば、TransactWriteItems 操作が対象となる DynamoDB テーブルまたはインデックスを見つけることができないことが原因で、ResourceNotFoundException エラーとして 4xx エラーが発生する場合があります。または、DynamoDB テーブルまたはインデックスのステータスが ACTIVE ではない可能性があります。
注: Java 用 AWS SDK を使用する場合、DynamoDB は CancellationReasons プロパティにキャンセルの理由を一覧表示します。このプロパティは他の SDK 言語には設定されていません。トランザクションのキャンセル理由は、リクエストされた項目の順に表示されます。
5xx エラーが発生した
5xx エラーとして記録されるシステムエラーが原因で、トランザクションが失敗する場合もあります。これらのエラーは、サービスがリクエストを処理できない場合に発生します。これらのエラーは、フリート内の一時的なネットワークの問題、インフラストラクチャの問題、ストレージノード関連の問題など、さまざまな理由で発生する可能性があります。詳細については、「Amazon DynamoDB での内部サーバーエラーのトラブルシューティング」を参照してください。
関連情報
よくあるエラー
TransactWriteItems API