TransactWriteItems API 呼び出しが失敗するのですが、問題の根本原因を教えてください。
解決方法
TransactWriteItems リクエストが失敗したり、Amazon 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 リクエストのテーブルが別のリージョンまたはアカウントにある
TransactWriteItems リクエストにより、さまざまなテーブルの項目を操作できます。ただし、異なるリージョンまたはアカウントにあるテーブルを操作することはできません。TransactWriteItems リクエストを行うアカウントと同じリージョンにあるテーブルを操作していることを確認してください。
TransactWriteItems オペレーションの複数のアクションが同じ項目を処理する
TransactWriteItems オペレーションの複数のアクションが同じ項目を処理する場合、リクエストは次のようなメッセージが表示されて失敗します。
「トランザクションリクエストには、1つの項目に複数のオペレーションを含めることはできません」
そのため、例えば、TransactWriteItems が同じ項目に対して ConditionCheck および Put オペレーションを実行しようとすると、リクエストは失敗します。この TransactionConflict 例外をモニタリングするには、Amazon CloudWatch の DynamoDB テーブルの TransactionConflict メトリクスを使用します。
トランザクションを完了するのに十分なプロビジョニングされた容量がない
他のオペレーションと同様に、TransactWriteItems オペレーションを呼び出すと、DynamoDB テーブルがスロットルされる可能性があります。この問題の解決方法の詳細については、「オンデマンドの Amazon DynamoDB テーブルがスロットルされるのはなぜですか?」と「Amazon DynamoDB テーブルがスロットルされるのはなぜですか?」を参照してください。
ValidationError が発生している
項目のサイズが 400 KB を超えるか、ローカルセカンダリインデックス (LSI) が大きくなりすぎると、ValidationErrror が発生します。同様に、トランザクションによって行われた変更が原因で検証エラーが発生する可能性があります。これは、入力が DynamoDB サービスによって指定された 1 つ以上の制約を満たさないことを意味します。検証エラーには、満たされていない制約に応じて、次のメッセージのいずれかが表示されます。
- 1 つ以上のパラメータ値が無効です。
- 更新式が、許可されたサイズ制限を超えてセカンダリインデックスキーを更新しようとしています。
- 更新式が、セカンダリインデックスキーをサポートされていないタイプに更新しようとしています。
- 更新式のオペランドのデータ型が正しくありません。
- 更新する項目は、許可されている最大サイズを超えています。
- サポートされている範囲よりも大きい数値を保存しようとしている、または数値がオーバーフローしています。
- 更新する属性のタイプが一致しません。
- ネスティングレベルがサポートされている制限を超えました。
- 更新式で指定されたドキュメントパスが更新に対して無効です。
- 指定された式は、項目に存在しない属性を参照しています。
DynamoDB で、テーブルに保存できる各項目のサイズが制限されています。アプリケーションが、サイズ制限で許容されるよりも多くのデータを項目に保存する必要がある場合は、1 つ以上の大きい属性を圧縮します。または、項目をソートキーでインデックス付けされた複数の項目に分割します。また、項目を Amazon Simple Storage Service (Amazon S3) のオブジェクトとして保存することもできます。次に、Amazon S3 オブジェクト識別子を DynamoDB 項目に保存します。詳細については、「大きな項目と属性を保存するためのベストプラクティス」を参照してください。
トランザクションの項目の合計サイズが 4 MB を超えている
TransactWriteItems オペレーションは 4 MB を超えることはできません。これは厳格な制限です。詳細については、「DynamoDB トランザクション」を参照してください。
ユーザーエラーが発生した
無効なデータ形式などのユーザーエラーは、さまざまな理由で発生する可能性があります。例えば、TransactWriteItems オペレーションが基になる DynamoDB テーブルまたはインデックスを見つけることができないため、ResourceNotFoundException に対して 4xx エラーが表示される場合があります。または、DynamoDB テーブルまたはインデックスが ACTIVE でない可能性があります。
注: AWS SDK for Java を使用する場合、DynamoDB は CancellationReasons プロパティにキャンセルの理由を一覧表示します。このプロパティは他の言語には設定されていません。トランザクションのキャンセル理由は、リクエストした項目の順にリストされます。項目にエラーがない場合は、NONE コードと NULL メッセージがリストされます。詳細については、「TransactWriteItems」を参照してください。
関連情報
一般的なエラー