

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 向 Amazon SQS 佇列發出 Amazon SNS 通知以進行非同步處理 Amazon SQS
<a name="sns-sqs-as-subscriber"></a>

[Amazon SNS](https://aws.amazon.com/sns/) 與 Amazon Simple Queue Service (Amazon SQS) 緊密合作。這些服務提供開發人員不同優勢。Amazon SNS 可透過「推播」機制讓應用程式傳送分秒必爭的訊息給多個訂閱者，免除定期檢查或「輪詢」更新的需要。Amazon SQS 是一項訊息佇列服務，由所發佈的應用程式用來透過輪詢模式來交換訊息，並且可用來斷開傳送元件和接收元件的連結，而無需每個元件都同時可供使用。透過一起使用 Amazon SNS 和 Amazon SQS，訊息即可交付到需要立即事件通知的應用程式，並且也會保存在 Amazon SQS 佇列中以便稍後供其他應用程式處理使用。

當您訂閱 Amazon SQS 佇列到 Amazon SNS 主題時，您可以發佈訊息到主題，而 Amazon SNS 會傳送 Amazon SQS 訊息到訂閱的佇列。Amazon SQS 訊息包含已發佈至主題的主旨和訊息，同時包含有關 JSON 文件中訊息的中繼資料。Amazon SQS 訊息將看起來類似以下 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"
}
```

# 為 Amazon SQS 佇列訂閱 Amazon SNS 主題
<a name="subscribe-sqs-queue-to-sns-topic"></a>

若要啟用 Amazon SNS 主題將訊息傳送到 Amazon SQS 佇列，請選擇下列其中一項：
+ 使用 [Amazon SQS 主控台](https://console.aws.amazon.com/sqs/)，這簡化了這個過程。如需詳細資訊，請參閱 *Amazon Simple Queue Service 開發人員指南*中的[訂閱 Amazon SNS 主題的 Amazon SQS 佇列](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-subscribe-queue-sns-topic.html)。
+ 使用下列步驟：

  1. [取得您要傳送訊息的目標佇列的 Amazon Resource Name (ARN)，以及您要訂閱佇列的主題。](#SendMessageToSQS.arn)

  1. [將 `sqs:SendMessage` 許可提供給 Amazon SNS 主題，以便其可以將訊息傳送至佇列。](#SendMessageToSQS.sqs.permissions)

  1. [訂閱佇列至 Amazon SNS 主題](#SendMessageToSQS.subscribe)

  1. [提供 IAM 使用者或 AWS 帳戶 適當的許可，以發佈至 Amazon SNS 主題，並讀取來自 Amazon SQS 佇列的訊息。](#SendMessageToSQS.iam.permissions)

  1. [將訊息發佈至主題並讀取來自佇列的訊息以進行測試。](#SendMessageToSQS.test)

若要了解如何設定主題以傳送訊息至不同 AWS帳戶中的佇列，請參閱 [傳送 Amazon SNS 訊息至其他帳戶中的 Amazon SQS 佇列](sns-send-message-to-sqs-cross-account.md)。

若要查看建立主題以傳送訊息至兩個佇列的 CloudFormation 範本，請參閱 [使用 自動化 Amazon SNS 到 Amazon SQS 訊息 AWS CloudFormation](SendMessageToSQS.cloudformation.md)。

## 步驟 1：取得佇列和主題的 ARN
<a name="SendMessageToSQS.arn"></a>

訂閱佇列到您的主題時，您需要一份佇列的 ARN 副本。同樣地，提供許可給主題以傳送訊息至佇列時，您需要一份主題的 ARN 副本。

若要取得佇列 ARN，您可以使用 Amazon SQS 主控台或 [GetQueueAttributes](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/Query_QueryGetQueueAttributes.html) API 動作。

**從 Amazon SQS 主控台取得佇列 ARN**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/sqs/](https://console.aws.amazon.com/sqs/) 的 Amazon SQS 主控台。

1. 選取您要取得其 ARN 之佇列的方塊。

1. 從 **Details** (詳細資訊) 區段，複製 ARN 值，以便您可以用它訂閱到 Amazon SNS 主題。

若要取得主題 ARN，您可以使用 Amazon SNS 主控台、`[sns-get-topic-attributes](https://docs.aws.amazon.com/cli/latest/reference/sns/get-topic-attributes.html)` 命令或 `[GetQueueAttributes](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/Query_QueryGetQueueAttributes.html)` API 動作。

**從 Amazon SNS 主控台取得主題 ARN**

1. 登入 [Amazon SNS 主控台](https://console.aws.amazon.com/sns/home)。

1. 在導覽面板上，選擇您要取得 ARN 的主題。

1. 從 **Details** (詳細資訊) 區段，複製 **ARN** 值，以便您可以用它將許可提供給 Amazon SNS 主題以將訊息傳送至佇列。

## 步驟 2：將許可提供給 Amazon SNS 主題，以將訊息傳送至 Amazon SQS 佇列。
<a name="SendMessageToSQS.sqs.permissions"></a>

為了讓 Amazon SNS 主題能夠傳送訊息至佇列，您必須對佇列設定政策，允許 Amazon SNS 主題執行 `sqs:SendMessage` 動作。

在您訂閱佇列到主題之前，您需要主題和佇列。如果您尚未建立主題或佇列，請現在建立。如需詳細資訊，請參閱 [建立主題](sns-create-topic.md)，並參閱 *Amazon Queue Service 開發人員指南*中的[建立佇列](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/step-create-queue.html)。

若要取得有關佇列的政策，您可以使用 Amazon SQS 主控台或 [SetQueueAttributes](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/Query_QuerySetQueueAttributes.html) API 動作。開始之前，請確定您擁有您想要允許傳送訊息至佇列之主題的 ARN。如果您要訂閱佇列至多個主題，則政策必須為每個主題包含一個 `Statement` 元素。

**使用 Amazon SQS 主控台設定佇列的 SendMessage 政策**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/sqs/](https://console.aws.amazon.com/sqs/) 的 Amazon SQS 主控台。

1. 選取您要設定其政策之佇列的方塊，選擇 **Access policy** (存取政策) 索引標籤，然後選擇 **Edit** (編輯)。

1. 在**存取政策**區段中，定義誰可以存取您的佇列。
   + 新增條件以允許用於主題的動作。
   + 將 `Principal` 設定為 Amazon SNS 服務，如下列範例所示。
   + 使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 或者 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 全域條件金鑰，以防止[混淆代理人](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)案例。如要使用這些條件金鑰，請將值設定為主題的 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 主題
<a name="SendMessageToSQS.subscribe"></a>

若要透過主題傳送訊息至佇列，您必須訂閱佇列至 Amazon SNS 主題。您按照其 ARN 指定佇列。若要訂閱主題，您可以使用 Amazon SNS 主控台、`[sns-subscribe](https://docs.aws.amazon.com/cli/latest/reference/sns/subscribe.html)` CLI 命令或 `[Subscribe](https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html)` API 動作。開始之前，請確定您擁有想要訂閱佇列的 ARN。

1. 登入 [Amazon SNS 主控台](https://console.aws.amazon.com/sns/home)。

1. 在導覽面板上，選擇 **Topics (主題)**。

1. 在 **Topics** (主題) 頁面上，選擇主題。

1. 在 ***MyTopic*** (我的主題) 頁面上，於 **Subscriptions** (訂閱) 頁面中，選擇 **Create subscription** (建立訂閱)。

1. 在**建立訂閱**頁面上，於**詳細資訊**區段中，執行以下作業：

   1. 驗證 **Topic ARN** (主題 ARN)。

   1. 在 **Protocol** (通訊協定) 中，選擇**Amazon SQS**。

   1. 針對 **Endpoint** (端點)，輸入 Amazon SQS 佇列的 ARN。

   1. 選擇 **Create Subscription** (建立訂閱)。

   確認訂閱之後，您新訂閱的 **Subscription ID** (訂閱 ID) 就會顯示其訂閱 ID。如果佇列的擁有者建議訂閱，訂閱會自動確認並且訂閱應該立即啟用。

   通常，您會訂閱您自己的佇列到您帳戶中您自己的主題。不過，您也可以從不同帳戶訂閱佇列到您的主題。如果建立訂閱的使用者不是佇列的擁有者 (例如，帳戶 A 的使用者訂閱帳戶 B 的佇列到帳戶 A 中的主題)，訂閱必須經過確認。如需有關訂閱不同帳戶的佇列和確認訂閱的詳細資訊，請參閱 [傳送 Amazon SNS 訊息至其他帳戶中的 Amazon SQS 佇列](sns-send-message-to-sqs-cross-account.md)。

## 步驟 4：提供使用者適當主題和佇列動作的許可
<a name="SendMessageToSQS.iam.permissions"></a>

您應該使用 AWS Identity and Access Management (IAM) 只允許適當的使用者發佈至 Amazon SNS 主題，並從 Amazon SQS 佇列讀取/刪除訊息。如需控制 IAM 使用者之主題和佇列動作的詳細資訊，請參閱 [使用以身分為基礎的政策搭配 Amazon SNS](sns-using-identity-based-policies.md)，以及位於 Amazon Simple Queue Service 開發人員指南中[Amazon SQS 中的 Identity and Access Management](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/UsingIAM.html)。

控制對主題或佇列的存取有兩種方式：
+ [新增政策到 IAM 使用者或群組](#SendMessageToSQS.iam.permissions.user)。提供使用者主題或佇列的許可的最簡單方式，是建立群組和新增適當的政策到群組，然後新增使用者到該群組。從群組新增和移除使用者比起追蹤對個別使用者設定了哪些政策要來得簡單多。
+ [新增政策到主題或佇列](#SendMessageToSQS.iam.permissions.resource)。如果您想要將主題或佇列的許可授予另一個 AWS 帳戶，唯一的方法是新增 政策做為 AWS 帳戶 您想要授予許可的委託人。

對於大多數案例，您應使用第一個方式 (透過新增或移除適當使用者到群組，來套用政策到群組和管理許可)。如果您需要提供許可給其他帳戶中的使用者，您應使用第二個方式。

### 新增政策到 IAM 使用者或群組
<a name="SendMessageToSQS.iam.permissions.user"></a>

如果已新增下列政策到 IAM 使用者或群組，您要提供該使用者或該群組的成員許可，以對主題取得 MyTopic 執行 `sns:Publish` 動作。

```
{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sns:Publish",
      "Resource": "arn:aws:sns:us-east-2:123456789012:MyTopic"
    }
  ]
}
```

如果您已新增下列政策到 IAM 使用者或群組，您要提供該使用者或該群組的成員許可，以對佇列 MyQueue1 和 MyQueue2 執行 `sqs:ReceiveMessage` 和 `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"
      ]
    }
  ]
}
```

### 新增政策到主題或佇列
<a name="SendMessageToSQS.iam.permissions.resource"></a>

下列範例政策顯示如何提供其他帳戶主題和佇列的許可。

**注意**  
當您授予帳戶中資源的另一個 AWS 帳戶 存取權時，您也會授予對該資源具有管理員層級存取 （萬用字元存取） 許可的 IAM 使用者。其他帳戶中的所有其他 IAM 使用者都會自動拒絕存取您的資源。如果您想要提供該 AWS 帳戶 中特定 IAM 使用者對您資源的存取權，具有管理員層級權限的帳戶或 使用者必須將資源的許可委派給那些 IAM 使用者。如需跨帳戶委派的詳細資訊，請參閱[使用 IAM 指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/Delegation.html)中的*啟用跨帳戶存取權*。

如果您已新增下列政策到帳戶 123456789012 中的主題「我的主題」，您要提供帳戶 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：測試主題的佇列訂閱
<a name="SendMessageToSQS.test"></a>

您可以透過發佈至主題並檢視主題傳送至佇列的訊息，來測試主題的佇列。

**使用 Amazon SNS 主控台發佈至主題**

1. 使用具有發佈至 主題許可的 AWS 帳戶 或 IAM 使用者的登入資料，登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/sns/](https://console.aws.amazon.com/sns/home) 的 Amazon SNS 主控台。

1. 在導覽面板上，選擇主題並選擇 **Publish to Topic** (發佈至主題)。

1. 在 **Subject** (主旨) 方塊中，輸入主旨 (例如，**Testing publish to queue**)，在 **Message** (訊息) 方塊中，輸入一些文字 (例如，**Hello world\$1**)，並選擇 **Publish Message** (發佈訊息)。下列訊息顯示：您的訊息已成功發佈。

**使用 Amazon SQS 主控台檢視來自主題的訊息**

1. 使用 AWS 帳戶 或 IAM 使用者的登入資料搭配檢視佇列中訊息的許可，登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/sqs/](https://console.aws.amazon.com/sqs/) 的 Amazon SQS 主控台。

1. 選擇已訂閱至主題的 **queue** (佇列)。

1. 選擇 **Send and receive messages** (傳送和接收訊息)，然後選擇 **Poll for messages** (訊息輪詢)。類型為 **Notification** (通知) 的訊息隨即出現。

1. 在 **Body** (內文) 欄位中，選擇 **More Details** (更多詳細資訊)。**Message 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"
   }
   ```

1. 選擇 **Close** (關閉)。您已成功發佈至主題，其會傳送通知訊息至佇列。

# 使用 自動化 Amazon SNS 到 Amazon SQS 訊息 AWS CloudFormation
<a name="SendMessageToSQS.cloudformation"></a>

CloudFormation 可讓您使用範本檔案，將資源集合 AWS 建立並設定為單一單位。本節含有可輕鬆部署發佈至佇列之主題的範例範本。範本為您執行所有設定步驟，建立兩個佇列，建立訂閱佇列的主題，新增政策至佇列，以便主題可以傳送訊息至佇列，以及建立 IAM 使用者和群組，以控制對那些資源的存取。

如需使用 CloudFormation 範本部署 AWS 資源的詳細資訊，請參閱*CloudFormation 《 使用者指南*[》中的入門](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/GettingStarted.Walkthrough.html)。

## 使用 CloudFormation 範本在 中設定主題和佇列 AWS 帳戶
<a name="SendMessageToSQS.cloudformation.iam"></a>

範例範本使用適當的許可，為一個 IAM 群組的成員，建立可將訊息傳送至兩個 Amazon SQS 佇列的 Amazon SNS 主題，以發佈至主題而另一個讀取來自佇列的訊息。範本也建立新增至各個群組的 IAM 使用者。

您可以將範本內容複製到檔案中。您也可以從 [AWS CloudFormation 範本頁面](https://aws.amazon.com/cloudformation/aws-cloudformation-templates/)下載範本。在範本頁面上，選擇**依 AWS 服務瀏覽範例範本**，然後選擇 **Amazon Simple Queue Service**。

MySNSTopic 是設定為發佈兩個已訂閱的端點，其為兩個 Amazon SQS 佇列 (MyQueue1 和 MyQueue2)。MyPublishTopicGroup 是 IAM 群組，其成員具有使用 [Publish](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html) (發佈) API 動作或 [sns-publish](https://docs.aws.amazon.com/cli/latest/reference/sns/publish.html) 命令發佈至 MySNSTopic 的許可。範本建立 IAM 使用者 MyPublishUser 和 MyQueueUser，並提供他們登入設定檔和存取金鑰。使用此範本建立堆疊的使用者，指定登入設定檔的密碼做為輸入參數。範本建立兩個 IAM 使用者的存取金鑰，分別為 MyPublishUserKey 和 MyQueueUserKey。AddUserToMyPublishTopicGroup 將 MyPublishUser 新增至 MyPublishTopicGroup，以便使用者將擁有指派至群組的許可。

MyRDMessageQueueGroup 是 IAM 群組，其成員具有使用 [ReceiveMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/Query_QueryReceiveMessage.html) 和 [DeleteMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/Query_QueryDeleteMessage.html) API 動作讀取和刪除來自兩個 Amazon SQS 佇列之訊息的許可。AddUserToMyQueueGroup 將 MyQueueUser 新增至 MyRDMessageQueueGroup，以便使用者將擁有指派至群組的許可。MyQueuePolicy 指派 MySNSTopic 的許可，以發佈其通知至兩個佇列。

下列清單顯示 CloudFormation 範本內容。

```
{
  "AWSTemplateFormatVersion" : "2010-09-09",
  
  "Description" : "AWS CloudFormation Sample Template SNSToSQS: This Template creates an SNS topic that can send messages to 
  two SQS queues with appropriate permissions for one IAM user to publish to the topic and another to read messages from the queues. 
  MySNSTopic is set up to publish to two subscribed endpoints, which are two SQS queues (MyQueue1 and MyQueue2). MyPublishUser is an IAM user 
  that can publish to MySNSTopic using the Publish API. MyTopicPolicy assigns that permission to MyPublishUser. MyQueueUser is an IAM user 
  that can read messages from the two SQS queues. MyQueuePolicy assigns those permissions to MyQueueUser. It also assigns permission for 
  MySNSTopic to publish its notifications to the two queues. The template creates access keys for the two IAM users with MyPublishUserKey 
  and MyQueueUserKey. ***Warning*** you will be billed for the AWS resources used if you create a stack from this template.",

  "Parameters": {
    "MyPublishUserPassword": {
      "NoEcho": "true",
      "Type": "String",
      "Description": "Password for the IAM user MyPublishUser",
      "MinLength": "1",
      "MaxLength": "41",
      "AllowedPattern": "[a-zA-Z0-9]*",
      "ConstraintDescription": "must contain only alphanumeric characters."
    },
    "MyQueueUserPassword": {
      "NoEcho": "true",
      "Type": "String",
      "Description": "Password for the IAM user MyQueueUser",
      "MinLength": "1",
      "MaxLength": "41",
      "AllowedPattern": "[a-zA-Z0-9]*",
      "ConstraintDescription": "must contain only alphanumeric characters."
    }
  },


  "Resources": {
    "MySNSTopic": {
      "Type": "AWS::SNS::Topic",
      "Properties": {
        "Subscription": [{
            "Endpoint": {
              "Fn::GetAtt": ["MyQueue1", "Arn"]
            },
            "Protocol": "sqs"
          },
          {
            "Endpoint": {
              "Fn::GetAtt": ["MyQueue2", "Arn"]
            },
            "Protocol": "sqs"
          }
        ]
      }
    },
    "MyQueue1": {
      "Type": "AWS::SQS::Queue"
    },
    "MyQueue2": {
      "Type": "AWS::SQS::Queue"
    },
    "MyPublishUser": {
      "Type": "AWS::IAM::User",
      "Properties": {
        "LoginProfile": {
          "Password": {
            "Ref": "MyPublishUserPassword"
          }
        }
      }
    },
    "MyPublishUserKey": {
      "Type": "AWS::IAM::AccessKey",
      "Properties": {
        "UserName": {
          "Ref": "MyPublishUser"
        }
      }
    },
    "MyPublishTopicGroup": {
      "Type": "AWS::IAM::Group",
      "Properties": {
        "Policies": [{
          "PolicyName": "MyTopicGroupPolicy",
          "PolicyDocument": {
            "Statement": [{
              "Effect": "Allow",
              "Action": [
                "sns:Publish"
              ],
              "Resource": {
                "Ref": "MySNSTopic"
              }
            }]
          }
        }]
      }
    },
    "AddUserToMyPublishTopicGroup": {
      "Type": "AWS::IAM::UserToGroupAddition",
      "Properties": {
        "GroupName": {
          "Ref": "MyPublishTopicGroup"
        },
        "Users": [{
          "Ref": "MyPublishUser"
        }]
      }
    },
    "MyQueueUser": {
      "Type": "AWS::IAM::User",
      "Properties": {
        "LoginProfile": {
          "Password": {
            "Ref": "MyQueueUserPassword"
          }
        }
      }
    },
    "MyQueueUserKey": {
      "Type": "AWS::IAM::AccessKey",
      "Properties": {
        "UserName": {
          "Ref": "MyQueueUser"
        }
      }
    },
    "MyRDMessageQueueGroup": {
      "Type": "AWS::IAM::Group",
      "Properties": {
        "Policies": [{
          "PolicyName": "MyQueueGroupPolicy",
          "PolicyDocument": {
            "Statement": [{
              "Effect": "Allow",
              "Action": [
                "sqs:DeleteMessage",
                "sqs:ReceiveMessage"
              ],
              "Resource": [{
                  "Fn::GetAtt": ["MyQueue1", "Arn"]
                },
                {
                  "Fn::GetAtt": ["MyQueue2", "Arn"]
                }
              ]
            }]
          }
        }]
      }
    },
    "AddUserToMyQueueGroup": {
      "Type": "AWS::IAM::UserToGroupAddition",
      "Properties": {
        "GroupName": {
          "Ref": "MyRDMessageQueueGroup"
        },
        "Users": [{
          "Ref": "MyQueueUser"
        }]
      }
    },
    "MyQueuePolicy": {
      "Type": "AWS::SQS::QueuePolicy",
      "Properties": {
        "PolicyDocument": {
          "Statement": [{
            "Effect": "Allow",
            "Principal": {
              "Service": "sns.amazonaws.com"
            },
            "Action": ["sqs:SendMessage"],
            "Resource": "*",
            "Condition": {
              "ArnEquals": {
                "aws:SourceArn": {
                  "Ref": "MySNSTopic"
                }
              }
            }
          }]
        },
        "Queues": [{
          "Ref": "MyQueue1"
        }, {
          "Ref": "MyQueue2"
        }]
      }
    }
  },
  "Outputs": {
    "MySNSTopicTopicARN": {
      "Value": {
        "Ref": "MySNSTopic"
      }
    },
    "MyQueue1Info": {
      "Value": {
        "Fn::Join": [
          " ",
          [
            "ARN:",
            {
              "Fn::GetAtt": ["MyQueue1", "Arn"]
            },
            "URL:",
            {
              "Ref": "MyQueue1"
            }
          ]
        ]
      }
    },
    "MyQueue2Info": {
      "Value": {
        "Fn::Join": [
          " ",
          [
            "ARN:",
            {
              "Fn::GetAtt": ["MyQueue2", "Arn"]
            },
            "URL:",
            {
              "Ref": "MyQueue2"
            }
          ]
        ]
      }
    },
    "MyPublishUserInfo": {
      "Value": {
        "Fn::Join": [
          " ",
          [
            "ARN:",
            {
              "Fn::GetAtt": ["MyPublishUser", "Arn"]
            },
            "Access Key:",
            {
              "Ref": "MyPublishUserKey"
            },
            "Secret Key:",
            {
              "Fn::GetAtt": ["MyPublishUserKey", "SecretAccessKey"]
            }
          ]
        ]
      }
    },
    "MyQueueUserInfo": {
      "Value": {
        "Fn::Join": [
          " ",
          [
            "ARN:",
            {
              "Fn::GetAtt": ["MyQueueUser", "Arn"]
            },
            "Access Key:",
            {
              "Ref": "MyQueueUserKey"
            },
            "Secret Key:",
            {
              "Fn::GetAtt": ["MyQueueUserKey", "SecretAccessKey"]
            }
          ]
        ]
      }
    }
  }
}
```