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

问题描述 投票:0回答:2

我正在尝试使用 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'
amazon-web-services aws-cloudformation amazon-sns aws-serverless
2个回答
42
投票

并非所有资源都是相同的。请务必检查特定资源的文档。它具有“返回值”部分,您可以轻松验证 SNS 主题是否具有 ARN 作为

Ref
值,因此您不必使用
GetAtt
函数

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

编辑:感谢您的评论,它指出并非每个资源都提供其 ARN。一个值得注意的例子是自动缩放组。当然,我的回答中的关键是“检查每个资源的文档”,这是一个并非每个资源都具有每个属性的示例。 话虽如此,ASG 输出中缺少 ARN 确实是一件很奇怪的事情。它也不容易构造,因为 ARN 还包含 GroupId,它是一个随机哈希。至少对于 ECS 容量提供商的用例来说,可能需要付出一些努力来解决这个问题 https://github.com/aws-cloudformation/aws-cloudformation-coverage-roadmap/issues/548https:// github.com/aws/containers-roadmap/issues/631#issuecomment-648377011但我认为这是一个足够重要的问题,应该在这里提到。


3
投票

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

例如,获取我的 codepipeline 的 ARN:

!Join [ ':', [ "arn:aws:codepipeline", !Ref AWS::Region, !Ref AWS::AccountId, !Ref StackDeletePipeline ] ]
© www.soinside.com 2019 - 2024. All rights reserved.