Amazon SQS でデッドレターキューの再処理を設定する方法について説明します。 - Amazon Simple Queue Service

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

Amazon SQS でデッドレターキューの再処理を設定する方法について説明します。

デッドレターキューリドライブを使用して、未使用のメッセージをデッドレターキューから別の宛先に移動して処理します。デフォルトでは、デッドレターキューの再処理は、デッドレターキューからソースキューにメッセージを移動します。ただし、どちらのキューも同じタイプであれば、他の任意のキューを再処理の送信先として設定することもできます。例えば、デッドレターキューが FIFO キューの場合、再処理の送信先キューも FIFO キューでなければなりません。さらに、再処理の速度を設定して Amazon SQS がメッセージを移動するレートを設定することもできます。

注記

メッセージが FIFO キューから FIFO DLQ に移動されると、元のメッセージの重複排除 ID は元のメッセージの ID に置き換えられます。これは、重複排除 ID を共有している 2 つの独立したメッセージが DLQ 重複排除によって保存されなくなることがないようにするためです。

デッドレターキューは、メッセージを受信順に、最も古いものから再処理します。ただし、送信先キューは、再処理されたメッセージと他のプロデューサーからの新しいメッセージを、受信順に取り込みます。例えば、プロデューサーがソース FIFO キューにメッセージを送信しているときに、デッドレターキューから再処理されたメッセージを同時に受信した場合、再処理されたメッセージはプロデューサーからの新しいメッセージと混在します。

注記

再処理タスクにより、保持期間がリセットされます。すべての再処理されたメッセージは、新しい messageID を持つ新しいメッセージと見なされ、再処理されたメッセージに enqueueTime が割り当てられます。

Amazon SQS API を使用して既存の標準キューにデッドレターキューの再処理を設定する

デッドレターキューの再処理は、StartMessageMoveTaskListMessageMoveTasksCancelMessageMoveTask API アクションを使用して設定できます。

API アクション 説明

StartMessageMoveTask

指定されたソースキューから指定された送信先キューにメッセージを移動する非同期タスクを開始します。

ListMessageMoveTasks

特定のソースキューにある最新のメッセージ移動タスク (最大 10 個) を取得します。

CancelMessageMoveTask

指定されたメッセージ移動タスクをキャンセルします。メッセージの移動は、現在のステータスが RUNNING の場合にのみキャンセルできます。

