如何在CloudFormation模板中获取计算属性的值?
搞定CloudFormation里SES接收规则的SNS TopicArn输出问题
问题回顾
你在编写CloudFormation模板创建SES接收规则时,已经算出了要用于通知的SNS TopicArn,但卡在了怎么在Outputs里正确输出这个值——其他输出项都是直接引用模板参数,唯独这个拼接出来的ARN不知道该怎么写语法。
解决方案
关键是把计算好的ARN先做成一个可引用的变量,而不是直接在资源属性里临时拼接,这样输出的时候直接引用这个变量就行。
第一步:预计算SNS TopicArn
先把完整的SNS TopicArn计算出来,这里可以结合!FindInMap从映射表中获取主题名称,再用!Sub和!Join拼接成标准ARN格式:
RuleS3ActionObjectSNSTopic: !Join [ '', [ !Sub 'arn:aws:sns:${AWS::Region}:${AWS::AccountId}:', !FindInMap [ SourceMap, !Ref rr5 , snstopic ] ] ]
第二步:修改模板引用并输出
把SES接收规则里的TopicArn改成引用这个预计算的值,同时在Outputs里直接引用它,这样就解决了输出的语法问题:
Resources: ReceiptRule: Type: 'AWS::SES::ReceiptRule' Properties: RuleSetName: !Ref ReceiptRuleSetName Rule: Name: !Ref RuleName Enabled: !Ref RuleEnabled ScanEnabled: !Ref RuleScanEnabled TlsPolicy: !Ref RuleTLSPolicy Recipients: - !Ref RuleRecipients Actions: - S3Action: ObjectKeyPrefix: !Ref RuleS3ActionObjectKeyPrefix BucketName: !Ref RuleS3ActionObjectBucketName TopicArn: !Ref RuleS3ActionObjectSNSTopic Outputs: Recipients: Value: !Sub ${RuleRecipients} S3Bucket: Value: !Sub ${RuleS3ActionObjectBucketName} S3Prefix: Value: !Sub ${RuleS3ActionObjectKeyPrefix} SNSTopicArn: Value: !Sub ${RuleS3ActionObjectSNSTopic}
原理说明
之前你是在S3Action里直接拼接ARN,这个值只在资源属性内部生效,没办法被Outputs直接引用。现在把ARN预计算成一个独立的可引用变量,不管是资源配置还是输出都用同一个引用,既保证了值的一致性,也完全符合CloudFormation的语法要求。
内容的提问来源于stack exchange,提问作者Simon Taylor
相关产品推荐
相关产品推荐

