uberrebu
uberrebu

Reputation: 4339

override parameters in parameter file for cloudformation

lets say i have all parameters needed to create a cloudformation stack in a json file but want to override some parameters from the parameters file..is this possible?

aws cloudformation create-stack \
 --stack-name sample-stack \
 --template-body file://sample-stack.yaml \
 --parameters file://sample-stack.json \
 --capabilities CAPABILITY_IAM \
 --disable-rollback \
 --region us-east-1 \
 --output json && \
aws cloudformation wait stack-create-complete \
 --stack-name sample-stack

so lets say there are like 10 parameters in sample-stack.json file BUT i have like 2 parameters i want to override from that file.

Is this possible?

Thanks

Upvotes: 4

Views: 4203

Answers (3)

star
star

Reputation: 953

make all values in the files as the variables, and use another script pass the default values or overwrite them. For example, i have my jason files sample-stack.json like following:

[
    {
      "ParameterKey": "InstanceType",
      "ParameterValue": "${instance_type}"
    },
    {
      "ParameterKey": "DesiredSize",
      "ParameterValue": "${ASG_DESIRED_Number}"
    }
]

in the script file, run following commands to replace

instance_type=t3.small 
envsubst < "${IN_FILENAME}" > "${OUT_FILENAME}"

what you need to do is to replace those variables you need. for those don't need change, the default value will be passed in.

Upvotes: 0

Alex Harvey
Alex Harvey

Reputation: 15472

If you want to update a stack and specify only the list of parameters that changed, you can have a look at this shell script that I wrote.

Usage:

▶ bash update_stack.sh -h
Usage: update_stack.sh [-h] STACK_NAME KEY1=VAL1 [KEY2=VAL2 ...]
Updates CloudFormation stacks based on parameters passed here as key=value pairs. All
  other parameters are based on existing values.

To solve your problem, you could borrow the edit() function:

PARAMS='sample-stack.json'

edit() {
  local key value pair

  for pair in "$@" ; do
    IFS='=' read -r key value <<< "$pair"
    jq --arg key "$key" \
       --arg value "$value" \
      '(.[] | select(.ParameterKey==$key)
      | .ParameterValue) |= $value' \
      "$PARAMS" > x ; mv x "$PARAMS"
  done
}

cp $PARAMS $PARAMS.bak
edit param1=newval1 param2=newval2

And then create your stack as normal.

Upvotes: 0

bwest
bwest

Reputation: 9814

This isn't available in the AWS CLI right now, but there is a feature request on GitHub. For now you'll need to script something to generate your overrides prior to creating the stack. Another potential option is to store your values in something that you can dynamically reference, such as Parameter Store, and update them via the API prior to stack creation.

Upvotes: 1

Related Questions