Thursday, March 17, 2022

[SOLVED] How do you add spaces for aws cloudformation deploy --parameter-overrides and/or --tags?

Issue

I am trying to get spaces into the tags parameter for the aws cli and it works if I hardcode it but not if I use bash variables. What is going on and how do I fix it?

This works with out spaces:

aws cloudformation deploy  \
      --template-file /path_to_template/template.json \ 
      --stack-name my-new-stack \
      --tags Key1=Value1 Key2=Value2

This works with out spaces but with variables:

tags="Key1=Value1 Key2=Value2" 
aws cloudformation deploy \
  --template-file /path_to_template/template.json \ 
  --stack-name my-new-stack \
  --tags $tags

This works with spaces:

aws cloudformation deploy  \
  --template-file /path_to_template/template.json \ 
  --stack-name my-new-stack \
  --tags 'Key1=Value1' 'Key Two=Value2'

This does not work, spaces and variables:

tags="'Key1=Value1' 'Key Two=Value2'"

aws cloudformation deploy  \
  --template-file /path_to_template/template.json \ 
  --stack-name my-new-stack \
  --tags $tags

Attempting to fix bash expansion, also does not work, spaces and variables:

tags="'Key1=Value1' 'Key Two=Value2'"

aws cloudformation deploy  \
  --template-file /path_to_template/template.json \ 
  --stack-name my-new-stack \
  --tags "$tags"

Attempting to fix bash expansion, also does not work, spaces and variables:

tags="'Key1=Value1' 'Key Two=Value2'"

aws cloudformation deploy  \
  --template-file /path_to_template/template.json \ 
  --stack-name my-new-stack \
  --tags "$(printf '%q' $tags)"

Error:

Invalid parameter: Tags Reason: The given tag(s) contain invalid characters (Service: AmazonSNS; Status Code: 400; Error Code: InvalidParameter; Request ID


Solution

Stealing some ideas from https://github.com/aws/aws-cli/issues/3274 I was able to get this working by doing the following

    deploy=(aws cloudformation deploy 
            ...
            --tags $(cat tags.json | jq '.[] | (.Key + "=" + .Value)'))

    eval $(echo ${deploy[@]})

With a tags.json file structure of

[
    {
        "Key": "Name With Spaces",
        "Value": "Value With Spaces"
    },
    {
        "Key": "Foo",
        "Value": "Bar"
    }
]


Answered By - esolomon
Answer Checked By - Gilberto Lyons (WPSolving Admin)