我有一个使用lambda函数支持的自定义资源的cloudformation模板。 lambda函数的一个参数是字符串列表。我只有一个项目在列表中传递,并希望使用Fn:Join来连接创建字符串。但是,使用Fn :: Join会产生错误,因为它会导致无效的json。任何意见都表示赞赏。
“订阅”:[“Fn :: Join”:[“:”,[“a”,“b”,“c”]]]
调用CreateStack时发生客户端错误(ValidationError) 操作:模板格式错误:JSON格式不正确。
Cloudformation片段: -
"Resources": {
"MyCustomRes": {
"Type": "Custom::CustomResource",
"Properties": {
"ServiceToken": { "Fn::Join": [ "", [
"arn:aws:lambda:",
{ "Ref": "AWS::Region" },
":",
{ "Ref": "AWS::AccountId" },
":function:LambdaFn"
] ] },
"Version": 1,
"ResourceName": { "Ref": "ResourceName" },
"Subscriptions" : [ "Fn::Join": [ "", [
"arn:aws:sns:",
{ "Ref": "AWS::Region" },
":",
{ "Ref": "AWS::AccountId" },
":Topic1"
] ] ]
}
} },
答案 0 :(得分:4)
用于构建Fn::Join
属性值的Subscriptions
Intrinsic Function需要是一个对象而不是一个数组。
使用像['Fn::Join' : [...]]
之类的数组是无效的JSON语法,而是必须采用{"Fn::Join" : [...]}
文档将语法描述为
{ "Fn::Join" : [ "delimiter", [ comma-delimited list of values ] ] }
因此,您的Cloud Formation模板应使用以下
"Subscriptions": {
"Fn::Join": [":", [
"arn:aws:sns",
{ "Ref": "AWS::Region"},
{ "Ref": "AWS::AccountId"},
"Topic1"]
]
}
答案 1 :(得分:1)
我到达这里是为了在YAML文件中寻找相同的语法。我想到的是必须有两个args列表:一个包含2个要加入的项的列表,第二个是列表本身。完整的YAML语法如下所示:
SourceArn:
Fn::Join:
- ""
- - 'arn:aws:execute-api:'
- !Ref AWS::Region
- ':'
- !Ref AWS::AccountId
- ':'
- !Ref ApiGatewayRestApiResource
- '/*'