3

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

文件看起来是这样的:

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/" 

什么是保持一定的值秘密的最佳实践?目前.ebextensions文件夹处于源代码控制之下,我喜欢这个,因为它与所有人共享,但同时我不想将敏感值保存在源代码控制之下。

部署时是否可以通过EB CLI工具指定某些环境变量(例如eb deploy -config ...)?或者AWS部署工具涵盖的这个用例如何?

回答

0

我一直在使用另一个shell脚本,东西./deploy_production.sh来设置环境特定的变量。在shell脚本中,可以使用“eb setenv NAME1 = VAR1 NAME2 = VAR2 ...”来设置env var。

而这个文件不需要进入git仓库。

+0

有没有办法从aws cli做到这一点? – Jordan

+0

如果你的实例不在git仓库中,你如何运行它? –

6

这个问题已经有了答案,但我想为这个问题提供一个替代解决方案。我不再需要在环境变量中保留秘密(这些变量必须在版本控制之外的某处进行管理和存储,而且需要记住在部署时进行设置),我将所有秘密都放入了只能从EB运行的角色。然后我在启动时获取秘密。这具有将配置与配置完全分离的好处,并且您再也不必在命令行中隐藏秘密。

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

5

AWS documentation recommends storing sensitive information in S3因为环境变量可以通过各种方式进行曝光:

提供连接信息将应用程序与环境 特性是将密码出你的代码的好方法,但它 不是一个完美的解。环境属性可在 环境管理控制台中找到,任何具有 权限的用户都可以在您的环境中描述配置设置。 根据平台的不同,环境属性也可能出现在 实例日志中。

下面的示例来自文档,您应该参考完整的详细信息。总之,您需要:

  1. 将文件上传到最低权限的S3,possibly encrypted
  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" 
          ] 
         } 
        ] 
    } 
    
  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 
    

然后更新您的应用程序代码中提取从文件/tmp/beanstalk-database.json(或任何你决定把它放在你的实际配置中)的值。

相关问题