让我说我拥有在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个参数。
这可能吗?
谢谢
答案 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}"
您需要做的是替换您需要的那些变量。对于不需要更改的用户,将传入默认值。