Amazon QLDB のトラブルシューティング - Amazon Quantum Ledger Database (Amazon QLDB)

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon QLDB のトラブルシューティング

次のセクションでは、Amazon QLDB を使用する際に発生する可能性のある一般的なエラーを集約したリストと、それらのトラブルシューティング方法を示します。

IAM アクセスに関するトラブルシューティングガイダンスについては、「Amazon QLDB アイデンティティとアクセスのトラブルシューティング」を参照してください。

PartiQL ステートメントのチューニングのベストプラクティスについては、「クエリパフォーマンスの最適化」を参照してください。

QLDB ドライバーを使ったトランザクションの実行

このセクションでは、Amazon QLDB ドライバーを使用して台帳で PartiQL トランザクションを実行したときに返される一般的な例外について説明します。この機能の詳細については、「ドライバーの開始方法」を参照してください。ドライバーを設定および使用するためのベストプラクティスについては、「ドライバーに関する推奨事項」を参照してください。

それぞれの例外には、特定のエラーメッセージに加え、簡単な説明と考えられる解決方法に関する推奨事項が記載されています。

CapacityExceededException

メッセージ: 処理能力の超過

台帳の処理能力を超えたため、Amazon QLDB はリクエストを拒否しました。QLDB は、サービスのヘルスとパフォーマンスを維持するために、台帳ごとに内部スケーリング制限を適用します。この制限は、各リクエストのワークロードサイズによって異なります。例えば、非インデックス修飾クエリによるテーブルスキャンなど、非効率なデータトランザクションを実行する場合、リクエストのワークロードが増大する可能性があります。

リクエストを再試行する前に、待機することをお勧めします。アプリケーションでこの例外が継続的に発生する場合は、ステートメントを最適化し、台帳に送信するリクエストの割合やボリュームを減らします。ステートメントの最適化の例としては、トランザクションごとに実行するステートメントの数を減らすことや、テーブルインデックスのチューニングなどがあります。ステートメントの最適化方法およびテーブルスキャンの回避方法については、「クエリパフォーマンスの最適化」を参照してください。

最新バージョンの QLDB ドライバーを使用することもお勧めします。このドライバーには、エクスポネンシャルバックオフとジッターを使用するデフォルトの再試行ポリシーがあり、こうした例外発生時に自動的に再試行します。エクスポネンシャルバックオフは、再試行間の待機時間を累進的に長くして、連続的なエラー応答に対処するという概念に基づいています。

InvalidSessionException

メッセージ: トランザクション transactionId の有効期限が切れています

トランザクションが最大有効期間を超えました。トランザクションは、コミットされるまでに最大 30 秒間実行できます。このタイムアウト制限を超えると、トランザクションに行ったすべての操作が拒否され、QLDB はセッションを破棄します。この制限は、クライアントがトランザクションを開始し、トランザクションをコミットまたはキャンセルしないことで、セッションがリークするのを防ぎます。

この例外がアプリケーションでよく発生する場合、トランザクションの実行に時間がかかりすぎている可能性があります。トランザクションの実行に 30 秒以上かかる場合は、トランザクションを高速化するようにステートメントを最適化します。ステートメントの最適化の例としては、トランザクションごとに実行するステートメントの数を減らすことや、テーブルインデックスのチューニングなどがあります。詳細については、「クエリパフォーマンスの最適化」を参照してください。

InvalidSessionException

メッセージ: セッション sessionId の有効期限が切れています

最大合計存続期間を超えたため、QLDB はセッションを破棄しました。QLDB は、アクティブなトランザクションに関係なく、13 ~ 17 分後にセッションを破棄します。ハードウェア障害、ネットワーク障害、アプリケーションの再起動など、さまざまな理由でセッションが失われたり、障害が生じたりすることがあります。したがって、QLDB はセッションに最大有効期間を適用し、クライアントソフトウェアがセッション障害に対して回復力を持つようにします。

