自分の Amazon SQS キューと CloudFormation の Amazon SNS トピックとの間のサブスクリプションを作成する方法を教えてください。
AWS CloudFormation の Amazon Simple Queue Service (Amazon SQS) キューと Amazon Simple Notification Service (Amazon SNS) トピックの間のサブスクリプションを作成したいと考えています。
解決策
トピックとキューが同じスタックにある場合は、CloudFormation テンプレートを使用して SQS キューにメッセージを送信するトピックを作成します。
トピックが1つのスタックにあり、キューが別のスタックにある場合は、クロススタックリファレンスを作成します。両方のスタックは同じ AWS リージョンにある必要があります。クロススタックリファレンスを作成するときは、SQS キューの ARN を 1 つのスタックにエクスポートします。次に、他のスタックの SNS トピックのサブスクリプションエンドポイントプロパティに ARN をインポートします。
SNS トピックと SQS キューが異なるリージョンまたは AWS アカウントにある場合は、AWS:: SNS:: Subscription を使用してクロスアカウントまたはクロスリージョンのサブスクリプションを設定します。
クロスアカウントサブスクリプションを設定する
アカウント A の設定
ソーススタックの CloudFormation テンプレートで、次の設定を行います。
- [パラメーター] の [説明] に、宛先アカウント ID を入力します。
- [リソース] では、AWS::SNS::Topic と AWS::SNS::TopicPolicy を宣言します。
- SNS TopicArn を返す [出力] セクションを作成します。
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
アカウント B の設定
宛先スタックの CloudFormation テンプレートの [リソース] でAWS::SNS::Subscription リソース、AWS::SQS::Queue、および AWS::SQS::QueuePolicy を宣言します。
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
**注:**前述のサンプルテンプレートの [パラメーター] で、awsSNSTopicArn をご使用の SNS トピック ARN に置き換えてください。また、us-east-1 をソースアカウント (アカウント A) のスタックのリージョンに置き換えてください。
クロスリージョンサブスクリプションをセットアップする
**リージョン A の設定 **
あるリージョンのスタックの CloudFormation テンプレートで、次の設定を行います。
- [リソース] では、AWS::SNS::Topic を宣言します。
- SNSTopicArn を返す [出力] セクションを作成します。
JSON テンプレートの例:
{ "Resources": { "SnsTopic": { "Type": "AWS::SNS::Topic" } }, "Outputs": { "SnsTopicArn": { "Value": { "Ref": "SnsTopic" } } } }
YAML テンプレートの例:
Resources: SnsTopic: Type: AWS::SNS::Topic Outputs: SnsTopicArn: Value: !Ref SnsTopic
リージョン B の設定
他のリージョンのスタックの CloudFormation テンプレートの [リソース] でAWS::SNS::Subscription リソースおよび AWS::SQS::Queue を宣言します。
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
**注:**前述のサンプルテンプレートの [パラメーター] で、awsSNSTopicArnExample をご使用の SNS トピック ARN に置き換えてください。また、us-east-1 をリージョン A のスタックのリージョンに置き換えてください。
- 言語
- 日本語

関連するコンテンツ
- 質問済み 1年前
- 質問済み 1年前