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

如何将变量传递给aws s3 cp命令?EC2用户数据脚本执行异常

问题原因

你通过aws ssm get-parameter获取的路径变量包含双引号——默认的JSON输出会给字符串值添加引号。实际变量值是"s3://<bucket_name>/dv-config.json",而非你echo看到的s3://<bucket_name>/dv-config.json(echo会自动解析引号,显示时不带,但变量内部实际包含)。当你用"$cloudwatch_path"传递给aws s3 cp时,整个带引号的字符串被当作一个参数,CLI无法识别为有效的S3 URI,因此报错。

解决办法

有两种简单的修复方式:

方式1:直接输出纯文本(推荐)

在aws ssm get-parameter命令末尾添加--output text参数,让返回结果不带引号:

cloudwatch_path=$(aws ssm get-parameter --name=/${env_lower}/cloudwatch --query=Parameter.Value --output text)
aws s3 cp "$cloudwatch_path" /opt/aws/amazon-cloudwatch-agent/bin/config.json

同时建议用$()代替反引号`,这是更现代、可读性更好的命令替换写法。

方式2:移除变量中的引号

如果无法修改SSM命令的输出格式,可以用字符串处理工具去掉双引号:

# 使用sed移除引号
cloudwatch_path=$(aws ssm get-parameter --name=/${env_lower}/cloudwatch --query=Parameter.Value | sed 's/"//g')

# 或者使用tr删除引号
cloudwatch_path=$(aws ssm get-parameter --name=/${env_lower}/cloudwatch --query=Parameter.Value | tr -d '"')

aws s3 cp "$cloudwatch_path" /opt/aws/amazon-cloudwatch-agent/bin/config.json

验证:执行echo "$cloudwatch_path",输出应为不带引号的s3://<bucket_name>/dv-config.json,此时再执行aws s3 cp命令即可正常工作。

内容的提问来源于stack exchange,提问作者Bhushan Goel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:12:36