AWS cloudformation错误:模板验证错误:模板错误:资源NotificationsTopic不支持Fn :: GetAtt中的属性类型Arn

时间:2018-11-24 11:04:33

标签: amazon-web-services amazon-cloudformation amazon-sns aws-serverless

我正在尝试使用yaml模板创建AWS cloudformation堆栈。 目标是为某些通知创建一个sns主题。 我想输出主题arn,以便仅指定主题arn就可以为该主题订阅多个功能。

但是,当我尝试从aws控制台创建堆栈时出现错误:

“模板验证错误:模板错误:资源NotificationsTopic不支持Fn :: GetAtt中的属性类型Arn”

对于s3存储桶,dynamodb表,我所做的工作完全相同,而且一切正常,但是由于某种原因,对于SNS主题,我无法获得ARN。

我想避免在订阅的所有函数中对主题arn进行硬编码。因为如果有一天ARN主题发生更改,那么我将需要更改所有功能,而我想将主题arn导入所有功能中并使用它。这样,如果将来由于任何原因我有一个新的arn主题,我将无需进行任何修改。

这是模板:

    Parameters:
  stage:
    Type: String
    Default: dev
    AllowedValues:
      - dev
      - int
      - uat
      - prod

Resources:
   NotificationsTopic:
        Type: AWS::SNS::Topic
        Properties:
          DisplayName: !Sub 'notifications-${stage}'
          Subscription:
            - SNS Subscription
          TopicName: !Sub 'notifications-${stage}'
Outputs:
  NotificationsTopicArn:
    Description: The notifications topic Arn.
    Value: !GetAtt NotificationsTopic.Arn
    Export:
      Name: !Sub '${AWS::StackName}-NotificationsTopicArn'
  NotificationsTopicName:
    Description: Notifications topic name.
    Value: !Sub 'notifications-${stage}'
    Export:
      Name: !Sub '${AWS::StackName}-NotificationsTopicName'

2 个答案:

答案 0 :(得分:5)

并非所有资源都相同。始终检查特定资源的文档。它具有“返回值”部分,您可以轻松地验证SNS主题是否将ARN作为Ref值,因此不必使用GetAtt函数

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sns-topic.html

答案 1 :(得分:1)

对于不直接返回 ARN 的资源,我找到了一种解决方法,其中包括自己构建 ARN。

例如,获取我的代码管道的 ARN:

!Join [ ':', [ "arn:aws:codepipeline", !Ref AWS::Region, !Ref AWS::AccountId, !Ref StackDeletePipeline ] ]