Elastic Beanstalk 環境変数へのシークレットとパラメータのフェッチ - AWS Elastic Beanstalk

Elastic Beanstalk 環境変数へのシークレットとパラメータのフェッチ

Elastic Beanstalk は、インスタンスのブートストラップ中に AWS Secrets Manager と AWS Systems Manager Parameter Store から値をフェッチし、アプリケーションが使用する環境変数に割り当てることができます。

以下のポイントは、環境変数をシークレットとして使用するための設定、同期、アクセスを要約したものです。

  • 保存するシークレットとパラメータの Amazon リソースネーム (ARN) を指定して、シークレットを保存するように環境変数を設定します。

  • Secrets Manager または Systems Manager Parameter Store でシークレット値を更新またはローテーションする場合は、環境変数を手動で更新する必要があります。

  • シークレット環境変数は、ebextension コンテナコマンドとプラットフォームフックに利用可能です。

サポートされるプラットフォームのバージョン

2025 年 3 月 26 日以降にリリースされたプラットフォームバージョンは、環境変数として設定された AWS Secrets Manager シークレットと AWS Systems Manager Parameter Store パラメータをサポートしています。

注記

Docker および ECS ベースの Docker プラットフォームを除き、Amazon Linux 2 プラットフォームバージョンは複数行変数値をサポートしていません。複数行変数の詳細については、「複数行の値」を参照してください。

料金

Secrets Manager と Systems Manager Parameter Store の使用には、標準料金が適用されます。料金の詳細については、以下のウェブサイトを参照してください。

Elastic Beanstalk では、アプリケーションが環境変数を介して環境シークレットを参照するための料金は発生しません。ただし、Elastic Beanstalk がユーザーに代わってこれらのサービスに対して行うリクエストには、標準料金が適用されます。

シークレットを Elastic Beanstalk 環境変数として設定する

Elastic Beanstalk コンソール、.ebextensions の設定ファイル、AWS CLI、および AWS SDK を使用して、シークレットとパラメータを環境変数として設定できます。

前提条件

シークレットを参照するように環境変数をセットアップする前に、まず次のステップを完了する必要があります。

環境変数設定前の一般的な手順
  1. Secrets Manager シークレットまたは Parameter Store パラメータを作成して、機密データを保存します。詳細については、次のトピックのいずれかまたは両方を参照してください。

  2. シークレットとパラメータをフェッチするために、環境の EC2 インスタンスに必要な IAM アクセス許可をセットアップします。詳細については、「必要な IAM 許可」を参照してください。

コンソールを使用する

Elastic Beanstalk コンソールを使用して、シークレットを環境変数として設定できます。

Elastic Beanstalk コンソールで環境変数としてシークレットを設定するには
  1. Elastic Beanstalk コンソールを開き、[Regions] (リージョン) リストで AWS リージョンを選択します。

  2. ナビゲーションペインで、[環境] を選択し、リストから環境の名前を選択します。

  3. ナビゲーションペインで、[設定] を選択します。

  4. [更新、モニタリング、ログ] の設定カテゴリで、[編集] を選択します。

  5. [ランタイム環境変数] まで下にスクロールします。

  6. [環境変数を追加] を選択します。

  7. [ソース] では、[Secrets Manager] または [SSM Parameter Store] を選択します。

    注記

    ドロップダウンの [プレーンテキスト] オプションの詳細については、「環境プロパティ (環境変数) の設定」を参照してください。

  8. [環境変数名] では、シークレットまたはパラメータ値を保持する環境変数の名前を入力します。

  9. [環境変数値] では、Systems Manager Parameter Store パラメータの ARN または Secrets Manager シークレットを入力します。インスタンスのブートストラップ中に、Elastic Beanstalk は、ステップ 8 で入力した変数の値をこの ARN リソースに保存されている値に対して開始します。

    コンソールは、入力した値が、ステップ 7 で選択したストアの有効な ARN 形式であるかどうかを検証します。ただし、ARN で指定されたリソースの存在や、それにアクセスするために必要な IAM アクセス許可があるかどうかは検証されません。

  10. さらに変数を追加する必要がある場合は、ステップ 6 から ステップ 9 までを繰り返します。

  11. ページの最下部で [適用] を選択し変更を保存します。

