CloudFormation跨栈导出引用SNS主题:遇ARN格式要求问题咨询
解决CloudFormation跨栈引用SNS主题ARN的问题
这个场景完全可行,你大概率是搞错了SNS主题资源在CloudFormation中的属性返回规则——其实你不需要用GetAtt来获取SNS主题的ARN,而是直接用Ref函数就能拿到它的ARN,这是解决问题的关键。
正确的实现步骤:
1. 在BaseStack中导出SNS主题的ARN
对于AWS::SNS::Topic类型的资源,CloudFormation的Ref函数返回的不是主题名称,而是它的ARN。所以你可以直接通过Ref获取ARN并导出:
Resources: BaseSNSTopic: Type: AWS::SNS::Topic Properties: DisplayName: BaseApplicationTopic Outputs: BaseSNSTopicARN: Value: !Ref BaseSNSTopic Export: Name: !Sub "${AWS::StackName}-BaseSNSTopicARN"
这里的!Ref BaseSNSTopic会直接返回该SNS主题的完整ARN,导出后其他栈就能正确引用。
2. 在Functional Stack 1中引用导出的ARN
在依赖栈里,使用Fn::ImportValue来导入这个ARN即可,完全符合CloudFormation要求传入ARN的规则:
Resources: MyFunction: Type: AWS::Lambda::Function Properties: # 其他函数配置 Environment: Variables: SNS_TOPIC_ARN: !ImportValue BaseStack-BaseSNSTopicARN # 或者如果是需要给Lambda配置SNS触发权限,直接用导入的ARN: Policies: - Statement: - Effect: Allow Action: sns:Publish Resource: !ImportValue BaseStack-BaseSNSTopicARN
你之前的误区
你提到“无法通过GetAtt获取SNS主题的ARN属性”,这一点是对的——AWS::SNS::Topic的GetAtt仅支持获取TopicName属性,确实拿不到ARN。但你忽略了Ref函数对SNS主题的特殊返回规则:对于大多数资源Ref返回名称,但SNS主题、S3桶(如果是创建的桶)这类资源,Ref直接返回ARN或桶的完整域名,这是CloudFormation针对部分资源的特殊设计。
只要按照上面的步骤用Ref导出ARN,跨栈引用就完全没问题啦。
内容的提问来源于stack exchange,提问作者zachd1_618
相关产品推荐
相关产品推荐

