CloudFormation cfn-init中Linux环境变量$SWARM_TOKEN无法识别问题求助
问题根因
!Sub函数的默认解析规则会优先把$开头的标识符识别为CloudFormation模板的参数/伪参数,你代码中属于Shell变量的$SWARM_TOKEN会被!Sub提前解析,因模板中不存在该参数被替换为空值,最终传到Shell执行的命令里根本没有这个变量。- 你当前写的两行命令是分开执行的,属于两个独立的Shell上下文,第一行定义的变量第二行无法继承读取,就算没有
!Sub的解析问题也会执行失败。
修复方案
调整command写法,转义Shell变量的$符号,同时将两行命令合并到同一个Shell执行上下文,修改后的代码如下:
AWS::CloudFormation::Init:.... get_and_store_swarm_token: commands: get_and_store_token: command: !Sub | #!/bin/bash SWARM_TOKEN=$(sudo docker swarm join-token -q worker) aws ssm put-parameter --name "SwarmToken" --type "SecureString" --value ${!SWARM_TOKEN} --overwrite --region ${AWS::Region}
关键修改点说明
- 用
|声明多行字符串,指定#!/bin/bash确保命令在同一个bash进程中执行,变量可以正常传递 - Shell变量
$SWARM_TOKEN在!Sub中写为${!SWARM_TOKEN},!是!Sub的转义标识,会被解析为普通的$符号保留到最终执行的Shell命令中
额外校验项
- 确认EC2实例关联的IAM角色已添加
ssm:PutParameter权限,允许写入对应路径的Parameter Store参数 - 确认EC2实例已安装aws cli v1/v2,且运行cfn-init的用户有sudo执行docker命令的权限
内容的提问来源于stack exchange,提问作者Bert
相关产品推荐
相关产品推荐

