我正在尝试使用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'
答案 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 ] ]