この例外が発生した場合は、新しいセッションを取得し、トランザクションを再試行することをお勧めします。また、最新バージョンの QLDB ドライバーを使用することをお勧めします。このドライバーは、アプリケーションに代わってセッションプールとそのヘルスを管理します。

InvalidSessionException

メッセージ: そのようなセッションはありません

クライアントは、存在しないセッションを使用して QLDB でトランザクションを実行しようとしました。以前に存在していたセッションをクライアントが使用していると仮定すると、次のいずれかが原因でセッションは存在しなくなる可能性があります。

  • セッションが内部サーバーの障害 (つまり、HTTP 応答コード 500 のエラー) に関与している場合、QLDB は、カスタマーが不確実な状態のセッションでトランザクションを実行することを許可するのではなく、セッションを完全に破棄することを選択することがあります。その後、そのセッションでの再試行は、このエラーで失敗します。

  • 期限切れのセッションは、最終的に QLDB に破棄されます。その後、そのセッションの使用を継続しようとすると、最初の InvalidSessionException エラーではなく、このエラーが発生します。

この例外が発生した場合は、新しいセッションを取得し、トランザクションを再試行することをお勧めします。また、最新バージョンの QLDB ドライバーを使用することをお勧めします。このドライバーは、アプリケーションに代わってセッションプールとそのヘルスを管理します。

RateExceededException

メッセージ: レートを超えました

QLDB は、呼び出し元のアイデンティティに基づいてクライアントをスロットルしました。QLDB は、トークンバケットスロットリングアルゴリズムを使用して、リージョンごと、アカウント単位でスロットリングを適用します。これは、サービスのパフォーマンスを向上し、QLDB のすべてのお客様に平等にご利用いただくために行われるものです。たとえば、StartSessionRequest オペレーションを使用して多数の同時セッションを取得しようとすると、スロットリングが発生する可能性があります。

アプリケーションの正常性を維持し、さらなるスロットリングを軽減するために、エクスポネンシャルバックオフおよびジッターを使用してこの例外を再試行できます。エクスポネンシャルバックオフは、再試行間の待機時間を累進的に長くして、連続的なエラー応答に対処するという概念に基づいています。最新バージョンの QLDB ドライバーを使用することをお勧めします。このドライバーには、エクスポネンシャルバックオフとジッターを使用するデフォルトの再試行ポリシーがあり、こうした例外発生時に自動的に再試行します。

最新バージョンの QLDB ドライバーは、アプリケーションが StartSessionRequest コールのために QLDB によって継続的にスロットリングしている場合に役立ちます。このドライバーは、トランザクション間で再利用されるセッションのプールを維持します。これにより、アプリケーションが行う StartSessionRequest コールの回数を減らすことができます。API スロットリング制限の引き上げをリクエストするには、AWS Support センターにお問い合わせください。

LimitExceededException

メッセージ: セッション制限を超えました

台帳が、アクティブなセッション数のクォータ (制限とも呼ばれる) を超えました。このクォータは Amazon QLDB でのクォータと制限 で定義されています。台帳のアクティブセッション数は結果的に一貫しており、常時クォータ付近で実行している台帳の場合、この例外が定期的に表示される場合があります。

アプリケーションの正常性を維持するために、この例外を再試行することをお勧めします。この例外を回避するには、すべてのクライアントで単一台帳で使用する同時セッションが 1,500 を超えないようにしてください。例えば、Java 用 Amazon QLDB ドライバーmaxConcurrentTransactions メソッドを使用して、ドライバーインスタンスで使用可能なセッションの最大数を設定できます。

QldbClientException

メッセージ: ストリームされた結果は、親トランザクションが開いている場合にのみ有効です

トランザクションは閉じられており、QLDB から結果を取得するために使用することはできません。トランザクションは、コミットまたはキャンセルされると終了します。

この例外は、クライアントが Transaction オブジェクトを直接操作していて、トランザクションのコミットまたはキャンセル後に QLDB から結果を取得しようとした場合に発生します。この問題を軽減するには、クライアントはトランザクションを閉じる前にデータを読み取る必要があります。

