我正在尝试修改ECS群集的CloudFormation堆栈模板。 首先,我想仅复制相同的配置。
原始CloudFormation堆栈是ECS通过ecs-cli
命令创建的:
ecs-cli configure --cluster test-cluster --region eu-central-1 --default-launch-type EC2 --config-name test-cluster-config
ecs-cli up --keypair Test --capability-iam --vpc $VPC --subnets $SUBNET_ID --security-group $SECURITY_GROUP_ID --size 1 --instance-type t2.micro --cluster-config test-cluster-config --force
上面的命令行执行没有问题,并建立了集群。我已经成功地多次创建了该集群,并在集群上部署了ECS任务。
但是,当我尝试修改堆栈的模板而未对模板进行任何更改时,更新操作在一段时间后失败。我用来更新模板的命令如下:
CFTEMP=$(mktemp ./jqXXXX.json)
aws cloudformation get-template --stack-name amazon-ecs-cli-setup-test-cluster | jq .TemplateBody | xargs -0 printf | tail -c +2 | head -c -3 > $CFTEMP
aws cloudformation update-stack --stack-name amazon-ecs-cli-setup-test-cluster --capabilities CAPABILITY_IAM --template-body "file://$CFTEMP"
链接到$ CFTEMP的内容(在pastebin中)-https://pastebin.com/SxW0aJwa
上面的代码(对于不懂Bash的人)的简短描述如下-在当前文件夹中创建一个临时文件,并将名称存储在CFTEMP中;获取AWS CF模板,从JSON中提取TemplateBody(使用出色的jq工具),将正文中的转义符号转换为它们的实际值(例如,将\ n转换为换行符),从顶部删除2行,从底部删除3行(结果是将JSON“取消嵌套”)并将输出保存到$ CFTEMP;最后,使用$ CFTEMP文件中的数据更新堆栈模板。
为了验证模板,我还对validate-template
进行了以下调用:
aws cloudformation validate-template --template-body "file://$CFTEMP"
validate-template命令的结果为here(再次为astebin),但最重要的是-据我所知,没有错误,此模板需要IAM功能,并且我为它提供了明确的--capabilities CAPABILITY_IAM
命令中的update-stack
。
现在,最后,我期望会在更新堆栈之后发生,就是要更新的堆栈。相反,该命令返回成功,但是一分钟后,CloudFormation日志显示堆栈的状态为UPDATE_ROLLBACK_COMPLETE。日志中充满了CREATE_IN_PROGRESS,CREATE_COMPLETE,UPDATE_IN_PROGRESS和类似状态,但是第一个错误是以下隐秘消息:
1 validation error detected: Value '' at 'imageId' failed to satisfy constraint: Member must have length greater than or equal to 1 (Service: AmazonAutoScaling; Status Code: 400; Error Code: ValidationError; Request ID: <REDACTED>)
可以看到更多的日志事件列表
here(Imgur链接)。
仅作记录,当我尝试从AWS Web UI的“在模板设计器中查看/编辑”选项进行更新时,也会发生同样的事情。
问题:如何从CLI更新CF堆栈模板?我想向模板的UserData部分添加一个命令,但是现在我什至无法使用 LITERALLY THE SAME 模板进行更新。
我可以提供更多详细信息,例如模板更新过程的完整日志以及所有已执行命令的完整输出。