本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
了解如何在 Amazon SQS 中設定無效字母佇列再驅動
使用無效字母佇列再驅動,將未使用的訊息從無效字母佇列移至另一個目的地進行處理。根據預設,無效字母佇列再驅動會將訊息從無效字母佇列移至來源佇列。不過,如果兩種佇列類型相同,您也可以將任何其他佇列設定為再驅動目的地。例如,如果無效字母佇列是 FIFO 佇列,則再驅動目的地佇列也必須是 FIFO 佇列。此外,您可以設定再驅動速度,以設定 Amazon SQS 移動訊息的速率。
注意
將訊息從 FIFO 佇列移至 FIFO DLQ 時,原始訊息的重複資料刪除 ID 將會取代為原始訊息的 ID。這是為了確保 DLQ 重複資料刪除功能不會阻止儲存共用重複資料刪除 ID 的兩則獨立訊息。
無效字母佇列會以收到訊息的順序重新驅動訊息,從最舊的訊息開始。但是,目的地佇列會根據接收的順序擷取重新推動的訊息,以及來自其他程序的新訊息。例如,如果生產者同時從無效字母佇列接收重新驅動的訊息時,將訊息傳送到來源 FIFO 佇列,則重新驅動的訊息會與生產者的新訊息交集。
注意
再驅動任務會重設保留期間。所有重新驅動訊息都會被視為具有新訊息,messageID
並enqueueTime
指派給重新驅動訊息。
使用 Amazon SQS API 為現有標準佇列設定無效字母佇列再驅動
您可以使用 StartMessageMoveTask
、 ListMessageMoveTasks
和 CancelMessageMoveTask
API 動作來設定無效字母佇列再驅動:
API 動作 | 描述 |
---|---|
啟動非同步工作,將訊息從指定的來源佇列移至指定的目的地佇列。 |
|
取得特定來源佇列下的最新訊息移動任務 (最多 10 個)。 |
|
取消指定的訊息移動任務。只有當目前狀態為 RUNNING 時,才能取消訊息移動。 |
使用 Amazon SQS 主控台為現有標準佇列設定無效字母佇列再驅動
在 https://console.aws.amazon.com/sqs/
開啟 Amazon SQS 主控台。 -
在導覽窗格中,選擇 Queues (佇列)。
-
選擇您已設定為無效字母佇列的佇列名稱。
-
選擇啟動 DLQ 再驅動。
-
在再驅動組態下,針對訊息目的地,執行下列任一項作業:
-
若要將訊息再驅動到其來源佇列,請選擇再驅動至來源佇列。
-
若要將訊息再驅動到其他佇列,請選擇再驅動至自訂目的地。然後,輸入現有目的地佇列的 Amazon Resource Name (ARN)。
-
-
在速度控制設定下,選擇下列其中一項:
-
系統最佳化 - 以每秒最大訊息數再驅動無效字母佇列訊息。
-
自訂最大速度 - 以每秒自訂的最大訊息速率再驅動無效字母佇列訊息。允許的最大速率為每秒 500 則訊息。
-
建議從自訂最大速度的較小值開始,並驗證來源佇列不會被訊息淹沒。從那裡開始,逐漸提高自訂最大速度值,並繼續監控來源佇列的狀態。
-
-
-
完成設定無效字母佇列再驅動時,請選擇再驅動訊息。
重要
Amazon SQS 不支援在從無效字母佇列再驅動訊息的同時篩選和修改訊息。
無效字母佇列再驅動任務最多可執行 36 小時。Amazon SQS 支援每個帳戶最多有 100 個作用中再驅動任務。
-
如果您要取消訊息再驅動任務,請在佇列的詳細資料頁面上,選擇取消 DLQ 再驅動。取消進行中的訊息再驅動時,任何已成功移至其移動目的地佇列的訊息都會保留在目的地佇列中。
設定無效字母佇列再驅動的佇列許可
您可以將許可新增至政策,讓使用者存取特定無效字母佇列動作。無效字母佇列再驅動所需的最低許可如下:
最低許可 | 必要的 API 方法 |
---|---|
若要啟動訊息再驅動 |
|
若要取消進行中的訊息再驅動 |
|
若要顯示訊息移動狀態 |
|
若要設定加密佇列配對 (具有無效字母佇列的來源佇列) 的許可
使用下列步驟來設定無效字母佇列 (DLQ) 再驅動的最低許可:
-
前往 https://console.aws.amazon.com/iam/
開啟 IAM 主控台。 -
在導覽窗格中,選取 Policies (政策)。
-
建立新的政策並新增下列許可。將政策連接至將執行再驅動操作的 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) 所需的最低許可。必要的最低許可是從無效字母佇列接收、刪除和取得屬性,以及將屬性傳送至來源佇列。
-
前往 https://console.aws.amazon.com/iam/
開啟 IAM 主控台。 -
在導覽窗格中,選取 Policies (政策)。
-
建立新的政策並新增下列許可。將政策連接至將執行再驅動操作的 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的佇列存取時,您需要對 AWS 服務進行例外處理,以啟用無效字母佇列 (DLQ) 再驅動功能。這是因為在移動訊息時,Amazon SQS 服務會在 VPC 外部運作。
若要允許 DLQ 再驅動操作,請將 aws:CalledViaLast
條件新增至佇列政策。這可讓 Amazon SQS 代表您進行 API 呼叫,同時維持直接存取的 VPC 限制。
若要同時允許 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 政策元素:條件。