ジャーナルデータのエクスポート

このセクションでは、台帳から Amazon S3 バケットにジャーナルデータをエクスポートするときに QLDB が返す可能性のある一般的な例外について説明します。この機能の詳細については、「Amazon QLDB からのジャーナルデータのエクスポート」を参照してください。

それぞれの例外には、特定のエラーメッセージに加え、簡単な説明と考えられる解決方法に関する推奨事項が記載されています。

AccessDeniedException

メッセージ: User: userARN is not authorized to perform: iam:PassRole on resource: roleARN (ユーザー: userARN にはリソース roleARN に対して iam:PassRole を実行する許可がありません)

IAM ロールを QLDB サービスに渡す許可がありません。QLDB には、すべてのジャーナルエクスポートリクエストに対応するロールが必要であり、このロールを QLDB に渡す許可が必要です。このロールにより、指定した Amazon S3 バケットへの書き込みアクセス許可が QLDB に付与されます。

指定した IAM ロールリソースに対して PassRole API オペレーションを実行する許可を付与する IAM ポリシーを QLDB サービス (qldb.amazonaws.com) に定義していることを確認します。ポリシーの例については、「Amazon QLDB のアイデンティティベースのポリシー例」を参照してください。

IllegalArgumentException

メッセージ: QLDB encountered an error validating S3 configuration (QLDB で S3 設定の検証中にエラーが発生しました): errorCode errorMessage

このエラーの原因として考えられるのは、指定したバケットが Simple Storage Service (Amazon S3) に存在しないことです。または、指定した Simple Storage Service (Amazon S3) バケットにオブジェクトを書き込むための権限が QLDB にないと考えられます。

エクスポートジョブリクエストで指定した S3 バケット名が正しいか確認します。バケットの命名規則の詳細については、「Amazon Simple Storage Service ユーザーガイド」の「バケットの制約と制限」を参照してください。

また、指定したバケットに対する PutObject および PutObjectAcl アクセス許可を QLDB サービス (qldb.amazonaws.com) に付与するポリシーを定義していることを確認します。詳細については、「エクスポートアクセス許可」を参照してください。

IllegalArgumentException

メッセージ: Unexpected response from Amazon S3 while validating the S3 configuration. (S3 設定の検証中に、Amazon S3 から不測のレスポンスがありました。) S3 からのレスポンス: errorCode errorMessage

指定した S3 バケットにジャーナルエクスポートデータを書き込もうとしましたが、Simple Storage Service (Amazon S3) エラーレスポンスがあり失敗しました。考えられる原因の詳細については、「Amazon Simple Storage Service ユーザーガイド」の「Amazon S3 のトラブルシューティング」を参照してください。

IllegalArgumentException

メッセージ: Amazon S3 bucket prefix must not exceed 128 characters (Amazon S3 バケットプレフィックスは 128 文字以下でなければなりません)

ジャーナルエクスポートのリクエストで指定したプレフィックスが 128 文字を超えています。

IllegalArgumentException

メッセージ: Start date must not be greater than end date (開始日は終了日よりも前の日付でなければなりません)

InclusiveStartTimeExclusiveEndTime を両方とも、ISO 8601 の日時形式、協定世界時 (UTC) にしてください。

IllegalArgumentException

メッセージ: End date cannot be in future (終了日を現在よりも後の日付にすることはできません)

InclusiveStartTimeExclusiveEndTime を両方とも、ISO 8601 の日時形式、UTC にしてください。

IllegalArgumentException

メッセージ: The supplied object encryption setting (S3EncryptionConfiguration) is not compatible with an AWS Key Management Service (AWS KMS) key

ObjectEncryptionTypeNO_ENCRYPTION または SSE_S3KMSKeyArn が指定されています。SSE_KMS のオブジェクトの暗号化タイプに対してのみ、カスタマーマネージド AWS KMS key を指定できます。Simple Storage Service (Amazon S3) のサーバー側の暗号化オプションの詳細については、「Amazon S3 デベロッパーガイド」の「サーバー側の暗号化を使用したデータの保護」を参照してください。

