aws cloudformation use Fn::Join in a list
amazon-web-services, aws-cloudformation
Solution
The `Fn::Join` Intrinsic Function used to build the values for the `Subscriptions` property must be an object rather than an array.
It's invalid JSON syntax to declare an array like `['Fn::Join' : [...]]` instead it must be of the form `{"Fn::Join" : [...]}`
The docs describe the syntax as
{ "Fn::Join" : [ "delimiter", [ comma-delimited list of values ] ] }
Therefore your CloudFormation template should use the following
{
"Subscriptions": {
"Fn::Join": [
":",
[
"arn:aws:sns",
{
"Ref": "AWS::Region"
},
{
"Ref": "AWS::AccountId"
},
"Topic1"
]
]
}
}
A more readable solution to constructing ARN exists using the `Fn::Sub` Intrinsic Function.
{
"Fn::Sub": [
"arn:${AWS::Partition}:sns:${AWS::Region}:${AWS::AccountId}:Topic1"
]
}
Problem
I've a cloudformation template that uses custom resource backed by lambda function. One of the parameters of the lambda function is a list of strings. I have only one item to pass in the list and would like to use Fn:Join to concatenate create the string. However, using Fn::Join gives error as it leads to invalid json. Any inputs are appreciated. "Subscriptions": [ "Fn::Join": [":", ["a", "b", "c"]]] A client error (ValidationError) occurred when calling the CreateStack operation : Template format error: JSON not well-formed. Cloudformation snippet:- ``` "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" ] ] ] } } }, ```