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" ] ] ] } } }, ```

Original source