我有一个使用lambda函数支持的自定义资源的cloudformation模板。lambda函数的一个参数是字符串列表。我只有一个项目要在列表中传递,并且希望使用Fn:Join来连接创建字符串。但是,使用Fn::Join会产生错误,因为它会导致无效的json。如有任何意见,欢迎。
"订阅":[" Fn::加入 ": [":", [" 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"
] ] ]
}
} },
用于构建Subscriptions
属性值的Fn::Join
Intrinsic Function必须是对象而不是数组。
这是无效的JSON语法来声明一个数组像['Fn::Join' : [...]]
相反,它必须是{"Fn::Join" : [...]}
的形式
文档将语法描述为
{ "Fn::Join" : [ "delimiter", [ comma-delimited list of values ] ] }
因此你的CloudFormation模板应该使用下面的
{
"Subscriptions": {
"Fn::Join": [
":",
[
"arn:aws:sns",
{
"Ref": "AWS::Region"
},
{
"Ref": "AWS::AccountId"
},
"Topic1"
]
]
}
}
用Fn::Sub
固有函数构造ARN有一个更容易读懂的解决方案。
{
"Fn::Sub": [
"arn:${AWS::Partition}:sns:${AWS::Region}:${AWS::AccountId}:Topic1"
]
}
我来到这里寻找相同的语法在YAML文件。让我感到困惑的是需要有两个参数列表:一个包含2个要连接的项的列表,其中第二个本身就是一个列表。完整的YAML语法如下所示:
SourceArn:
Fn::Join:
- ""
- - 'arn:aws:execute-api:'
- !Ref AWS::Region
- ':'
- !Ref AWS::AccountId
- ':'
- !Ref ApiGatewayRestApiResource
- '/*'