我正在使用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/"
保持某些价值观秘密的最佳做法是什么?目前.ebextensions
文件夹受源代码管理,我喜欢这样,因为它与所有人共享,但同时我不想将敏感值保留在源代码管理下。
有没有办法在部署时通过EB CLI工具指定一些环境变量(例如eb deploy -config ...
)?或者AWS部署工具如何涵盖此用例?
答案 0 :(得分:14)
AWS documentation recommends storing sensitive information in S3因为环境变量可能以各种方式暴露:
使用环境为您的应用程序提供连接信息 属性是将密码保留在代码之外的好方法,但它是 不完美的解决方案。环境属性是可以发现的 环境管理控制台,任何有用户都可以查看 允许描述您环境中的配置设置。 根据平台的不同,环境属性也可能出现在 实例日志。
以下示例来自文档,您应参考该文档以获取完整详细信息。简而言之,您需要:
授予对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"
]
}
]
}
使用以下内容在应用程序包根目录中向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
中提取值(或者您决定将其放入实际配置中的任何位置。)
答案 1 :(得分:7)
这个问题已经有了答案,但我想为这个问题提供替代解决方案。而不是必须在环境变量中保密(然后必须在版本控制之外的地方进行管理和存储,再加上你需要记住在部署时设置它们),我将所有秘密都放在加密的S3存储桶中,只能从EB正在运作的角色。然后我在启动时获取秘密。这样可以将部署与配置完全分离,您再也不必在命令行中调整秘密。
如果需要(例如,如果在应用程序设置期间需要保密,例如获取代码的存储库的密钥),您还可以使用带有.ebextensions
指令的S3Auth
配置文件轻松复制所述S3桶的内容到本地实例;否则只需使用AWS SDK即可在启动时从应用程序中获取所有机密信息。
答案 2 :(得分:3)
您应该可以从eb Web控制台将敏感值指定为环境变量:您的EB应用程序 - >您的EB环境 - >配置 - >软件配置 - >环境属性
或者,您可以使用此功能:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb3-setenv.html
答案 3 :(得分:0)
我一直在使用另一个shell脚本,一些./deploy_production.sh来设置特定于环境的变量。在shell脚本中,您可以使用“eb setenv NAME1 = VAR1 NAME2 = VAR2 ...”来设置env var。
这个文件不需要进入git repo。
答案 4 :(得分:0)
其他答案中提到,使用参数存储/秘密管理器可能会有更好的方法。
我在以下答案中描述了我如何使用AWS Systems Manager参数存储(它还为您提供了Secrets Manager的界面)进行此操作:https://stackoverflow.com/a/59910941/159178。基本上,您可以让Beanstalk ECS IAM角色访问相关参数,然后在启动时从应用程序代码中加载它。