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

如何将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。
操作步骤如下:

  1. 在你的CDK代码中,将RDS实例的连接信息、账号密码分别写入SSM参数(敏感信息如密码用SecureString类型存储)
  2. 给EC2的实例IAM角色添加SSM参数、Secrets Manager的读取权限
  3. 修改你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:45:03