Can I use "Fn::Join" in "Parameters" of AWS Cloudformation json template

muzafarow picture muzafarow · Dec 3, 2015 · Viewed 15.5k times · Source

I want to use in Parameters of Cloudformation json template shortcut of some Policy/Loadbalancers tags name, like that:

"SomeScalingGroupName": {
            "Type": "String",
            "Default": {"Fn::Join": ["", ["Process-", {"Ref": "Env"}, "-Some-Worker-Name"]]}
        },

And I get error:

Template validation error: Template format error: Every Default member must be a string.

So my question if that proper way to use function join in Parameters? Or I they have any other way to do that? Or you have any better suggestions to using that?

Thanks!

Answer

Jason picture Jason · Dec 8, 2015

You cannot use intrinsic functions within the parameters section of your template.

You can use intrinsic functions only in specific parts of a template. Currently, you can use intrinsic functions in resource properties, metadata attributes, and update policy attributes.

http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html

You will need use this function within your resource properties. For example:

"Parameters" : {
  "Env" : {
    "Type" : "String",
    "Default" : "test"
  },
  "WorkerName" : {
    "Type" : "String",
    "Default" : "my-worker"
  }
}

"Resources" : {
  "LoadBalancer" : {
    "Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
    ...
    "Properties" : {
      "Tags" : [ 
        { "Key" : "Name", "Value": { "Fn::Join" : [ "-", [ "process", { "Ref" : "Env" }, { "Ref" : "SomeWorkerName" }]]}},
      ]
    }
  }
}

This will apply a 'Name' tag to your Load Balancer with a value of 'process-test-my-worker'. You can also use this same function anywhere else within the properties of your resources.