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

如何在AWS CloudFormation中通过参数传递完整UserData脚本

CloudFormation UserData 参数化方案问题解答

问题概述

现有CloudFormation栈YAML配置中的UserData脚本,希望将其完整内容作为JSON参数文件的参数传入,并在模板中像引用普通参数(如ImageId: !Sub "${AmiId}")那样引用该UserData参数,当前的参数文件格式和模板引用方式是否可行?

结论

不能直接按你提供的方式实现,你的参数文件格式存在语法错误,且模板引用逻辑不符合CloudFormation规则,需要调整参数文件结构和模板引用方式。

问题分析与修正方案

1. 参数文件的核心问题

你提供的JSON参数文件存在两个致命错误:

  • JSON语法错误:ParameterValue被拆分为多个独立字符串,不符合JSON键值对的结构要求,必须合并为一个完整的字符串。
  • 内部函数无法在参数中解析:参数值是静态字符串,CloudFormation不会解析参数中的Fn::Sub等内部函数,这类动态变量替换逻辑必须放到模板中处理。

2. 正确的参数文件格式(JSON)

将整个UserData脚本合并为一个字符串,对其中的双引号进行JSON转义,保留${Environment}作为占位符供后续模板替换:

{
  "Parameters": {
    "UserData": "#!/bin/bash -xe\n echo \\\"export ENV_PROFILE=${Environment}\\\" >> /etc/profile.d/app-profile-vars.sh\n source /etc/profile.d/app-profile-vars.sh\n sudo su\n sudo yum install -y chrony\n sudo service chronyd restart\n sudo timedatectl set-timezone America/Chicago\n sudo chkconfig chronyd on\n sudo yum install -y perl-Switch perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https perl-Digest-SHA.x86_64\n cd /home/ec2-user\n curl https://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.2.zip -O\n unzip CloudWatchMonitoringScripts-1.2.2.zip\n aws s3 cp s3://scorecardprodcodedeploybucket/cloudwatch/config.json /opt/aws/amazon-cloudwatch-agent/bin/config.json\n /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s\n #/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status\n chown root:root aws-scripts-mon\n echo \\\"*/5 * * * * root /home/ec2-user/aws-scripts-mon/mon-put-instance-data.pl --mem-used-incl-cache-buff --mem-util --disk-space-used --disk-space-avail --disk-space-util --disk-path=/ --auto-scaling=only --from-cron\\\" >> /etc/crontab\n aws s3 cp s3://appdynamicscorecardadbp/AppServerAgent-1.8-22.1.0.33445.zip /opt/appdynamics/java-agent/java-AppServerAgent-1.8-22.1.0.33445.zip  --sse AES256 --region us-east-1\n cd /opt/appdynamics/java-agent\n unzip java-AppServerAgent-1.8-22.1.0.33445.zip\n aws s3 cp s3://appdynamicscorecardadbp/scorecard/controller-info.xml /opt/appdynamics/java-agent/conf/controller-info.xml  --sse AES256 --region us-east-1"
  }
}

3. 模板中正确的UserData引用方式

使用Fn::Sub(简写!Sub)替换脚本中的${Environment}占位符,同时通过!Base64完成编码:

UserData: !Base64
  !Sub "${UserData}"

或者完整函数写法:

UserData: !Base64
  Fn::Sub: !Ref UserData

关键说明

  • Environment需是CloudFormation模板中定义的参数/输出变量,!Sub会自动完成占位符替换。
  • 确保参数文件中的脚本字符串转义正确,尤其是双引号必须用\\\"转义,避免破坏JSON结构。

内容的提问来源于stack exchange,提问作者Saurabh Kohade

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 21:51:00