如何将AWS CodeBuild环境变量传递给CodeDeploy部署的EC2实例并生成.env文件
问题根因
你当前配置无效的核心原因是:buildspec.yml 里的 exported-variables 配置的作用是将CodeBuild运行时的变量输出到CodePipeline,供Pipeline下游的其他动作(比如其他构建任务、CloudFormation部署动作)调用,完全不会自动同步到CodeDeploy部署的EC2实例的操作系统环境中,因此你直接在EC2终端echo变量自然返回为空。
可选实现方案
下面提供两种最常用的实现方式,你可以根据自己的安全要求选择:
方案1:CodeBuild阶段直接生成.env文件(最简单)
直接在构建阶段将环境变量写入.env文件,和代码一起打包到构建产物,CodeDeploy部署时会自动同步到EC2的目标目录。
仅需修改你的buildspec.yml,在构建阶段增加生成.env的逻辑即可:
version: 0.2 env: # 原有配置可保留无需修改 exported-variables: - DB_HOST - DB_PORT - DB_DATABASE - DB_PASSWORD - DB_USERNAME phases: install: commands: - echo $DB_HOST pre_build: commands: # 新增:生成.env文件 - | cat > .env << EOF DB_HOST=$DB_HOST DB_PORT=$DB_PORT DB_DATABASE=$DB_DATABASE DB_USERNAME=$DB_USERNAME DB_PASSWORD=$DB_PASSWORD # 其他业务需要的环境变量都可以在此处追加 EOF artifacts: files: - '**/*' # 此处会把刚生成的.env也包含到产物中 name: myname-$(date +%Y-%m-%d)
该方案优势是配置简单无需改动其他资源,缺点是.env会包含在构建产物中,敏感信息(如数据库密码)有泄露风险,建议CodeBuild的敏感环境变量改用AWS Secrets Manager引用,不要明文配置。
方案2:EC2部署阶段从参数存储拉取配置(更安全)
如果要求敏感信息不落地到构建产物,推荐将RDS的配置信息预先存到AWS Systems Manager参数存储/Secrets Manager,在部署的钩子脚本中拉取生成.env。
操作步骤如下:
- 在你的CDK代码中,将RDS实例的连接信息、账号密码分别写入SSM参数(敏感信息如密码用
SecureString类型存储) - 给EC2的实例IAM角色添加SSM参数、Secrets Manager的读取权限
- 修改你的
AfterInstall.sh脚本,增加拉取参数生成.env的逻辑:
#!/bin/bash cd /var/www/html # 新增:从SSM拉取配置生成.env cat > .env << EOF DB_HOST=$(aws ssm get-parameter --name "/你的参数前缀/db/host" --query "Parameter.Value" --output text) DB_PORT=$(aws ssm get-parameter --name "/你的参数前缀/db/port" --query "Parameter.Value" --output text) DB_DATABASE=$(aws ssm get-parameter --name "/你的参数前缀/db/database" --query "Parameter.Value" --output text) DB_USERNAME=$(aws ssm get-parameter --name "/你的参数前缀/db/username" --query "Parameter.Value" --output text) # 敏感参数需要加--with-decryption参数解密 DB_PASSWORD=$(aws ssm get-parameter --name "/你的参数前缀/db/password" --with-decryption --query "Parameter.Value" --output text) EOF # 原有逻辑保留 sudo chmod -R 0777 /var/www/html/storage sudo chmod -R 0777 /var/www/html/bootstrap/cache composer install --ignore-platform-reqs
该方案优势是敏感信息全程加密存储,不会出现在构建日志、产物中,安全性更高,也是生产环境的标准实现方式。
注意事项
- EC2上生成的.env文件建议调整权限为
640,属主设置为web服务运行用户,避免权限过大导致配置泄露 - 不要将.env文件提交到代码仓库,确保.gitignore中已经添加了.env的忽略规则
内容的提问来源于stack exchange,提问作者m_____ilk
相关产品推荐
相关产品推荐

