アカウント A の Amazon SQS キューをアカウント B の Amazon SNS トピックにサブスクライブしたいと考えています。
簡単な説明
サブスクリプションは、Amazon Simple Notification Service (Amazon SNS) からトピック所有者として、または Amazon Simple Queue Service (Amazon SQS) キューからキュー所有者として作成できます。後者の場合、Amazon SQS キューには、キューが Amazon SNS トピックにメッセージを送信できるようにする適切な権限が必要です。
解決策
前提条件
アカウント B の SNS トピックアクセスポリシーに適切な権限があることを確認してください。これにより、アカウント A の SQS キューが SNS トピックにサブスクライブできるようになります。
キュー所有者としてサブスクライブする
キュー所有者として、以下の手順に従って、アカウント A の SQS キューをアカウント B の SNS トピックにサブスクライブしてください。
- AWS マネジメントコンソールにログインし、アカウント A の Amazon SQS コンソールに移動します。
- [キュー] を選択し、次に SQS キューを選択します。
- SNS サブスクリプションセクションで、[Amazon SNS トピックをサブスクライブ] を選択します。
- ドロップダウンリストから [トピックを選択] を選択します。次に、[Amazon SNS トピック ARN を入力] を選択します。
- [Amazon SQS キューに通知を送信できる Amazon SNS トピック] テキストフィールドに SNS トピックの ARN を入力します。
- [保存] を選択します。
- AWS マネジメントコンソールにログインし、アカウント B の Amazon SNS コンソールに移動します。
- [トピック] を選択してから、SNS トピックを選択します。
- サブスクリプションセクションを見て、アカウント B の SNS トピックのサブスクリプションが確認済みであることを確認します。
トピック所有者としてサブスクライブする
トピック所有者として、以下の手順に従って別のアカウントで SQS キューをサブスクライブしてください。
アカウント B のアクセスポリシーを変更します。
- AWS マネジメントコンソールにログインし、アカウント B の Amazon SNS コンソールに移動します。
- [トピック] を選択してから、SNS トピックを選択します。
- ページの右上にある [編集] を選択します。
- **[アクセスポリシー - オプション]**セクションを展開します。次のアクセスポリシーをコピーして JSON エディターセクションに貼り付けます。(AWS アカウントと SNS トピック ARN は必ず独自の値に置き換えてください)。 次に、下部にある [変更を保存] を選択します。
{
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "111122223333"
},
"Action": "sns:Subscribe",
"Resource": "arn:aws:sns:us-east-2:123456789012:MyTopic"
}
]
}
アカウント A の SQS キューを変更
- AWS マネジメントコンソールにログインし、アカウント A の Amazon SQS コンソールに移動します。
- [キュー] を選択し、次に SQS キューを選択します。
- ページの右上にある [編集] を選択します。
- アクセスポリシーセクションに移動します。次のアクセスポリシーをコピーして JSON エディターに貼り付けます。(SQS キュー ARN と SNS トピック ARN は必ず独自の値に置き換えてください)。
{
"Sid": "Stmt1234",
"Effect": "Allow",
"Principal": "*",
"Action": "sqs:SendMessage",
"Resource": "arn:aws:sqs:us-west-2:111111111111:QueueName",
"Condition": {
"ArnEquals": {
"aws:SourceArn": "arn:aws:sns:us-west-2:555555555555:TopicName"
}
}
}
アカウント B の SNS トピックから SQS キューをサブスクライブする
AWS マネジメントコンソールにログインし、アカウント B の Amazon SNS コンソールに移動します。**[トピック]**を選び、SNS トピックを選択します。
- [サブスクリプション] で [サブスクリプションの作成] を選択します。
- [プロトコル] ドロップダウンリストを選択し、[Amazon SQS] を選択します。
- 次に、[サブスクリプションの作成] を選択します。
- AWS マネジメントコンソールにログインし、アカウント A の Amazon SQS コンソールに移動します。**[キュー]**を選択して、SQS キューを選択します。
- ページの右上にある [メッセージを送受信] を選択します。
- [メッセージをポーリング] を選択します。Amazon SNS からのメッセージが [メッセージ] セクションに表示されます。
- メッセージ ID を選択します。SubscribeURL を探し、その URL を引用符で囲んでコピーします。
- この URL リンクを Web ブラウザに貼り付けます。
- AWS マネジメントコンソールにログインし、アカウント B の Amazon SNS コンソールに移動します。**[トピック]**を選び、SNS トピックを選択します。
- [サブスクリプション] の下のサブスクリプションステータスを見て、サブスクリプションが確認されていることを確認します。
トラブルシューティングのヒント
Amazon SNS コンソールでサブスクリプションを作成しても、サブスクリプションは SNS コンソールで保留のままです。
エラーをトラブルシューティングするには、次の手順を実行してください。
- サブスクリプションを削除し、上記のステップ 9 からやり直してください。
- 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
注: CLI コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。この URL をコピーしてブラウザに貼り付け、サブスクリプションを確認します。キュー URL は必ず独自のものに置き換えてください。
SNS トピックアクセスポリシーをコピーして貼り付けると、「Couldn't set topic access policy.」というエラーが表示されます。
エラーコード: InvalidParameter - Error message: 属性アクセスポリシーの設定中にエラーが発生しました。Invalid parameter: Policy Error: null."
エラーをトラブルシューティングするには、次の手順を実行してください。
- アクセスポリシーを JSON Validator ツールにコピーアンドペーストして、ポリシーの構文が正しいことを確認します。
- アクセスポリシーを見直して、ステートメントが重複していないことを確認してください。最初のステートメント ID の後にカンマがあることを確認してください。
ベストプラクティス
SQS キューへの SNS サブスクリプションを認証します。この設定では、トピック所有者とサブスクリプション所有者のみが SNS トピックから SQS キューのサブスクライブを解除できます。
関連情報
Amazon SNS メッセージを別のアカウントの Amazon SQS キューに送信する
Amazon Simple Storage Service (Amazon S3) のイベント通知をトピックに発行することを許可する
Amazon SNS にサブスクライバーを追加しようとしたときの認証エラーはどのように解決しますか?。