.ebextensions のファイルを使用した設定

Elastic Beanstalk 設定ファイルを使用して、シークレットを環境変数として設定できます。aws:elasticbeanstalk:application:environmentsecrets 名前空間を使用して、環境プロパティを定義します。

例 環境シークレットの .ebextensions/options.config (短縮構文)
option_settings: aws:elasticbeanstalk:application:environmentsecrets: MY_SECRET: arn:aws:secretsmanager:us-east-1:111122223333:secret:mysecret MY_PARAMETER: arn:aws:ssm:us-east-1:111122223333:parameter/myparam
例 環境シークレットの .ebextensions/options.config (標準構文)
option_settings: - namespace: aws:elasticbeanstalk:application:environmentsecrets option_name: MY_SECRET value: arn:aws:secretsmanager:us-east-1:111122223333:secret:mysecret - namespace: aws:elasticbeanstalk:application:environmentsecrets option_name: MY_PARAMETER value: arn:aws:ssm:us-east-1:111122223333:parameter/myparam

AWS CLI を使用した設定

AWS コマンドラインインターフェイス (AWS CLI) を使用して、シークレットを Elastic Beanstalk 環境変数として設定できます。このセクションでは、aws:elasticbeanstalk:application:environmentsecrets 名前空間がある create-environment および update-environment コマンドの例を提供します。Elastic Beanstalk がこれらのコマンドが参照する環境の EC2 インスタンスをブートストラップすると、フェッチされたシークレットとパラメータ値を使用して環境変数が初期化されます。Secrets Manager および Systems Manager Parameter Store のそれぞれの ARN からこれらの値をフェッチします。

次の 2 つの例では、create-environment コマンドを使用して、MY_SECRET および MY_PARAMETER という名前の環境変数として設定されたシークレットとパラメータを追加します。

例 環境変数として設定されたシークレットがある create-environment のもの (インラインの名前空間オプション)
aws elasticbeanstalk create-environment \ --region us-east-1 \ --application-name my-app \ --environment-name my-env \ --solution-stack-name "64bit Amazon Linux 2023 v6.5.0 running Node.js 20" \ --option-settings \ Namespace=aws:elasticbeanstalk:application:environmentsecrets,OptionName=MY_SECRET,Value=arn:aws:secretsmanager:us-east-1:111122223333:secret:mysecret \ Namespace=aws:elasticbeanstalk:application:environmentsecrets,OptionName=MY_PARAMETER,Value=arn:aws:ssm:us-east-1:111122223333:parameter/myparam

別の方法として、options.jsonファイルを使用して、インラインで名前空間オプションを含めるのではなく、名前空間オプションを指定します。

例 環境変数として設定されたシークレットがある create-environment のもの (options.json ファイルの名前空間オプション)
aws elasticbeanstalk create-environment \ --region us-east-1 \ --application-name my-app \ --environment-name my-env \ --solution-stack-name "64bit Amazon Linux 2023 v6.5.0 running Node.js 20" \ --option-settings file://options.json
### example options.json ### [ { "Namespace": "aws:elasticbeanstalk:application:environmentsecrets", "OptionName": "MY_SECRET", "Value": "arn:aws:secretsmanager:us-east-1:111122223333:secret:mysecret" }, { "Namespace": "aws:elasticbeanstalk:application:environmentsecrets", "OptionName": "MY_PARAMETER", "Value": "arn:aws:ssm:us-east-1:111122223333:parameter/myparam" } ]

次の例では、MY_SECRET および MY_PARAMETER という名前の環境変数を設定して、既存の環境のシークレットとパラメータを保存します。update-environment コマンドは、create-environment コマンドと同じ構文のオプションをインラインまたは options.json ファイルで渡します。次の例は、前の例でも使用したのと同じ options.json ファイルを使用するコマンドを示しています。

