如何使用Elastic Beanstalk在部署时指定敏感环境变量

Iul*_*ian 18 amazon-web-services amazon-elastic-beanstalk

我正在使用Elastic Beanstalk部署Python Flask应用程序.我有一个配置文件/.ebextensions/01.config,其中我设置了一些环境变量 - 其中一些应该是秘密的.

该文件看起来像这样:

packages:
  yum:
    gcc: []
    git: []
    postgresql93-devel: []

option_settings:
  "aws:elasticbeanstalk:application:environment":
    SECRET_KEY: "sensitive"
    MAIL_USERNAME: "sensitive"
    MAIL_PASSWORD: "sensitive"
    SQLALCHEMY_DATABASE_URI: "sensitive"
  "aws:elasticbeanstalk:container:python:staticfiles":
    "/static/": "app/static/"
Run Code Online (Sandbox Code Playgroud)

保持某些价值观秘密的最佳做法是什么?目前该.ebextensions文件夹受源代码管理,我喜欢这个,因为它与所有人共享,但同时我不想将敏感值保留在源代码管理下.

有没有办法在部署(例如eb deploy -config ...)时通过EB CLI工具指定一些环境变量?或者AWS部署工具如何涵盖此用例?

Car*_*l G 18

AWS文档建议存储S3敏感信息,因为环境变量可以通过各种方式进行曝光:

使用环境属性向应用程序提供连接信息是将密码保留在代码之外的好方法,但这不是一个完美的解决方案.环境管理控制台中可以发现环境属性,任何有权描述环境配置设置的用户都可以查看.根据平台,环境属性也可能出现在实例日志中.

以下示例来自文档,您应参考该文档以获取完整详细信息.简而言之,您需要:

  1. 使用最小权限将文件上载到S3,可能是加密的.
  2. 授予对Elastic Beanstalk自动缩放组的实例配置文件角色的读访问权限.政策如下:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "database",
                "Action": [
                    "s3:GetObject"
                ],
                "Effect": "Allow",
                "Resource": [
                    "arn:aws:s3:::my-secret-bucket-123456789012/beanstalk-database.json"
                ]
            }
        ]
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 添加一个文件名的文件一样s3-connection-info-file.config/.ebextensions与这些内容您的应用程序包的根:

    Resources:
      AWSEBAutoScalingGroup:
        Metadata:
          AWS::CloudFormation::Authentication:
            S3Auth:
              type: "s3"
              buckets: ["my-secret-bucket-123456789012"]
              roleName: "aws-elasticbeanstalk-ec2-role"
    
    files:
      "/tmp/beanstalk-database.json" :
        mode: "000644"
        owner: root
        group: root
        authentication: "S3Auth"
        source: https://s3-us-west-2.amazonaws.com/my-secret-bucket-123456789012/beanstalk-database.json
    
    Run Code Online (Sandbox Code Playgroud)

然后更新您的应用程序代码以从文件中提取值/tmp/beanstalk-database.json(或者您决定将其放入实际配置中的任何位置.)


JHH*_*JHH 7

这个问题已经有了答案,但我想为这个问题提供替代解决方案.而不是必须在环境变量中保密(然后必须在版本控制之外的地方进行管理和存储,再加上你需要记住在部署时设置它们),我将所有秘密都放在加密的S3存储桶中,只能从EB正在运作的角色.然后我在启动时获取秘密.这样可以将部署与配置完全分离,您再也不必在命令行中调整秘密.

如果需要(例如,如果在应用程序设置期间需要密钥,例如获取代码的存储库的密钥),您还可以使用.ebextensions带有S3Auth指令的配置文件轻松地将所述S3存储桶的内容复制到本地实例; 否则只需使用AWS SDK在启动时从应用程序中获取所有机密.


Sam*_*mar 6

您应该能够从 eb web 控制台指定敏感值作为环境变量:您的 EB 应用程序 -> 您的 EB 环境 -> 配置 -> 软件配置 -> 环境属性

或者,您可以使用:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb3-setenv.html

编辑:虽然这是 2015 年被接受的答案,但这不应该是你处理它的方式。现在您可以使用 AWS Secrets Manager 来实现此目的。