LimitExceededException

メッセージ: Exceeded the limit of 2 concurrently running Journal export jobs (ジャーナルエクスポートジョブの同時実行の上限数 2 を超えています)

QLDB では、デフォルトで、ジャーナルエクスポートジョブの同時実行は最大 2 件までという制限が適用されます。

ジャーナルデータのストリーミング

このセクションでは、台帳から Amazon Kinesis Data Streams へのジャーナルデータのストリーミング時に QLDB から返される可能性のある例外について説明します。この機能の詳細については、「Amazon QLDB からのジャーナルデータのストリーミング」を参照してください。

それぞれの例外には、特定のエラーメッセージに加え、簡単な説明と考えられる解決方法に関する推奨事項が記載されています。

AccessDeniedException

メッセージ: User: userARN is not authorized to perform: iam:PassRole on resource: roleARN (ユーザー: userARN にはリソース roleARN に対して iam:PassRole を実行する許可がありません)

IAM ロールを QLDB サービスに渡す許可がありません。QLDB には、すべてのジャーナルストリーミングリクエストに対応するロールが必要であり、このロールを QLDB に渡す許可が必要です。このロールは、指定した Amazon Kinesis Data Streams リソースでの書き込み許可を QLDB に付与します。

指定した IAM ロールリソースに対して PassRole API オペレーションを実行する許可を付与する IAM ポリシーを QLDB サービス (qldb.amazonaws.com) に定義していることを確認します。ポリシーの例については、「Amazon QLDB のアイデンティティベースのポリシー例」を参照してください。

IllegalArgumentException

メッセージ: QLDB encountered an error validating Kinesis Data Streams (Kinesis Data Streams の検証中にエラーが発生しました): Kinesis からのレスポンス: errorCode errorMessage

このエラーの原因として考えられるのは、存在しない Kinesis Data Streams リソースが指定されていることです。または、QLDB には、指定した Kinesis データストリームにデータレコードを書き込むための十分な許可がありません。

ストリーミングリクエストに指定した Kinesis データストリームが正しいことを確認します。詳細については、「Amazon Kinesis Data Streams デベロッパーガイド」の「データストリームの作成および更新」を参照してください。

以下のアクションに対して QLDB サービス (qldb.amazonaws.com) 許可を付与する、指定した Kinesis データストリーム用のポリシーを定義していることも確認します。詳細については、「ストリームアクセス許可」を参照してください。

  • kinesis:PutRecord

  • kinesis:PutRecords

  • kinesis:DescribeStream

  • kinesis:ListShards

IllegalArgumentException

メッセージ: Unexpected response from Kinesis Data Streams while validating the Kinesis configuration. Response from Kinesis: errorCode errorMessage (Kinesis 設定の検証中に、Kinesis Data Streams から予期しないレスポンスがありました。Kinesis からのレスポンス: errorCode errorMessage)

指定した Kinesis データストリームにデータレコードを書き込もうとしましたが、Kinesis エラーレスポンスがあり失敗しました。考えられる原因については、「Amazon Kinesis Data Streams デベロッパーガイド」の「Amazon Kinesis Data Streams プロデューサーのトラブルシューティング」を参照してください。

IllegalArgumentException

メッセージ: Start date must not be greater than end date. (開始日は終了日よりも前の日付でなければなりません。)

InclusiveStartTimeExclusiveEndTime を両方とも、ISO 8601 の日時形式、協定世界時 (UTC) にしてください。

IllegalArgumentException

メッセージ: Start date cannot be in the future (開始日を現在よりも後の日付にすることはできません)

InclusiveStartTimeExclusiveEndTime を両方とも、ISO 8601 の日時形式、UTC にしてください。

LimitExceededException

