我正在尝试使用 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'
并非所有资源都是相同的。请务必检查特定资源的文档。它具有“返回值”部分,您可以轻松验证 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/548 和 https:// github.com/aws/containers-roadmap/issues/631#issuecomment-648377011但我认为这是一个足够重要的问题,应该在这里提到。
对于不直接返回 ARN 的资源,我找到了一种解决方法,其中包括自己构建 ARN。
例如,获取我的 codepipeline 的 ARN:
!Join [ ':', [ "arn:aws:codepipeline", !Ref AWS::Region, !Ref AWS::AccountId, !Ref StackDeletePipeline ] ]