Cloudformation 模板 - 我如何获得计算值 属性

Cloudformation template - how do i get the value of a computed property

在以下 Cloudformation 模板中,我正在创建一个 SES 接收规则。 我在其中计算要通知的 SNS TopicArn。 我想输出值,但我无法找到语法来获取它。 所有其他输出都是模板参数。

答案:- 在调用模板上设置它并将其作为参数传递:-

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: !Join [ '',
               [
               !Sub 'arn:aws:sns:${AWS::Region}:${AWS::AccountId}:',
               !Ref RuleS3ActionObjectSNSTopic
               ]
               ]
Outputs:
  Recipients:
    Value: !Sub ${RuleRecipients}
  S3Bucket:
    Value: !Sub ${RuleS3ActionObjectBucketName}
  S3Prefix:
    Value: !Sub ${RuleS3ActionObjectKeyPrefix}
  SNSTopicArn:
    Value: >--What do i put here<--

答案:-

RuleS3ActionObjectSNSTopic: !Join [ '',
               [
               !Sub 'arn:aws:sns:${AWS::Region}:${AWS::AccountId}:',
               !FindInMap [ SourceMap, !Ref rr5 , snstopic ]
               ]
               ]

模板则变为

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}

考虑到主题是作为模板参数传递的,您可以:

  1. 接受 SNSTopicArn 作为参数,而不是仅仅询问主题名称

  2. 您可以像在 ReceiptRule 中那样在输出部分构建 ARN。嗯,不完全是,因为有更好的方法。事实上,你几乎就在那里。它可能是这样的:

--

Outputs:
  SNSTopicArn:
    Value: !Sub "arn:aws:sns:${AWS::Region}:${AWS::AccountId}:${RuleS3ActionObjectSNSTopic}"

--

请注意,使用内部函数 Fn::GetAtt 不会起作用,因为 SNS 资源不是在同一模板中创建的。