Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何將我的跨帳戶 Amazon SQS 端點設定為 Amazon SNS 主題?
我想了解如何設定跨帳戶的 Amazon SQS 佇列,使其訂閱 Amazon SNS 主題,以接收來自不同 AWS 帳戶的通知。
簡短說明
以主題擁有者的身分從 Amazon Simple Notification Service (Amazon SNS) 主題建立訂閱。或者,以佇列擁有者的身分從 Amazon Simple Queue Service (Amazon SQS) 佇列建立訂閱。若要成功建立訂閱,兩種方式都必須具備適當的權限。
解決方法
**重要:**若要以佇列擁有者的身分進行訂閱,請確保位於帳戶 B 的 SNS 主題存取政策已具備適當的權限。這些權限允許帳戶 A 中的 SQS 佇列訂閱該 SNS 主題。若要以主題擁有者的身分進行訂閱,請確保帳戶 A 中的 SQS 佇列存取政策已具備適當的權限。帳戶 A 必須具備權限,允許 SNS 主題傳送訂閱確認的網址。
以佇列擁有者身分訂閱
若要以佇列擁有者訂閱佇列,請完成下列任務。
修改帳戶 B 中的 SNS 存取策略
請完成下列步驟:
- 使用帳戶 B 登入 Amazon SNS 主控台。
- 切換到適當的 AWS 區域。
- 選擇 Topics (主題),然後選取您的 SNS 主題。
- 選擇 Edit (編輯)。
- 展開 Access policy (存取政策) 區段。
- 將以下存取政策複製並貼上到 JSON 編輯器區段:
**注意:**將 AWS 帳戶和 SNS 主題 ARN 替換為您的值。{ "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "111122223333" }, "Action": "sns:Subscribe", "Resource": "arn:aws:sns:Region:account-id:topic-name" } ] } - 選擇 Save (儲存)。
作為佇列擁有者,請完成以下步驟,將帳戶 A 中的 SQS 佇列訂閱到帳戶 B 中的 SNS 主題:
- 使用帳戶 A 登入 Amazon SQS 主控台。
- 切換到適當的區域。
- 選擇 Queues (佇列),然後選取您的 SQS 佇列。
- 在 SNS subscriptions (SNS 訂閱) 區段中,選取 Subscribe to Amazon SNS topic (訂閱 Amazon SNS 主題)。
- 在 Specify an Amazon SNS topic available for this queue (指定可用於此佇列的 Amazon SNS 主題) 下,選取下拉式功能表。然後,選擇 Enter Amazon SNS topic ARN (輸入 Amazon SNS 主題 ARN)。
- 在 An Amazon SNS topic that can send notifications to an Amazon SQS queue (可以向 Amazon SQS 佇列傳送通知的 Amazon SNS 主題) 文字欄位中,輸入您的 SNS 主題 ARN。
- 選擇 Save (儲存)。
- 使用帳戶 B 登入 Amazon SNS 主控台。
- 選擇 Topics (主題),然後選取您的 SNS 主題。
- 若要驗證帳戶 B 中您的 SNS 主題的訂閱是否已確認,請查看 Subscriptions (訂閱) 區段。
**注意:**建立訂閱後,SQS 佇列存取政策中會新增一條陳述式。該政策允許 SNS 主題向您的佇列傳送訊息。該政策與以下內容類似:
{ "Sid": "topic-subscription-arn:aws:sns:Region:account-id:topic-name", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "SQS:SendMessage", "Resource": "arn:aws:sqs:Region:account-id:queue-name", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:sns:Region:account-id:topic-name" } } }
以主題擁有者身分訂閱
若要以主題擁有者身分訂閱佇列,請完成下列任務。
修改帳戶 A 中的 SQS 佇列
請完成下列步驟:
- 使用帳戶 A 登入 Amazon SQS 主控台。
- 切換到適當的區域。
- 選擇 Queues (佇列),然後選取您的 SQS 佇列。
- 選擇 Edit (編輯)。
- 展開 Access policy (存取政策) 區段。
- 在 JSON 編輯器中複製並貼上以下存取政策:
**注意:**將 SQS 佇列 ARN 和 SNS 主題 ARN 替換為您的值。{ "Sid": "Allow_SNS_topic_in_Account_B_to_Send_Message", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "SQS:SendMessage", "Resource": "arn:aws:sqs:Region:account-id:queue-name", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:sns:Region:account-id:topic-name" } } }
作為主題擁有者,請完成以下步驟,將另一個帳戶中的 SQS 佇列訂閱至您的 SNS 主題:
- 使用帳戶 B 登入 Amazon SNS 主控台。
- 切換到適當的區域。
- 選擇 Topics (主題),然後選取您的 SNS 主題。
- 在 Subscriptions (訂閱) 下,選取 Create subscription (建立訂閱)。
- 選擇 Protocol (通訊協定) 下拉式清單,然後選取 Amazon SQS。
- 選取 Create subscription (建立訂閱)。
- 若要確認訂閱,請登入帳戶 A 中的 Amazon SQS 主控台。
- 選擇 Queues (佇列),然後選取已訂閱的 SQS 佇列。
- 選擇 Send and receive messages (傳送和接收訊息)。
- 選取 Poll for messages (輪詢訊息)。來自 Amazon SNS 的訊息會顯示在 Messages (訊息) 區段。
- 選取訊息 ID。在 SubscribeURL 下,複製引號內的網址。
- 若要查看帶有 SubscriptionArn 的 ConfirmSubscriptionResult,請將此網址連結貼上到您的網頁瀏覽器中,然後按 Enter 鍵。
- 使用帳戶 B 登入 Amazon SNS 主控台。
- 選擇 Topics (主題),然後選取您的 SNS 主題。
- 若要驗證訂閱是否已確認,請查看 Subscriptions (訂閱) 下的訂閱狀態。訂閱狀態從待確認改為已確認。
**注意:**由於訂閱歸 SNS 帳戶所有,因此您無法在 SQS 主控台中看到該訂閱的清單。
疑難排解提示
若要對佇列問題進行疑難排解,請根據您的情況完成以下任務。
我的 SQS 佇列已加密
使用 AWS 金鑰管理服務 (AWS KMS) 金鑰加密的 SQS 佇列可以限制帳戶之間的存取。如果您沒有為加密佇列定義金鑰,則佇列將使用 AWS KMS key (SSE-KMS) 作為預設金鑰。此金鑰僅允許同一帳戶中的主體存取。如需詳細資訊,請參閱Amazon SQS 中的靜態加密。
若要存取使用 SSE-KMS 的加密佇列,請建立客戶自管 AWS KMS key。然後,在金鑰政策中新增允許 SNS 服務進行 AWS KMS API 呼叫的權限。
若要允許 SNS 服務使用 GenerateDataKey 和 Decrypt API 方法,請將下列陳述式新增至客戶自管金鑰政策:
{ "Effect": "Allow", "Principal": { "Service": "sns.amazonaws.com" }, "Action": [ "kms:GenerateDataKey*", "kms:Decrypt" ], "Resource": "*" }
如需詳細資訊,請參閱設定佇列 (主控台) 的伺服器端加密 (SSE)。
當我在 Amazon SNS 主控台中建立訂閱時,我的訂閱在 SNS 主控台中仍處於待處理狀態
若要對此問題進行疑難排解,請執行下列步驟:
-
刪除您的訂閱。接著,從前述步驟的第 13 步開始進行。
-
若要使用 AWS Command Line Interface (AWS CLI) 輪詢您的 SQS 佇列,請執行下列命令來擷取 SubscriptionURL:
aws sqs receive-message --queue-url https**:**//sqs.us-east-1.amazonaws.com/80398EXAMPLE/MyQueue --attribute-names All --message-attribute-names All --max-number-of-messages 10**注意:**如果您在執行 AWS CLI 命令時收到錯誤,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
-
將此網址複製並貼到瀏覽器中以確認訂閱。確保將佇列網址替換為您自己的。
當我複製並貼上我的 SNS 主題存取政策時,收到「無法設定主題存取政策」錯誤訊息
當我複製並貼上我的 SNS 主題存取政策時,我收到以下錯誤:
"Couldn't set topic access policy.Error code: InvalidParameter - Error message: An error occurred while setting the attribute access policy.Invalid parameter: Policy Error: null."
使用以下步驟對錯誤進行疑難排解:
- 為確保您的政策語法正確,請將存取政策複製並貼上到 JSON 驗證器工具網站。
- 檢查您的存取政策,確保沒有重複的陳述式。請確保在第一個陳述式 ID 後面有加上逗號。
我的訂閱 ID 在 Amazon SNS 主控台中顯示為「已刪除」
在 SNS 和 SQS 的跨帳戶整合中,訂閱的擁有者是由訂閱建立的來源帳戶決定的。
如果訂閱是從 SQS 所在的帳戶建立的,則 SQS 為該訂閱的擁有者。如果訂閱是從 SNS 所在的帳戶建立的,則 SNS 為該訂閱的擁有者。
如果您從非訂閱擁有者的帳戶呼叫取消訂閱 API,該訂閱將進入已刪除狀態。或者,如果您嘗試從主控台刪除訂閱,該訂閱也會進入已刪除狀態。當 SNS 主題訂閱處於已刪除狀態時,擁有該訂閱的帳戶無法為相同端點重新訂閱該主題。
48 小時後,Amazon SNS 將清除已刪除的訂閱,並且擁有該訂閱的帳戶可以重新訂閱同一端點的主題。
若要在 48 小時之前重新訂閱,請從擁有 SNS 主題的 AWS 帳戶呼叫訂閱 API 來重新建立訂閱。
最佳實務
驗證您對 SNS 訂閱的 SQS 佇列身分。透過此組態,只有主題擁有者和訂閱擁有者可以取消 SQS 佇列對 SNS 主題的訂閱。
相關資訊
將 Amazon SNS 訊息傳送到不同帳戶中的 Amazon SQS 佇列
允許將 Amazon Simple Storage Service (Amazon S3) 事件通知發佈到主題
嘗試在 Amazon SNS 主題新增訂閱者時,如何解決授權錯誤?
了解資料金鑰重複使用期限Amazon Simple Notification Service (Amazon SNS) Amazon Simple Queue Service (Amazon SQS)
- 語言
- 中文 (繁體)

相關內容
- 已提問 1 年前
