AWS CLIでSNS-SQSファンアウトをしてみた。

2021.10.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

SNS-SQSファンアウトとは?

ファンアウトの設定を行うと、SNSトピックから発行されたメッセージが複数エンドポイントにプッシュされます。Kinesis Data Firehose 配信ストリーム、Amazon SQS キュー、HTTP (S) エンドポイント、Lambda 関数をエンドポイントとして使用できます。

この記事では、SNSから複数のSQSにファンアウトしてみます。このファンアウトでSNSトピックから発行されたメッセージが複数Amazon SQS キューにプッシュされます。

 

 

やってみた

SNS-SQSファンアウトのために、1つのSNSトピック、2つのSQSキュー、および2つのポリシーを作成しました。

  • Amazon SNS Topic : メッセージを発行するために、1つのSNSトピック 「SNS-Fanout」。
  • Amazon SQS Queue : snsトピックをサブスクライブするための2つのSQSキュー。
    • SQS-FanOut-Queue1
    • SQS-FanOut-Queue2
  • ポリシー : SNS トピックがキューにメッセージを送信できるようにするポリシー。
    • policy-queue1.json
    • policy-queue2.json

 

SNSとSQSの作成

  • SNSトピック「SNS-Fanout」を作成しておきます。このコマンドはSNSトピックのarnを返します。
aws sns create-topic --name SNS-Fanout --region us-east-1

 

 

  • 2つのSQSキュー「SQS-FanOut-Queue1、SQS-FanOut-Queue2」を作成しておきます。このコマンドはSQSキューのURLを返します。メッセージを受信するとき、このキューURLを使います。

 

#Creates Queue 1
aws sqs create-queue --queue-name SQS-FanOut-Queue1 --region us-east-1
#Creates Queue 1
aws sqs create-queue --queue-name SQS-FanOut-Queue2 --region us-east-1

 

 

ポリシーを作成

SNS トピックがキューにメッセージを送信できるようにするために、SQSキューにポリシーを追加する必要があります。AWS CLIを使用してポリシーを作成するには、JSONのポリシー(In String Format)が必要です。ローカルでキューごとに1つのポリシーファイルを作成しておきます。

 

  • Queue1のポリシー「policy-queue1.json」
{"Policy" : "{\"Id\": \"id1\",\"Version\": \"2012-10-17\",\"Statement\": [{ \"Sid\": \"Statement1\",\"Effect\": \"Allow\", \"Principal\": {\"AWS\": \"*\"},\"Action\": \"SQS:SendMessage\",\"Resource\": \"arn:aws:sqs:us-east-1:xxxxxxxxxxxx:SQS-FanOut-Queue1\",\"Condition\": {\"ArnEquals\": {\"aws:SourceArn\": \"arn:aws:sns:us-east-1:xxxxxxxxxxxx:SNS-Fanout\"}}}]}"}

 

  • Queue2のポリシー「policy-queue2.json」
{"Policy" : "{\"Id\": \"id2\",\"Version\": \"2012-10-17\",\"Statement\": [{ \"Sid\": \"Statement2\",\"Effect\": \"Allow\", \"Principal\": {\"AWS\": \"*\"},\"Action\": \"SQS:SendMessage\",\"Resource\": \"arn:aws:sqs:us-east-1:xxxxxxxxxxxx:SQS-FanOut-Queue2\",\"Condition\": {\"ArnEquals\": {\"aws:SourceArn\": \"arn:aws:sns:us-east-1:xxxxxxxxxxxx:SNS-Fanout\"}}}]}"}

 

  • SQSキューにポリシーを追加しておきます。
#Associate policy-1 with queue-1 
aws sqs set-queue-attributes --queue-url https://queue.amazonaws.com/xxxxxxxxxxxx/SQS-FanOut-Queue1 --attributes file://policy-queue1.json --region us-east-1

#Associate policy-2 with queue-2 
aws sqs set-queue-attributes --queue-url https://queue.amazonaws.com/xxxxxxxxxxxx/SQS-FanOut-Queue2 --attributes file://policy-queue2.json --region us-east-1

 

 

SNSトピックにサブスクライブします

SQSキューをSNSトピックにサブスクライブしておきます。

# Subscribe the queue-1 to the SNS topic
aws sns subscribe --topic-arn arn:aws:sns:us-east-1:xxxxxxxxxxxx:SNS-Fanout --protocol sqs --notification-endpoint arn:aws:sqs:us-east-1:xxxxxxxxxxxx:SQS-FanOut-Queue1 --region us-east-1

# Subscribe the queue-2 to the SNS topic
aws sns subscribe --topic-arn arn:aws:sns:us-east-1:xxxxxxxxxxxx:SNS-Fanout --protocol sqs --notification-endpoint arn:aws:sqs:us-east-1:xxxxxxxxxxxx:SQS-FanOut-Queue2 --region us-east-1

 

メッセージを送受信

  • SNSトピックからのメッセージを送信しておきます。
aws sns publish --topic-arn arn:aws:sns:us-east-1:xxxxxxxxxxxx:SNS-Fanout --message "Hello Subscribers" --region us-east-1

 

  • SQSキューにメッセージを受信しておきます。
#Receive Queue1 Message
aws sqs receive-message --queue-url https://queue.amazonaws.com/xxxxxxxxxxxx/SQS-FanOut-Queue1 --region us-east-1

#Receive Queue2 Message
aws sqs receive-message --queue-url https://queue.amazonaws.com/xxxxxxxxxxxx/SQS-FanOut-Queue2 --region us-east-1

 

 

まとめ

AWS CLIでSNSとSQSファンアウトをしてみました。SNSトピックから発行されたメッセージが複数Amazon SQS キューにプッシュされました。SNSファンアウトはリアルタイムシナリオで使用できます。

AWS CLIでのSNS の使用

ポリシーをキューに追加するためのAWS CLIコマンド

AWS CLIでSQSキューの作成