翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Amazon SQS でデッドレターキューの再処理を設定する方法について説明します。
デッドレターキューリドライブを使用して、未使用のメッセージをデッドレターキューから別の宛先に移動して処理します。デフォルトでは、デッドレターキューの再処理は、デッドレターキューからソースキューにメッセージを移動します。ただし、どちらのキューも同じタイプであれば、他の任意のキューを再処理の送信先として設定することもできます。例えば、デッドレターキューが FIFO キューの場合、再処理の送信先キューも FIFO キューでなければなりません。さらに、再処理の速度を設定して Amazon SQS がメッセージを移動するレートを設定することもできます。
注記
メッセージが FIFO キューから FIFO DLQ に移動されると、元のメッセージの重複排除 ID は元のメッセージの ID に置き換えられます。これは、重複排除 ID を共有している 2 つの独立したメッセージが DLQ 重複排除によって保存されなくなることがないようにするためです。
デッドレターキューは、メッセージを受信順に、最も古いものから再処理します。ただし、送信先キューは、再処理されたメッセージと他のプロデューサーからの新しいメッセージを、受信順に取り込みます。例えば、プロデューサーがソース FIFO キューにメッセージを送信しているときに、デッドレターキューから再処理されたメッセージを同時に受信した場合、再処理されたメッセージはプロデューサーからの新しいメッセージと混在します。
注記
再処理タスクにより、保持期間がリセットされます。すべての再処理されたメッセージは、新しい messageID
を持つ新しいメッセージと見なされ、再処理されたメッセージに enqueueTime
が割り当てられます。
Amazon SQS API を使用して既存の標準キューにデッドレターキューの再処理を設定する
デッドレターキューの再処理は、StartMessageMoveTask
、ListMessageMoveTasks
、CancelMessageMoveTask
API アクションを使用して設定できます。
API アクション | 説明 |
---|---|
指定されたソースキューから指定された送信先キューにメッセージを移動する非同期タスクを開始します。 |
|
特定のソースキューにある最新のメッセージ移動タスク (最大 10 個) を取得します。 |
|
指定されたメッセージ移動タスクをキャンセルします。メッセージの移動は、現在のステータスが RUNNING の場合にのみキャンセルできます。 |
Amazon SQS コンソールを使用して既存の標準キューにデッドレターキューの再処理を設定する
Amazon SQSコンソール (https://console.aws.amazon.com/sqs/
) を開きます。 -
ナビゲーションペインで [Queues(キュー) ] を選択します。
-
デッドレターキューとして設定されたキューの名前を選択します。
-
[DLQ 再処理の開始] を選択します。
-
[設定を再処理] の [メッセージの送信先] で、次のいずれかを実行します。
-
再処理のためにメッセージをソースキューに入れるには、[再処理のためにソースキューに入れる] を選択します。
-
再処理のためにメッセージを別のキューに入れるには、[再処理のためにカスタム送信先に移動] を選択します。次に、既存の宛先キューのAmazonリソースネーム(ARNを入力します。
-
-
Velocityコントロール設定で、次のいずれかを選択します。
-
システム最適化 - デッドレターキューメッセージを 1 秒あたり最大のメッセージ数で再処理します。
-
カスタム最大速度 - 1 秒あたりカスタム最大レートのメッセージ数でデッドレターキューメッセージを再処理します。許可される最大レートは1秒に500 メッセージです。
-
カスタム最大速度を小さい値から始めて、ソースキューがメッセージでいっぱいにならないことを確認することをお勧めします。そこから、ソースキューの状態を引き続き監視しながら、カスタム最大速度の値を徐々に上げていきます。
-
-
-
デッドレターキューの再処理の設定が完了したら、[メッセージをリドライブ] を選択します。
重要
Amazon SQS は、デッドレターキューからメッセージを再処理するときにメッセージのフィルタリングと変更をサポートしていません。
デッドレターキューの再処理タスクは、最大 36 時間実行できます。Amazon SQS は、アカウントごとに最大 100 件のアクティブな再処理タスクをサポートしています。
-
メッセージの再処理タスクをキャンセルする場合は、キューの [詳細] ページで、[DLQ 再処理をキャンセル] を選択します。進行中のメッセージの再処理をキャンセルしても、移動先キューに正常に移動済みのメッセージは、移動先キューに残ります。
デッドレターキューの再処理に対するキューのアクセス許可の設定
ポリシーにアクセス許可を追加することで、ユーザーに特定のデッドレターキューアクションへのアクセスを許可できます。デッドレターキューの再処理に最低限必要なアクセス許可は次のとおりです。
最小限必要なアクセス権限 | 必要な API メソッド |
---|---|
メッセージの再処理を開始するには |
|
進行中のメッセージの再処理をキャンセルするには |
|
メッセージの移動状況を表示するには |
|
暗号化されたキューペア (デッドレターキューのあるソースキュー) のアクセス許可を設定するには
次の手順を使用して、デッドレターキュー (DLQ) リドライブの最小アクセス許可を設定します。
-
IAM コンソール (https://console.aws.amazon.com/iam/
) を開きます。 -
ナビゲーションペインで [ポリシー] を選択します。
-
新しいポリシーを作成し、次のアクセス許可を追加します。再処理オペレーションを実行する 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>
")。
-
-
-
アクセスポリシーは以下のようになります。
-
暗号化されていないキューペア (デッドレターキューのあるソースキュー) を使用してアクセス許可を設定するには
以下の手順に従って、標準の暗号化されていないデッドレターキュー (DLQ) の処理に必要な最小限のアクセス許可を設定します。最低限必要なアクセス許可は、デッドレターキューからの属性の受信、削除、取得、およびソースキューへの属性の送信です。
-
IAM コンソール (https://console.aws.amazon.com/iam/
) を開きます。 -
ナビゲーションペインで [ポリシー] を選択します。
-
新しいポリシーを作成し、次のアクセス許可を追加します。再処理オペレーションを実行する 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>
")。
-
アクセスポリシーは以下のようになります。
-
VPC エンドポイントアクセスコントロールでのデッドレターキューリドライブの使用
aws:sourceVpc
条件を使用して特定の VPCs へのキューアクセスを制限する場合、デッドレターキュー (DLQ) の再処理機能を有効にするには、 AWS サービスの例外を作成する必要があります。これは、メッセージの移動時に Amazon SQS サービスが VPC の外部で動作するためです。
DLQ 再処理オペレーションを許可するには、キューポリシーに aws:CalledViaLast
条件を追加します。これにより、Amazon SQS は直接アクセスの VPC 制限を維持しながら、ユーザーに代わって API コールを行うことができます。
VPC 制限付きアクセスと DLQ リドライブの両方を許可するには:
-
キューポリシーで
aws:CalledViaLast
条件を使用します。 -
ソースキューと DLQ の両方にポリシーを適用する
-
他のソースからの直接アクセスに関する 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」を参照してください。