覆盖参数文件中的参数以形成云

时间:2019-03-26 17:21:14

标签: amazon-web-services amazon-cloudformation

让我说我拥有在json文件中创建cloudformation堆栈所需的所有参数,但想覆盖参数文件中的某些参数。这有可能吗?

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

所以可以说sample-stack.json文件中有10个参数,但我想从该文件中覆盖2个参数。

这可能吗?

谢谢

3 个答案:

答案 0 :(得分:1)

当前在AWS CLI中不可用,但是在GitHub上有一个feature request。现在,您需要在创建堆栈之前编写一些脚本来生成覆盖。另一个可能的选择是将值存储在可以动态引用的内容中,例如“参数存储”,并在创建堆栈之前通过API更新它们。

答案 1 :(得分:0)

如果要更新堆栈并仅指定已更改的参数列表,则可以查看我编写的this shell脚本。

用法:

▶ 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.

要解决您的问题,您可以借用edit()函数:

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

然后正常创建堆栈。

答案 2 :(得分:0)

将文件中的所有值用作变量,并使用另一个脚本传递默认值或覆盖它们。 例如,我有如下的jason文件sample-stack.json:

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

在脚本文件中,运行以下命令替换

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

您需要做的是替换您需要的那些变量。对于不需要更改的用户,将传入默认值。