将环境变量从 codebuild 传递到 codedeploy ec2 实例

passing environment variables from codebuild to codedeploy ec2 instances

我是 sre 的新手。我使用 cdk 构建 aws 代码管道。我需要将 rds 实例信息从我的 rds 堆栈传递到我的 codepipeline(ec2) 堆栈。我的 ec2 实例中需要一个 .env 文件。根据我的研究,我看到有一种叫做环境变量的东西可以为我做这件事,而不是从 codebuild 生成 .env 文件。我在 codebuild 中设置了一些环境变量(纯文本),并尝试将这些环境变量传递到从 codedeploy 部署的 ec2 实例中。我能够在 buildspec.yml 中获得正确的环境变量值。但是当我尝试在 ec2 终端中 运行 echo $DB_HOST 时。我什么都没有这是我的设置:

codebuild 环境变量:

buildspec.yml

version: 0.2
env:
  exported-variables:
    - DB_HOST
    - DB_PORT
    - DB_DATABASE
    - DB_PASSWORD
    - DB_USERNAME
phases:
  install:
    commands:
      - echo $DB_HOST
      - export DB_HOST=$DB_HOST
  pre_build:
    commands:
      - export DB_HOST=$DB_HOST
artifacts:
  files:
    - '**/*'
  name: myname-$(date +%Y-%m-%d)

我的appspec.yml

version: 0.0
os: linux
files:
  - source: /
    destination: /var/www/html/
hooks:
  BeforeInstall:
    - location: script/BeforeInstall.sh
      runas: root
  AfterInstall:
    - location: script/AfterInstall.sh
      runas: root

AfterInstall.sh

#!/bin/bash
# Set permissions to storage and bootstrap cache
sudo chmod -R 0777 /var/www/html/storage
sudo chmod -R 0777 /var/www/html/bootstrap/cache
#
cd /var/www/html

#
# Run composer
composer install --ignore-platform-reqs

请帮助我将这些环境变量从 codebuild 传递到 codedeploy ec2。或者有没有其他方法可以为代码构建生成 .env 文件?

你不能按照你期望的方式来做这件事。正确的方法是通过 SSM Secrets ManagerSSM Paramter Store.

传递它们

因此在您的设置中,CodeBuild 将填充 SSM Secrets Manager 或 SSM Paramter Store(或者您自己先填充它们),CodeDeploy 将读取这些秘密存储以获取参数。

我找到了解决它的方法。这是我的解决方案: 因为我能够在构建阶段获得所有环境变量。我设法在构建阶段构建了一个 .env 文件。我有一些环境变量从秘密管理器或纯文本进入构建阶段。 首先,我在我的项目根目录中创建了一个 .env.exmaple 文件:

...
APP_ENV=local
APP_KEY=

...

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=
DB_USERNAME=root
DB_PASSWORD=

MAIL_MAILER=smtp
MAIL_HOST=smtp.sendgrid.net
MAIL_PORT=587
MAIL_USERNAME=apikey
MAIL_PASSWORD=
...

其次,我更新了我的 buildspec.yml 文件并使用 sed 命令

将每个值替换为环境变量值
version: 0.2
env:
  exported-variables:
    - DB_HOST
    - DB_DATABASE
    - DB_PASSWORD
    - DB_USERNAME
  secrets-manager:
    MAIL_PASSWORD: "email-token:MAIL_PASSWORD"
    AWS_ACCESS_KEY_ID: "aws-token:AWS_ACCESS_KEY_ID"
    AWS_SECRET_ACCESS_KEY: "aws-token:AWS_SECRET_ACCESS_KEY"
    AWS_DEFAULT_REGION: "aws-token:AWS_DEFAULT_REGION"
    AWS_BUCKET : "aws-token:AWS_BUCKET"
    AWS_URL : "aws-token:AWS_URL"
phases:
  build:
    commands:
      - cp .env.example .env
      - sed -i "s/DB_HOST=127.0.0.1/DB_HOST=$DB_HOST/g" .env
      - sed -i "s/DB_DATABASE=/DB_DATABASE=$DB_DATABASE/g" .env
      - sed -i "s/DB_USERNAME=root/DB_USERNAME=$DB_USERNAME/g" .env
      - sed -i "s/DB_PASSWORD=/DB_PASSWORD=$DB_PASSWORD/g" .env
      - sed -i "s/APP_ENV=local/APP_ENV=$APP_ENV/g" .env
      - sed -i "s/MAIL_PASSWORD=/MAIL_PASSWORD=$MAIL_PASSWORD/g" .env
...
      - sed -i "s@AWS_URL=@AWS_URL=$AWS_URL@g" .env
artifacts:
  files:
    - '**/*'
  name: myname-$(date +%Y-%m-%d)

通过这种方式,我可以为部署阶段创建一个 .env 文件。 这里要注意的一件事是,如果您的值包含 /(例如 url),您需要使用 @ 而不是 / 来执行 sed 命令