メッセージ: Exceeded the limit of 5 concurrently running Journal streams to Kinesis Data Streams (Kinesis Data Streams への同時実行ジャーナルストリームの 5 つの制限を超えました)

QLDB では、一度に実行できるジャーナルストリーミングのデフォルト上限、最大 5 件が適用されます。

ジャーナルデータの検証

このセクションでは、台帳でジャーナルデータを検証するときに QLDB が返す可能性のある一般的な例外を示します。この機能の詳細については、「Amazon QLDB でのデータ検証」を参照してください。

各例外には、固有のエラーメッセージ、エラーをスローする可能性のある API オペレーション、簡単な説明、および考えられる解決策の案が含まれています。

IllegalArgumentException

メッセージ: 提供された Ion 値は無効なため解析できません。

API オペレーション: GetDigest, GetBlock, GetRevision

リクエストを再試行する前に、有効な Amazon Ion 値が指定されているか確認してください。

IllegalArgumentException

メッセージ: 指定されたブロックアドレスは無効です。

API オペレーション: GetDigest, GetBlock, GetRevision

リクエストを再試行する前に、有効なブロックアドレスが指定されていることを確認してください。ブロックアドレスは、strandIdsequenceNo という 2 つのフィールドを含む Amazon Ion 構造です。

例: {strandId:"BlFTjlSXze9BIh1KOszcE3",sequenceNo:14}

IllegalArgumentException

メッセージ: The sequence number of the provided digest tip address is beyond the strand's latest committed record. (指定されたダイジェストティップアドレスのシーケンス番号が、ストランドの最新のコミット済みレコードを超えています。)

API オペレーション: GetDigest, GetBlock, GetRevision

指定するダイジェストティップアドレスのシーケンス番号は、ジャーナルストランドの最新のコミット済みレコードのシーケンス番号以下でなければなりません。リクエストを再試行する前に、ダイジェストティップアドレスに有効なシーケンス番号を指定していることを確認してください。

IllegalArgumentException

メッセージ: The Strand ID of the provided block address is not valid. (指定されたブロックアドレスのストランド ID が無効です。)

API オペレーション: GetDigest, GetBlock, GetRevision

指定するブロックアドレスのストランド ID は、ジャーナルのストランド ID に一致するものでなければなりません。リクエストを再試行する前に、ブロックアドレスに有効なストランド ID を指定していることを確認してください。

IllegalArgumentException

メッセージ: The sequence number of the provided block address is beyond the strand's latest committed record. (指定されたブロックアドレスのシーケンス番号が、ストランドの最新のコミット済みレコードを超えています。)

API オペレーション: GetBlock, GetRevision

指定するブロックアドレスのシーケンス番号は、ストランドの最新のコミット済みレコードのシーケンス番号以下でなければなりません。リクエストを再試行する前に、有効なシーケンス番号を持つブロックアドレスが指定されているか確認してください。

IllegalArgumentException

メッセージ: 指定されたブロックアドレスのストランド ID は、指定されたダイジェストティップアドレスのストランド ID と一致するものでなければなりません。

API オペレーション: GetBlock, GetRevision

ドキュメントリビジョンまたはブロックは、指定するダイジェストと同じジャーナルストランドに存在する場合に限り検証できます。

IllegalArgumentException

メッセージ: 指定されたブロックアドレスのシーケンス番号は、指定されたダイジェストティップアドレスのシーケンス番号以下でなければなりません。

API オペレーション: GetBlock, GetRevision

ドキュメントリビジョンまたはブロックは、指定されたダイジェストでカバーされている場合に限り検証できます。言い換えると、ダイジェストティップアドレスより前のジャーナルにコミットされている場合に限り検証できます。

IllegalArgumentException

メッセージ: 指定されたドキュメント ID が、指定されたブロックアドレスのブロックに存在しません。

API オペレーション: GetRevision

指定するドキュメント ID は、指定するブロック内に存在するものでなければなりません。リクエストを再試行する前に、これら 2 つのパラメータが一貫しているか確認してください。