You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 15:54:03