Python FlaskアプリケーションとElasticBeanstalkをデプロイしています。構成ファイルがあります/.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
フォルダーはソース管理下にあり、すべての人と共有されるのでこれが好きですが、同時に機密値をソース管理下に置きたくありません。
デプロイ時にEBCLIツールを使用していくつかの環境変数を指定する方法はありますか(例:eb deploy -config ...
)?または、このユースケースはAWSデプロイメントツールでどのようにカバーされていますか?
EbWebコンソールから環境変数として機密値を指定できるはずです:EBアプリ-> EB環境->構成->ソフトウェア構成->環境プロパティ
または、これを利用することもできます: http://docs.aws.Amazon.com/elasticbeanstalk/latest/dg/eb3-setenv.html
AWSドキュメントではS3に機密情報を保存することを推奨しています 環境変数はさまざまな方法で公開される可能性があるため:
環境プロパティを使用してアプリケーションへの接続情報を提供することは、パスワードをコードから除外するための良い方法ですが、完全なソリューションではありません。環境プロパティは、環境管理コンソールで検出でき、環境の構成設定を説明する権限を持つすべてのユーザーが表示できます。プラットフォームによっては、環境プロパティもインスタンスログに表示される場合があります。
以下の例はドキュメントからのものであり、詳細については参照する必要があります。要するに、あなたはする必要があります:
ElasticBeanstalk自動スケーリンググループのインスタンスプロファイルのロールへの読み取りアクセスを許可します。ポリシーは次のようになります。
{
"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
(または実際の構成に配置することを決定した場所)から値を抽出します。
この質問にはすでに答えがありますが、私はこの問題の代替ソリューションを提供したいと思います。シークレットを環境変数に保持する代わりに(バージョン管理外の場所で管理および保存する必要があり、展開時にそれらを設定することを忘れないでください)、暗号化されたS3バケットにすべてのシークレットを配置します。 EBが実行されている役割。次に、起動時にシークレットを取得します。これには、展開を構成から完全に切り離すという利点があり、コマンドラインでシークレットをいじる必要はもうありません。
必要に応じて(たとえば、コードがフェッチされるリポジトリへのキーなど、アプリのセットアップ中にシークレットが必要な場合)、.ebextensions
ディレクティブを含むS3Auth
設定ファイルを使用して、上記のコンテンツを簡単にコピーすることもできます。ローカルインスタンスへのS3バケット。それ以外の場合は、AWS SDKを使用して、起動時にアプリからすべてのシークレットをフェッチします。
編集:2018年4月の時点で、AWSはシークレット管理専用のマネージドサービスを提供しています。 AWSシークレットマネージャー。文字列またはjson形式、バージョン管理、ステージ、ローテーションなどのシークレットの便利で安全なストレージを提供します。また、KMS、IAMなどの構成の一部が削除され、セットアップが迅速になります。秘密鍵やパスワードなどの静的な機密データを保存するために他のAWSサービスを使用する本当の理由はわかりません。
私は別のシェルスクリプト、何か./deploy_production.shを使用して、環境固有の変数を設定しています。シェルスクリプトでは、「eb setenv NAME1 = VAR1 NAME2 = VAR2 ...」を使用してenv変数を設定できます。
そして、このファイルはgitリポジトリに入る必要はありません。
他の回答のいくつかは、Parameter Store/SecretsManagerでより良い方法があるかもしれないと述べています。
この回答では、AWS Systems Managerパラメーターストア(Secrets Managerへのインターフェイスも提供します)を使用してこれをどのように行ったかを説明しました: https://stackoverflow.com/a/59910941/159178 。基本的に、Beanstalk ECS IAMロールに関連するパラメーターへのアクセスを許可し、起動時にアプリケーションコードからロードします。