如何在 CloudFormation 中的 Amazon SQS 队列和 Amazon SNS 主题之间创建订阅?
我想在 AWS CloudFormation 中的 Amazon Simple Queue Service(Amazon SQS)队列和 Amazon Simple Notification Service(Amazon SNS)主题之间创建订阅。
解决方法
请根据您的使用案例从下列解决方案中选择一种:
- 您在同一堆栈中有 SNS 主题和 SQS 队列。要解决此问题,请利用 AWS CloudFormation 模板创建向 Amazon SQS 队列发送消息的主题。
- 您的 SNS 主题位于某个堆栈中,而要订阅该主题的 SQS 队列位于另一个堆栈中。两个堆栈都在相同的 AWS 区域当中。要解决此问题,请创建一个跨堆栈引用。
**注意:**当您创建跨堆栈参考时,将 SQS 队列的 Amazon Resource Name (ARN) 导出到一个堆栈中。然后,将 SNS 主题的订阅端点属性中的 SQS 队列 ARN 导入另一个堆栈中。 - 您的 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 队列。
注意:在参数中,将 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. 在位于一个 AWS 源账户的堆栈的 CloudFormation 模板中,声明 SNS 主题和 AWS::SNS::TopicPolicy。然后,创建一个输出资源来注释 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 策略。
注意:在参数中,将 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
相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 8 个月前
- AWS 官方已更新 1 年前
- AWS 官方已更新 3 个月前