CloudFormation で Amazon SQS キューと Amazon SNS トピックの間にサブスクリプションを作成するにはどうすればよいですか?
AWS CloudFormation で Amazon Simple Queue Service (Amazon SQS) キューと Amazon Simple Notification Service (Amazon SNS) トピックの間にサブスクリプションを作成したいと考えています。
解決方法
ユースケースに応じて、次の中からいずれかをソリューションを選択してください。
- 同じスタックに SNS トピックと SQS キューがあります。解決するには、CloudFormation テンプレートを使用して SQS キューにメッセージを送信するトピックを作成します。
- SNS トピックは 1 つのスタックにあり、そのトピックをサブスクライブする SQS キューは別のスタックにあります。両方のスタックは同じ AWS リージョンにあります。解決するには、クロススタックリファレンスを作成します。
注: クロススタックの参照を作成するときは、SQS キューの Amazon リソースネーム (ARN) をそのスタックからエクスポートします。その後、その SQS キュー ARN を、もう 1 つのスタックにある SNS トピックの サブスクリプションエンドポイントのプロパティ にインポートします。 - SNS トピックと SQS キューが別々のリージョンにあります。解決するには、AWS::SNS::Subscription リソースを使用して、クロスリージョンのサブスクリプションをセットアップするのセクションの手順に従います。
- SNS トピックと SQS キューは別々の AWS アカウントにあります。解決するには、AWS::SNS::Subscription リソースを使用して、クロスアカウントのサブスクリプションをセットアップするのセクションの手順に従います。
AWS::SNS::Subscription リソースを使用して、クロスリージョンのサブスクリプションをセットアップする
1. ある AWS リージョンのスタックの CloudFormation テンプレートで、そのリージョンの SNS トピックを宣言します。その後、SNS トピック ARN に注釈を付ける出力リソースを作成します。
以下の JSON と YAML で記述したテンプレートの例を参照してください。
JSON:
{ "Resources": { "SnsTopic": { "Type": "AWS::SNS::Topic" } }, "Outputs": { "SnsTopicArn": { "Value": { "Ref": "SnsTopic" } } } }
YAML:
Resources: SnsTopic: Type: AWS::SNS::Topic Outputs: SnsTopicArn: Value: !Ref SnsTopic
2. もう一方のリージョンにあるスタック用の CloudFormation テンプレートで、AWS::SNS::Subscription リソースと SQS キューを定義します。
注: [Parameters] (パラメータ) で、awsSNSTopicArnExample を SNS トピック ARN に置き換えます。us-east-1 をステップ 1 のスタックのリージョンに置き換えます。
以下の JSON と YAML で記述したテンプレートの例を参照してください。
JSON:
{ "Parameters": { "SNSTopicARN": { "Type": "String", "Default": "awsSNSTopicArnExample" }, "TopicRegion": { "Type": "String", "Default": "us-east-1" } }, "Resources": { "Queue": { "Type": "AWS::SQS::Queue" }, "SnsSubscription": { "Type": "AWS::SNS::Subscription", "Properties": { "Protocol": "sqs", "Endpoint": { "Fn::GetAtt": [ "Queue", "Arn" ] }, "Region": { "Ref": "TopicRegion" }, "TopicArn": { "Ref": "SNSTopicARN" } } } } }
YAML:
Parameters: SNSTopicARN: Type: String Default: awsSNSTopicArnExample TopicRegion: Type: String Default: us-east-1 Resources: Queue: Type: AWS::SQS::Queue SnsSubscription: Type: AWS::SNS::Subscription Properties: Protocol: sqs Endpoint: !GetAtt Queue.Arn Region: !Ref TopicRegion TopicArn: !Ref SNSTopicARN
これで、クロスリージョンサブスクリプションが設定されました。
AWS::SNS::Subscription リソースを使用して、クロスアカウントのサブスクリプションをセットアップする
1. まず、SNS トピックと AWS::SNS::TopicPolicyを、当該 AWS ソースアカウントにあるスタック用の CloudFormation テンプレートで宣言します。その後、SNS トピック ARN をアノテーションするために出力リソースを作成し、パラメータとして送信先 AWS アカウントを指定します。
次に示す、JSON と YAML で記述したテンプレートの例をご参照ください。
JSON:
{ "Parameters": { "CrossAccountNumber": { "AllowedPattern": "[0-9]+", "Description": "The 12 digit AWS account number to grant access to.", "MaxLength": "12", "MinLength": "12", "Type": "String", "Default": 123456789101 } }, "Resources": { "SnsTopic": { "Type": "AWS::SNS::Topic" }, "SnsTopicPolicy": { "Type": "AWS::SNS::TopicPolicy", "DependsOn": "SnsTopic", "Properties": { "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Sid": "SnsTopicPolicy", "Effect": "Allow", "Principal": { "AWS": { "Fn::Sub": "arn:aws:iam::${CrossAccountNumber}:root" } }, "Action": [ "sns:Subscribe" ], "Resource": { "Ref": "SnsTopic" } } ] }, "Topics": [ { "Ref": "SnsTopic" } ] } } }, "Outputs": { "SnsTopicArn": { "Value": { "Ref": "SnsTopic" } } } }
YAML:
Parameters: CrossAccountNumber: AllowedPattern: '[0-9]+' Description: The 12 digit AWS account number to grant access to. MaxLength: '12' MinLength: '12' Type: String Default: 123456789101 Resources: SnsTopic: Type: AWS::SNS::Topic SnsTopicPolicy: Type: AWS::SNS::TopicPolicy DependsOn: SnsTopic Properties: PolicyDocument: Version: '2012-10-17' Statement: - Sid: SnsTopicPolicy Effect: Allow Principal: AWS: !Sub arn:aws:iam::${CrossAccountNumber}:root Action: - sns:Subscribe Resource: !Ref SnsTopic Topics: - !Ref SnsTopic Outputs: SnsTopicArn: Value: !Ref SnsTopic
2. サブスクリプションを拡張する AWS アカウントにあるスタック用の CloudFormation テンプレートで、AWS::SNS::Subscription リソースを定義します。また、SQS キューと AWS::SQS::QueuePolicy ポリシーも定義します。
注: [Parameters] (パラメータ) で、awsSNSTopicArn を SNS トピック ARN に置き換えます。us-east-1 をステップ 1 のスタックのリージョンに置き換えます。
以下の JSON と YAML で記述したテンプレートの例を参照してください。
JSON:
{ "Parameters": { "SNSTopicARN": { "Type": "String", "Default": "awsSNSTopicArn" }, "TopicRegion": { "Type": "String", "Default": "us-east-1" } }, "Resources": { "Queue": { "Type": "AWS::SQS::Queue" }, "SqsQueuePolicy": { "Type": "AWS::SQS::QueuePolicy", "Properties": { "PolicyDocument": { "Version": "2012-10-17", "Id": "MyQueuePolicy", "Statement": [ { "Sid": "Allow-SNS-SendMessage", "Effect": "Allow", "Principal": "*", "Action": [ "sqs:SendMessage" ], "Resource": { "Fn::GetAtt": [ "Queue", "Arn" ] }, "Condition": { "ArnEquals": { "aws:SourceArn": { "Ref": "SNSTopicARN" } } } } ] }, "Queues" : [ { "Ref" : "Queue" } ] } }, "SnsSubscription": { "Type": "AWS::SNS::Subscription", "Properties": { "Protocol": "sqs", "Endpoint": { "Fn::GetAtt": [ "Queue", "Arn" ] }, "Region": { "Ref": "TopicRegion" }, "TopicArn": { "Ref": "SNSTopicARN" } } } } }
YAML:
Parameters: SNSTopicARN: Type: String Default: awsSNSTopicArn TopicRegion: Type: String Default: us-east-1 Resources: Queue: Type: AWS::SQS::Queue SqsQueuePolicy: Type: AWS::SQS::QueuePolicy Properties: PolicyDocument: Version: '2012-10-17' Id: MyQueuePolicy Statement: - Sid: Allow-SNS-SendMessage Effect: Allow Principal: "*" Action: - sqs:SendMessage Resource: !GetAtt Queue.Arn Condition: ArnEquals: aws:SourceArn: !Ref SNSTopicARN Queues: - !Ref Queue SnsSubscription: Type: AWS::SNS::Subscription Properties: Protocol: sqs Endpoint: !GetAtt Queue.Arn Region: !Ref TopicRegion TopicArn: !Ref SNSTopicARN
関連するコンテンツ
- 質問済み 6年前lg...
- 質問済み 4年前lg...
- 質問済み 1年前lg...
- AWS公式更新しました 10ヶ月前
- AWS公式更新しました 7ヶ月前