Amazon SQS コンソールを使用して既存の標準キューにデッドレターキューの再処理を設定する

  1. Amazon SQSコンソール (https://console.aws.amazon.com/sqs/) を開きます。

  2. ナビゲーションペインで [Queues(キュー) ] を選択します。

  3. デッドレターキューとして設定されたキューの名前を選択します。

  4. [DLQ 再処理の開始] を選択します。

  5. [設定を再処理][メッセージの送信先] で、次のいずれかを実行します。

    • 再処理のためにメッセージをソースキューに入れるには、[再処理のためにソースキューに入れる] を選択します。

    • 再処理のためにメッセージを別のキューに入れるには、[再処理のためにカスタム送信先に移動] を選択します。次に、既存の宛先キューのAmazonリソースネーム(ARNを入力します。

  6. Velocityコントロール設定で、次のいずれかを選択します。

    • システム最適化 - デッドレターキューメッセージを 1 秒あたり最大のメッセージ数で再処理します。

    • カスタム最大速度 - 1 秒あたりカスタム最大レートのメッセージ数でデッドレターキューメッセージを再処理します。許可される最大レートは1秒に500 メッセージです。

      • カスタム最大速度を小さい値から始めて、ソースキューがメッセージでいっぱいにならないことを確認することをお勧めします。そこから、ソースキューの状態を引き続き監視しながら、カスタム最大速度の値を徐々に上げていきます。

  7. デッドレターキューの再処理の設定が完了したら、[メッセージをリドライブ] を選択します。

    重要

    Amazon SQS は、デッドレターキューからメッセージを再処理するときにメッセージのフィルタリングと変更をサポートしていません。

    デッドレターキューの再処理タスクは、最大 36 時間実行できます。Amazon SQS は、アカウントごとに最大 100 件のアクティブな再処理タスクをサポートしています。

  8. メッセージの再処理タスクをキャンセルする場合は、キューの [詳細] ページで、[DLQ 再処理をキャンセル] を選択します。進行中のメッセージの再処理をキャンセルしても、移動先キューに正常に移動済みのメッセージは、移動先キューに残ります。

デッドレターキューの再処理に対するキューのアクセス許可の設定

ポリシーにアクセス許可を追加することで、ユーザーに特定のデッドレターキューアクションへのアクセスを許可できます。デッドレターキューの再処理に最低限必要なアクセス許可は次のとおりです。

最小限必要なアクセス権限 必要な API メソッド
メッセージの再処理を開始するには
  • デッドレターキューの sqs:StartMessageMoveTasksqs:ReceiveMessagesqs:DeleteMessagesqs:GetQueueAttributes を追加します。デッドレターキューまたは元のソースキュー (SSE キューとも呼ばれます) のいずれかが暗号化されている場合、kms:Decrypt メッセージの暗号化に使用されたすべての KMS キーも必要になります。

  • 送信先キュー sqs:SendMessage を追加します。送信先キューが暗号化されている場合、kms:GenerateDataKeykms:Decrypt も必要になります。

進行中のメッセージの再処理をキャンセルするには
  • デッドレターキューの sqs:CancelMessageMoveTasksqs:ReceiveMessagesqs:DeleteMessagesqs:GetQueueAttributes を追加します。デッドレターキューが暗号化されている場合 (SSE キューとも呼ばれる)、kms:Decrypt も必要になります。

メッセージの移動状況を表示するには
  • デッドレターキューの sqs:ListMessageMoveTaskssqs:GetQueueAttributes を追加します。

暗号化されたキューペア (デッドレターキューのあるソースキュー) のアクセス許可を設定するには

次の手順を使用して、デッドレターキュー (DLQ) リドライブの最小アクセス許可を設定します。

  1. IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

  2. ナビゲーションペインで [ポリシー] を選択します。

  3. 新しいポリシーを作成し、次のアクセス許可を追加します。再処理オペレーションを実行する IAM ユーザーまたはロールにポリシーをアタッチします。

    • DLQ (ソースキュー):

      • sqs:StartMessageMoveTask

      • sqs:CancelMessageMoveTask

      • sqs:ListMessageMoveTasks

      • sqs:ReceiveMessage

      • sqs:DeleteMessage

      • sqs:GetQueueAttributes

      • sqs:ListDeadLetterSourceQueues

      • DLQ (ソースキュー) のリソース ARN を指定します (例: "arn:aws:sqs:<DLQ_region><DLQ_accountId><DLQ_name>")。

    • 送信先キューのアクセス許可:

      • sqs:SendMessage

      • 送信先キューResource ARNの を指定します (例: "arn:aws:sqs:<DestQueue_region>:<DestQueue_accountId>:<DestQueue_name>")。

    • KMS キーのアクセス許可:

      • kms:Decrypt (DLQ でメッセージを復号化する必要があります)。

      • kms:GenerateDataKey (送信先キュー内のメッセージを暗号化する必要があります)。

        • Resource ARNs:

          • DLQ (ソースキュー) 内のメッセージの暗号化に使用される KMS キーの ARN (例: "arn:aws:kms:<region><accountId>:key/<SourceQueueKeyId>")。

          • 送信先キュー内のメッセージの暗号化に使用される KMS キーの ARN (例: "arn:aws:kms:<region><accountId>:key/<DestinationQueueKeyId>")。

    アクセスポリシーは以下のようになります。

    JSON
    { "Version": "2012-10-17" , "Statement": [ { "Effect": "Allow", "Action": [ "sqs:StartMessageMoveTask", "sqs:CancelMessageMoveTask", "sqs:ListMessageMoveTasks", "sqs:ReceiveMessage", "sqs:DeleteMessage", "sqs:GetQueueAttributes", "sqs:ListDeadLetterSourceQueues" ], "Resource": "arn:aws:sqs:us-west-1:123456789012:<DLQ_name>", "Condition": { "StringEquals": { "aws:ResourceTag/QueueRole": "source" } } }, { "Effect": "Allow", "Action": "sqs:SendMessage", "Resource": "arn:aws:sqs:us-west-1:123456789012:<DestQueue_name>", "Condition": { "StringEquals": { "aws:ResourceTag/QueueRole": "destination" } } }, { "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": [ "arn:aws:kms:us-west-1:123456789012:key/<SourceQueueKeyId>", "arn:aws:kms:us-west-1:123456789012:key/<DestQueueKeyId>" ] } ] }
暗号化されていないキューペア (デッドレターキューのあるソースキュー) を使用してアクセス許可を設定するには

以下の手順に従って、標準の暗号化されていないデッドレターキュー (DLQ) の処理に必要な最小限のアクセス許可を設定します。最低限必要なアクセス許可は、デッドレターキューからの属性の受信、削除、取得、およびソースキューへの属性の送信です。

  1. IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

  2. ナビゲーションペインで [ポリシー] を選択します。

  3. 新しいポリシーを作成し、次のアクセス許可を追加します。再処理オペレーションを実行する IAM ユーザーまたはロールにポリシーをアタッチします。

    • DLQ (ソースキュー):

      • sqs:StartMessageMoveTask

      • sqs:CancelMessageMoveTask

      • sqs:ListMessageMoveTasks

      • sqs:ReceiveMessage

      • sqs:DeleteMessage

      • sqs:ListDeadLetterSourceQueues

      • DLQ (ソースキュー) のリソース ARN を指定します (例: "arn:aws:sqs:<DLQ_region><DLQ_accountId><DLQ_name>")。

    • 送信先キューのアクセス許可:

      • sqs:SendMessage

      • 送信先キューResource ARNの を指定します (例: "arn:aws:sqs:<DestQueue_region>:<DestQueue_accountId>:<DestQueue_name>")。

    アクセスポリシーは以下のようになります。

    JSON
    { "Version": "2012-10-17" , "Statement": [ { "Effect": "Allow", "Action": [ "sqs:StartMessageMoveTask", "sqs:CancelMessageMoveTask", "sqs:ListMessageMoveTasks", "sqs:ReceiveMessage", "sqs:DeleteMessage", "sqs:GetQueueAttributes", "sqs:ListDeadLetterSourceQueues" ], "Resource": "arn:aws:sqs:us-west-1:111122223333:<DLQ_name>", "Condition": { "StringEquals": { "aws:ResourceTag/QueueRole": "source" } } }, { "Effect": "Allow", "Action": "sqs:SendMessage", "Resource": "arn:aws:sqs:us-west-1:111122223333:<DestQueue_name>", "Condition": { "StringEquals": { "aws:ResourceTag/QueueRole": "destination" } } } ] }

VPC エンドポイントアクセスコントロールでのデッドレターキューリドライブの使用

aws:sourceVpc 条件を使用して特定の VPCs へのキューアクセスを制限する場合、デッドレターキュー (DLQ) の再処理機能を有効にするには、 AWS サービスの例外を作成する必要があります。これは、メッセージの移動時に Amazon SQS サービスが VPC の外部で動作するためです。

DLQ 再処理オペレーションを許可するには、キューポリシーに aws:CalledViaLast条件を追加します。これにより、Amazon SQS は直接アクセスの VPC 制限を維持しながら、ユーザーに代わって API コールを行うことができます。

VPC 制限付きアクセスと DLQ リドライブの両方を許可するには:

  1. キューポリシーで aws:CalledViaLast条件を使用します。

  2. ソースキューと DLQ の両方にポリシーを適用する

  3. 他のソースからの直接アクセスに関する VPC 制限を維持する

これらの要件を実装するポリシーの例を次に示します。

{ "Version": "2012-10-17", "Id": "SQSRedriveWithVpcRestriction", "Statement": [ { "Sid": "DenyOutsideVPCUnlessAWSService_DestQueue", "Effect": "Deny", "Principal": "*", "Action": "sqs:*", "Resource": "arn:aws:sqs:*:111122223333:DestQueue", "Condition": { "StringNotEquals": { "aws:SourceVpc": "vpc-1234567890abcdef0" }, "StringNotEqualsIfExists": { "aws:CalledViaLast": "sqs.amazonaws.com" } } }, { "Sid": "DenyOutsideVPCUnlessAWSService_DLQ", "Effect": "Deny", "Principal": "*", "Action": "sqs:*", "Resource": "arn:aws:sqs:*:111122223333:Dlq", "Condition": { "StringNotEquals": { "aws:SourceVpc": "vpc-1234567890abcdef0" }, "StringNotEqualsIfExists": { "aws:CalledViaLast": "sqs.amazonaws.com" } } } ] }
  • プレースホルダー値を実際の値に置き換えます。

  • このポリシーは、条件付きの「拒否」ステートメントを使用します。これは「許可」ステートメントを使用するよりも安全です。

  • StringNotEqualsIfExists 演算子は、条件キーがリクエストコンテキストに存在しない場合を処理します。

または、 aws:ViaAWSService条件キーを使用して、VPC 制限を維持しながらサービスベースのアクセスを許可することもできます。この条件キーは、リクエストが AWS サービスからのものであるかどうかを示します。aws:ViaAWSService の代わりに を使用するポリシーの例を次に示しますaws:CalledViaLast

{ "Version": "2012-10-17", "Id": "SQSRedriveWithVpcRestriction", "Statement": [ { "Sid": "DenyOutsideVPCUnlessAWSService_DestQueue", "Effect": "Deny", "Principal": "*", "Action": "sqs:*", "Resource": "arn:aws:sqs:*:111122223333:DestQueue", "Condition": { "StringNotEquals": { "aws:SourceVpc": "vpc-1234567890abcdef0" }, "BoolIfExists": { "aws:ViaAWSService": "false" } } }, { "Sid": "DenyOutsideVPCUnlessAWSService_DLQ", "Effect": "Deny", "Principal": "*", "Action": "sqs:*", "Resource": "arn:aws:sqs:*:111122223333:Dlq", "Condition": { "StringNotEquals": { "aws:SourceVpc": "vpc-1234567890abcdef0" }, "BoolIfExists": { "aws:ViaAWSService": "false" } } } ] }

aws:ViaAWSService 条件付きの BoolIfExists 演算子を使用すると、直接アクセスの VPC 制限を維持しながら、サービスからのリクエストが許可されます。これは、最後の呼び出しを行った AWS サービスをチェックするのではなく、 サービスによってリクエストが行われたかどうかを直接チェックするため、理解と保守が簡単になる場合があります。

IAM ポリシーとリソースポリシーで使用される条件キーの詳細については、「IAM JSON ポリシー要素: Condition」を参照してください。