例 環境変数として設定されたシークレットがある update-environment のもの (options.json ファイルの名前空間オプション)
aws elasticbeanstalk update-environment \ --region us-east-1 \ --application-name my-app \ --environment-name my-env \ --solution-stack-name "64bit Amazon Linux 2023 v6.5.0 running Node.js 20" \ --option-settings file://options.json

AWS SDK を使用した設定

AWS SDK を使用して、シークレットとパラメータを環境変数として設定できます。前のセクションで説明した update-environment および create-environment AWS CLI コマンドと同様に、CreateEnvironment および UpdateEnvironment API アクションを使用できます。OptionSettings リクエストパラメータを使用して、aws:elasticbeanstalk:application:environmentsecrets 名前空間のオプションを指定します。

Elastic Beanstalk 環境変数とのシークレット同期のベストプラクティス

このトピックでは、アプリケーションで Secrets Manager または Systems Manager Parameter Store で環境シークレットを使用するためのベストプラクティスを推奨します。シークレットストアデータが更新またはローテーションされた場合、Elastic Beanstalk アプリケーションは更新された値を自動的に受信しません。Elastic Beanstalk は、インスタンスのブートストラップ時にのみシークレットを環境変数にプルします。

環境変数の更新

Elastic Beanstalk 環境をトリガーしてシークレットストアからシークレットの最新の値を再度フェッチするには、UpdateEnvironment または RestartAppServer オペレーションを実行することをお勧めします。これらのオペレーションは、Elastic Beanstalk コンソール、AWS CLI、または Elastic Beanstalk API を使用して実行できます。詳細については、「Elastic Beanstalk の AWS CLI 例」または「AWS Elastic Beanstalk API リファレンス」を参照してください。

シークレット同期に対する自動スケーリング効果の管理

シークレットストアの更新後にスケールアウトイベントまたはインスタンスの置き換えが発生した場合、新しいインスタンスには Secrets Manager または Systems Manager Parameter Store からの最新のシークレット値が含まれます。このようなイベントは、環境内の他のすべてのインスタンスが新しいシークレットを取得するために更新されているわけでもない場合でも発生する可能性があります。

重要

アプリケーションが同じ環境変数に対して 2 つの異なるシークレット値を使用できるようにする必要があります。これにより、Secrets Manager または Systems Manager Parameter Store でシークレットの更新が発生し、その後に環境でスケールアウトまたはインスタンスの置き換えが行われるイベントに対応できますが、他のインスタンスは環境変数の更新を保留中です。更新の待機期間中、すべての環境インスタンスがシークレットストア環境変数に対して同じ値を持つわけではありません。

このようなユースケースの例の 1 つは、データベース認証情報のローテーションです。スケールアウトイベントが認証情報のローテーションに続く場合、新しくブートストラップされたインスタンスによって参照される環境シークレットには、更新されたデータベース認証情報が含まれます。ただし、既存のインスタンスによって参照される環境シークレットは、UpdateEnvironment または RestartAppServer オペレーションによって更新されるまで古い値を保持します。

Amazon Linux 2 環境変数の複数行の値

複数行の値は 2 つ以上の行で構成され、改行文字が含まれます。Docker および ECS ベースの Docker プラットフォームを除き、Amazon Linux 2 で実行されるプラットフォームは、環境変数の複数行の値をサポートしていません

注記

複数行の値を検出すると、Elastic Beanstalk は影響を受ける環境のデプロイに失敗します。

次のオプションは、複数行の問題の回避策または解決策として機能します。

  • Amazon Linux 2 環境を Amazon Linux 2023 にアップグレードします。詳細については、「Amazon Linux 2 から Amazon Linux 2023 への移行」を参照してください。

  • シークレット値から改行文字を削除します。アプローチの 1 つの例は、値をシークレットストアに保存する前に Base64 エンコードを行うことです。次に、アプリケーションは環境シークレット変数から参照するときに、値を元の形式にデコードする必要があります。

  • Secrets Manager または Systems Manager Parameter Store から直接データを取得するようにアプリケーションコードを設計します。詳細については、「Secrets Manager の使用 でのシークレットの取得」または「パラメータ Systems Manager パラメータストアの使用 の取得」を参照してください。