如何通过AWS SSM命令传递多行字符串参数?
解决GitHub Workflow向AWS实例传递多行.env内容的问题
问题概述
通过GitHub Workflow在AWS远程实例上创建.env文件时,采用以下步骤:
- 从GitHub Vars生成多行键值对内容,存入环境变量
DEV_ENV_VAR - 通过AWS SSM Start Session执行远程命令,尝试将
DEV_ENV_VAR写入实例的.env文件
但实际执行后,.env文件无内容,给echo添加-e参数会触发语法错误,核心问题是多行字符串无法正确传递到远程命令中。
原因分析
- GitHub Actions渲染
${{ env.DEV_ENV_VAR }}时,会将多行字符串的换行符转换为空格,破坏了原本的键值对结构 - AWS SSM的
command参数对特殊字符(换行、引号)的转义处理逻辑,导致多行内容被截断或解析为无效命令
解决方案
方案一:Base64编码传递(兼容所有场景)
通过Base64将多行内容转为单行字符串,避免换行和特殊字符的干扰,远程解码后还原内容:
1. 修改环境变量生成步骤
- name: 生成并编码.env内容 run: | # 生成标准.env格式的多行内容 ENV_CONTENT=$(echo "$VARS_JSON" | jq -r 'keys[] as $k | "\($k)=\(.[$k])"') # Base64编码为单行(-w 0避免自动换行) echo "DEV_ENV_VAR=$(echo "$ENV_CONTENT" | base64 -w 0)" >> $GITHUB_ENV
2. 修改远程执行命令
- name: 在远程服务器执行部署命令 run: | sudo apt-get update; sudo apt-get install expect -qq > /dev/null; echo "Starting execution of commands"; unbuffer aws ssm start-session --parameters command="cd ${{ env.DEPLOY_PATH }}; git pull; yarn install --frozen-lockfile; echo '${{ env.DEV_ENV_VAR }}' | base64 -d >> .env; yarn build; pm2 restart all;" --target '${{ env.DEPLOY_SERVER }}' --document-name "AWS-StartInteractiveCommand";
方案二:远程直接生成.env(更简洁)
跳过本地生成多行内容的步骤,直接将GitHub Vars的JSON字符串传递到远程,在实例上用jq解析生成.env:
- name: 在远程服务器执行部署命令 run: | sudo apt-get update; sudo apt-get install expect -qq > /dev/null; echo "Starting execution of commands"; unbuffer aws ssm start-session --parameters command="cd ${{ env.DEPLOY_PATH }}; git pull; yarn install --frozen-lockfile; apt-get install -y jq; echo '${{ env.VARS_JSON }}' | jq -r 'keys[] as \$k | \"\(\$k)=\(.[\$k])\"' >> .env; yarn build; pm2 restart all;" --target '${{ env.DEPLOY_SERVER }}' --document-name "AWS-StartInteractiveCommand";
注意:如果远程实例已预装
jq,可删除apt-get install -y jq部分
补充说明
- 避免直接在远程命令中拼接多行字符串,特殊字符(如引号、换行)会触发shell语法错误
- Base64编码是处理跨环境传递复杂字符串的通用方案,几乎无兼容性问题
内容的提问来源于stack exchange,提问作者Matthew T
相关产品推荐
相关产品推荐

