AWS
ElasticBeanstalk
docker

Elastic Beanstalk で環境ごとにコンテナに環境変数を設定する

この記事は?

AWS の Elastic Beanstalk で動作する Docker コンテナに対して、環境ごとに異なる環境変数を設定する方法を説明します。

対象のプラットフォーム

この手法は、Elastic Beanstalk の

のどちらのプラットフォームに対しても利用可能です。

補足

「複数コンテナの Docker 環境」の場合、Dockerrun.aws.json を使って Docker コンテナに環境変数を設定することは可能です。

{
  "AWSEBDockerrunVersion": 2,
  "containerDefinitions": [
    {
      "name": "php-app",
      "image": "php:fpm",
      "environment": [ // ここに設定する
        {
          "name": "MY_ENV_VARIABLE",
          "value": "test"
        }
      ],
      "essential": true,
      "memory": 128
    }
  ]
}

しかし、この方法では環境ごとに異なる値を設定できません。 Dockerrun.aws.json は環境ごとに変えることはできないからです(環境ごとに専用のアプリケーションバージョンを作成する場合は別ですが…)。

やり方

Elastic Beanstalk の環境に対する「設定」の中にある環境プロパティに環境変数を設定します。

ここに設定するとシステムが自動的に Docker コンテナに環境変数を設定してくれます。Dockerrun.aws.json に対する作業はとくにありません。

詳細

環境のダッシュボードを開き、「設定」をクリックします。

 
「設定」の中の「ソフトウェア」をクリックします。
2.png

 
「環境プロパティ」を設定します。
3.png

確認

「環境プロパティ」で設定した値が Docker コンテナに設定されているかを確認します。

インスタンスでの確認

まず、Docker コンテナが動作しているインスタンス上で「環境プロパティ」が正しく設定されているかを確認します。

Elastic Beanstalk で管理されるインスタンスには「環境プロパティ」を確認するためのコマンドが用意されています。それを使って環境プロパティが正しく設定されているかを確認することができます。

立ち上がっているインスタンスにログインしたあとで、次のコマンドを実行します。

コマンド
[ec2-user]$ sudo /opt/elasticbeanstalk/bin/get-config environment
実行結果
{"MY_ENV_VARIABLE":"test"}

実行結果を見ると MY_ENV_VARIABLE が正しく設定されていることが確認できました。

Docker コンテナでの確認

次に、実行している Docker コンテナに環境変数が設定されているかを確認します。

動作している Docker コンテナに対し echo コマンドを実行します。

立ち上がっているインスタンスにログインしたあとで、次のコマンドを実行します。

コマンド
[ec2-user]$ sudo docker exec CONTAINER_ID sh -c 'echo $MY_ENV_VARIABLE'
実行結果
test

正しく設定されていることが確認できました。

補足

単一コンテナの Docker 環境ではコンテナの実行は、次のスクリプトで行われています。

  • /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh

中身を見てみると 「環境プロパティ」が、Docker コンテナの環境変数に渡されている処理を確認することができます。

一方、複数コンテナの Docker 環境は AWS Elastic Container Service (ECS) を利用しており、ECS 管理画面の「タスク定義」を見ると「環境プロパティ」 がコンテナの環境変数として設定されていることが分かります。