在 Docker 中为 AWS Elastic Beanstalk 构建期间访问 .env 变量

Posted

技术标签:

【中文标题】在 Docker 中为 AWS Elastic Beanstalk 构建期间访问 .env 变量【英文标题】:Access .env variables during build time in docker for AWS Elastic Beanstalk 【发布时间】:2021-01-14 00:09:41 【问题描述】:

我正在使用 Docker 平台在 AWS Elastic Beanstalk 上部署 Laravel 应用程序。我的 Dockerfile 中的步骤之一是使用 Laravel mix 通过运行 npm run production 来捆绑资产,如下所示。

# Dockerfile
...
RUN echo "$ALPINE_MIRROR/edge/main" >> /etc/apk/repositories \
  && apk add --no-cache nodejs nodejs-npm  --repository="http://dl-cdn.alpinelinux.org/alpine/edge/community" \
  && npm install \
  && npm run production

当此命令运行时,它触发的步骤之一是将生成的资产复制到 Amazon S3,如下所示:

mix.webpackConfig(
    plugins: [
        new s3Plugin(
            exclude: /.*\.(html|php|htaccess|txt|json)/,
            s3Options: 
                accessKeyId: process.env.AWS_ACCESS_KEY_ID,
                secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
                region: process.env.AWS_DEFAULT_REGION,
            ,
            s3UploadOptions: 
                Bucket: process.env.AWS_BUCKET,
            ,
            directory: 'public',
        )
    ]
);

如上所示,脚本需要 AWS 环境变量才能工作。但是,即使在 Elastic Beanstalk 仪表板(在配置中)中配置了它们,构建脚本也不会选择它们。一种快速解决方法是在 Dockerfile 中定义 ARG 变量,但我不希望这些信息以纯文本形式显示。

我试图四处寻找解决方案,但没有运气。任何建议都会很有帮助。谢谢。

【问题讨论】:

您可以使用 SSM 参数存储或秘密管理器传递您的秘密吗? 我设法使用了存储在 S3 存储桶中并且只能通过同一 VPC 中的资源访问的机密。然后下载这些机密并将其用作构建时环境变量。谢谢! 感谢您告诉我。很高兴它成功了。 【参考方案1】:

如果您希望这些 env 变量在构建步骤中反映出来,请将它们添加到相应的代码构建项目 env 部分中。


如果您将 ECS 与 Elastic beanstalk 一起使用,则应在任务定义环境中定义这些环境变量。

【讨论】:

【参考方案2】:

借助本指南的帮助,我设法实现了我所需要的:

https://aws.amazon.com/blogs/security/how-to-manage-secrets-for-amazon-ec2-container-service-based-applications-by-using-amazon-s3-and-docker/

基本上:

    创建存储桶以存储包含所需变量的文件。 设置存储桶策略以限制对同一 VPC 内的访问 在 Dockerfile 中,执行下载此文件并加载环境变量的脚本。

谢谢!

【讨论】:

以上是关于在 Docker 中为 AWS Elastic Beanstalk 构建期间访问 .env 变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AWS 中为 Elastic Beanstalk 设置应用程序负载均衡器

如何在 AWS Elastic Beanstalk 中为多个 grails 环境使用单个 .war?

使用 Dockerrun.aws.json 和 Elastic Beanstalk 命名 Docker 容器

AWS Elastic Beanstalk Docker 环境变量

使用 Docker 在 AWS Elastic Beanstalk 上部署失败

在 AWS Elastic Beanstalk 上使用 Docker 进行 Django 迁移