本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
訂閱 Amazon SNS主題的 Amazon SQS佇列
若要讓 Amazon SNS主題將訊息傳送至 Amazon SQS佇列,請執行下列其中一項操作:
-
使用 Amazon SQS主控台
來簡化程序。如需詳細資訊,請參閱 Amazon Simple SQSQueue Service 開發人員指南 中的訂閱 Amazon 佇列至 Amazon SNS主題。 -
請遵循下列步驟:
若要了解如何設定主題以傳送訊息至不同 AWS帳戶中的佇列,請參閱 將 Amazon SNS 訊息傳送至不同帳戶中的 Amazon SQS佇列。
若要查看建立將訊息傳送至兩個佇列之主題的 AWS CloudFormation 範本,請參閱 使用 將 Amazon 自動化SNS至 Amazon SQS 訊息 AWS CloudFormation。
步驟 1:取得佇列和主題ARN的
訂閱主題的佇列時,您需要佇列的 副本ARN。同樣地,在授予主題傳送訊息至佇列的許可時,您需要主題的 副本ARN。
若要取得佇列 ARN,您可以使用 Amazon SQS主控台或 GetQueueAttributesAPI動作。
從 Amazon ARN SQS主控台取得佇列
登入 AWS Management Console 並在 開啟 Amazon SQS主控台https://console.aws.amazon.com/sqs/
。 -
選取ARN您要取得之佇列的方塊。
-
在詳細資訊區段中,複製 ARN值,以便您用來訂閱 Amazon SNS主題。
若要取得主題 ARN,您可以使用 Amazon SNS主控台、 sns-get-topic-attributes
命令或 GetQueueAttributes
API動作。
從 Amazon ARN SNS主控台取得主題
登入 Amazon SNS主控台
。 -
在導覽面板上,選擇ARN您要取得的主題。
-
從詳細資訊區段中,複製 ARN值,以便您用來授予 Amazon SNS主題將訊息傳送至佇列的許可。
步驟 2:允許 Amazon SNS主題傳送訊息至 Amazon SQS佇列
若要讓 Amazon SNS主題能夠傳送訊息至佇列,您必須在佇列上設定允許 Amazon SNS主題執行sqs:SendMessage
動作的政策。
在您訂閱佇列到主題之前,您需要主題和佇列。如果您尚未建立主題或佇列,請現在建立。如需詳細資訊,請參閱 建立主題,並參閱 Amazon Queue Service 開發人員指南中的建立佇列。
若要在佇列上設定政策,您可以使用 Amazon SQS主控台或 SetQueueAttributesAPI動作。開始之前,請確定您擁有要允許 傳送訊息至佇列之主題ARN的 。如果您要訂閱佇列至多個主題,則政策必須為每個主題包含一個 Statement
元素。
使用 Amazon SQS主控台在佇列上設定 SendMessage 政策
登入 AWS Management Console 並在 開啟 Amazon SQS主控台https://console.aws.amazon.com/sqs/
。 -
選取您要設定其政策之佇列的方塊,選擇 Access policy (存取政策) 索引標籤,然後選擇 Edit (編輯)。
-
在存取政策區段中,定義誰可以存取您的佇列。
-
新增條件以允許用於主題的動作。
-
Principal
設定為 Amazon SNS服務,如以下範例所示。 -
使用
aws:SourceArn
或者aws:SourceAccount
全域條件金鑰,以防止混淆代理人案例。若要使用這些條件索引鍵,請將 值設定為主題ARN的 。若您的佇列訂閱了多個主題,則可改用aws:SourceAccount
。
例如,下列政策允許 MyTopic 傳送訊息至 MyQueue。
{ "Statement": [ { "Effect": "Allow", "Principal": { "Service": "sns.amazonaws.com" }, "Action": "sqs:SendMessage", "Resource": "arn:aws:sqs:us-east-2:123456789012:MyQueue", "Condition": { "ArnEquals": { "aws:SourceArn": "arn:aws:sns:us-east-2:123456789012:MyTopic" } } } ] }
-
步驟 3:訂閱 Amazon SNS主題的佇列
若要透過主題將訊息傳送至佇列,您必須訂閱 Amazon SNS主題的佇列。您可以依佇列的 來指定佇列ARN。若要訂閱主題,您可以使用 Amazon SNS主控台、 sns-subscribe
CLI命令或 Subscribe
API動作。開始之前,請確定您擁有要訂閱之佇列ARN的 。
登入 Amazon SNS主控台
。 -
在導覽面板上,選擇 Topics (主題)。
-
在 Topics (主題) 頁面上,選擇主題。
-
在 上
MyTopic
頁面中,在訂閱頁面中,選擇建立訂閱。 -
在建立訂閱頁面上,於詳細資訊區段中,執行以下作業:
-
驗證主題 ARN。
-
針對通訊協定 ,選擇 Amazon SQS。
-
針對端點 ,輸入 Amazon SQS佇列ARN的 。
-
選擇 Create Subscription (建立訂閱)。
確認訂閱之後,您新訂閱的 Subscription ID (訂閱 ID) 就會顯示其訂閱 ID。如果佇列的擁有者建議訂閱,訂閱會自動確認並且訂閱應該立即啟用。
通常,您會訂閱您自己的佇列到您帳戶中您自己的主題。不過,您也可以從不同帳戶訂閱佇列到您的主題。如果建立訂閱的使用者不是佇列的擁有者 (例如,帳戶 A 的使用者訂閱帳戶 B 的佇列到帳戶 A 中的主題),訂閱必須經過確認。如需有關訂閱不同帳戶的佇列和確認訂閱的詳細資訊,請參閱 將 Amazon SNS 訊息傳送至不同帳戶中的 Amazon SQS佇列。
-
步驟 4:提供使用者適當主題和佇列動作的許可
您應該使用 AWS Identity and Access Management (IAM) 只允許適當的使用者發佈至 Amazon SNS主題,並從 Amazon SQS佇列讀取/刪除訊息。如需有關控制IAM使用者主題和佇列動作的詳細資訊,請參閱 Amazon Simple Queue Service 開發人員指南中的 搭配 Amazon 使用身分型政策 SNS和 Amazon 中的身分和存取管理SQS。
控制對主題或佇列的存取有兩種方式:
-
將政策新增至IAM使用者或群組 。提供使用者主題或佇列的許可的最簡單方式,是建立群組和新增適當的政策到群組,然後新增使用者到該群組。從群組新增和移除使用者比起追蹤對個別使用者設定了哪些政策要來得簡單多。
-
新增政策到主題或佇列。如果您想要將主題或佇列的許可授予另一個 AWS 帳戶,唯一的方法是新增一個政策,該政策將 AWS 帳戶 您想要授予許可的主體作為其主體。
對於大多數案例,您應使用第一個方式 (透過新增或移除適當使用者到群組,來套用政策到群組和管理許可)。如果您需要提供許可給其他帳戶中的使用者,您應使用第二個方式。
將政策新增至IAM使用者或群組
如果您已將下列政策新增至IAM使用者或群組,您會授予該使用者或該群組的成員對主題 執行sns:Publish
動作的許可 MyTopic。
{ "Statement": [ { "Effect": "Allow", "Action": "sns:Publish", "Resource": "arn:aws:sns:us-east-2:123456789012:MyTopic" } ] }
如果您已將下列政策新增至IAM使用者或群組,您會授予該使用者或該群組的成員許可,以對佇列 MyQueue1 sqs:ReceiveMessage
和 MyQueue2 執行 和 sqs:DeleteMessage
動作。
{ "Statement": [ { "Effect": "Allow", "Action": [ "sqs:ReceiveMessage", "sqs:DeleteMessage" ], "Resource": [ "arn:aws:sqs:us-east-2:123456789012:MyQueue1", "arn:aws:sqs:us-east-2:123456789012:MyQueue2" ] } ] }
新增政策到主題或佇列
下列範例政策顯示如何提供其他帳戶主題和佇列的許可。
注意
當您授予帳戶中資源的另一個 AWS 帳戶 存取權時,您也會授予對該資源具有管理員層級存取 (萬用字元存取) 許可IAM的使用者。其他帳戶中的所有其他IAM使用者都會自動拒絕存取您的資源。如果您想要讓該 AWS 帳戶 特定IAM使用者存取您的資源,帳戶或具有管理員層級存取權IAM的使用者必須將資源的許可委派給這些IAM使用者。如需跨帳戶委派的詳細資訊,請參閱 使用IAM指南 中的啟用跨帳戶存取。
如果您已將下列政策新增至帳戶 123456789012 MyTopic 中的主題,則您會授予帳戶 111122223333 許可,以對該主題執行sns:Publish
動作。
{ "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "111122223333" }, "Action": "sns:Publish", "Resource": "arn:aws:sns:us-east-2:123456789012:MyTopic" } ] }
如果您已將下列政策新增至帳戶 123456789012 MyQueue 中的佇列,則您會授予帳戶 111122223333 在該佇列上執行 sqs:ReceiveMessage
和 sqs:DeleteMessage
動作的許可。
{ "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "111122223333" }, "Action": [ "sqs:DeleteMessage", "sqs:ReceiveMessage" ], "Resource": [ "arn:aws:sqs:us-east-2:123456789012:MyQueue" ] } ] }
步驟 5:測試主題的佇列訂閱
您可以透過發佈至主題並檢視主題傳送至佇列的訊息,來測試主題的佇列。
使用 Amazon SNS主控台發佈至主題
-
使用 AWS 帳戶 或 IAM使用者的憑證,並具有發佈至主題的許可,請登入 AWS Management Console 並在 開啟 Amazon SNS主控台https://console.aws.amazon.com/sns/
。 -
在導覽面板上,選擇主題並選擇 Publish to Topic (發佈至主題)。
-
在 Subject (主旨) 方塊中,輸入主旨 (例如,
Testing publish to queue
),在 Message (訊息) 方塊中,輸入一些文字 (例如,Hello world!
),並選擇 Publish Message (發佈訊息)。下列訊息顯示:您的訊息已成功發佈。
使用 Amazon SQS主控台檢視主題的訊息
-
使用 AWS 帳戶 或 IAM使用者的憑證,並具有在佇列中檢視訊息的許可,請登入 AWS Management Console 並在 開啟 Amazon SQS主控台https://console.aws.amazon.com/sqs/
。 -
選擇已訂閱至主題的 queue (佇列)。
-
選擇 Send and receive messages (傳送和接收訊息),然後選擇 Poll for messages (訊息輪詢)。類型為 Notification (通知) 的訊息隨即出現。
-
在 Body (內文) 欄位中,選擇 More Details (更多詳細資訊)。訊息詳細資訊方塊包含JSON文件,其中包含您發佈至主題的主旨和訊息。訊息看起來與下列JSON文件類似。
{ "Type" : "Notification", "MessageId" : "63a3f6b6-d533-4a47-aef9-fcf5cf758c76", "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic", "Subject" : "Testing publish to subscribed queues", "Message" : "Hello world!", "Timestamp" : "2012-03-29T05:12:16.901Z", "SignatureVersion" : "1", "Signature" : "EXAMPLEnTrFPa3...", "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem", "UnsubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-west-2:123456789012:MyTopic:c7fe3a54-ab0e-4ec2-88e0-db410a0f2bee" }
-
選擇 Close (關閉)。您已成功發佈至主題,其會傳送通知訊息至佇列。