Amazon-Elastic-Container-Service

ECSコンテナに環境変数を設定する3つの方法

はじめに

こんにちは、omkです。
コンテナぼちぼち勉強中です。

ECSタスク定義を作成する際にDBの接続情報等を環境変数でコンテナに渡すことがあると思います。
このとき、3つの方法を用いてコンテナに環境変数を渡すことが出来ます。

本記事ではその3つの方法でそれぞれ環境変数をコンテナに渡せることを確認していきます。

説明

ECSコンテナには以下の3つの方法で環境変数を設定することが出来ます。

  1. ベタ書き
  2. S3からインポート
  3. パラメータストア/Secrets Managerからインポート

1のベタ書きは、直接変数名と値を1つずつ指定してECSに設定する方法です。

2のS3からインポートする方法は、S3バケット中のオブジェクトのパスを指定してenvファイルから変数を設定する方法です。
ファイル中に複数の変数名と値を指定して一括でECSに読み込むことが出来ます。

3のパラメータストア/Secrets Managerからインポートする方法は、SSMパラメータストアもしくは、Secrets Managerに値を設定しておき、環境変数名に対応したパスやARNをECSに設定することで値を取得します。
パスワードなどの直接書き込むべきでない変数をセキュアに渡す際に活用できます。

やってみた

コンテナにWEBからアクセスしたときに設定した環境変数を表示させるページを仕込んで動作を確認します。
ここでは「hoge」「fuga」「piyo」の3つの環境変数を扱います。

<html>
    <body>
        <?php echo $_ENV["hoge"]; ?><br>
        <?php echo $_ENV["fuga"]; ?><br>
        <?php echo $_ENV["piyo"]; ?><br>
    </body>
</html>

環境変数の設定はタスク定義中のコンテナ定義から設定出来ます。
それぞれの設定方法で環境変数を設定できることを確認していきます。

1. ベタ書き

環境の環境変数欄に直接書き込みます。

「hoge」「fuga」「piyo」の値にそれぞれ「hogehoge」「fugafuga」「piyopiyo」と入れました。
タスクを起動して確認してみます。

ちゃんと設定されていることがわかります。

2. S3からインポート

適当にS3バケットを作成して以下の内容のファイルをバケットにアップロードします。

omk-env.env

#This is a comment and will be ignored
hoge=hogehoge
fuga=fugafuga
piyo=piyopiyo

注意点はこちらに記載されていますが、特筆すべきは、ファイル拡張子が「.env」であること、文字コードが「UTF-8」であることです。
あと先頭行がなぜか適切に読み込まれなかったので先頭にはコメント文を設定しています。

では、タスク定義を更新していきます。
1で設定していたベタ書きの環境変数を削除してS3のARNで指定するように変更します。

このとき、タスク実行ロールに対象オブジェクトへの読み取り権限が必要となります。

↓参考
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/taskdef-envfiles.html#taskdef-envfiles-iam

ポリシーを作成してロールに割り当てます。

では、タスクを起動して確認してみます。

ちゃんと設定されていることがわかります。

3. パラメータストア/Secrets Managerからインポート

最後はSSMパラメータストアやSecrets Managerに値を登録しておく方法です。

それぞれ別の内容でも取得できることを確認するために、

「hogehoge」はパラメータストアの「/omk-env/hoge」に「String」として、
「fugafuga」はパラメータストアの「/omk-env/fuga」に「SecureString」として、
piyoはSecrets Managerの「/omk-env/piyo」にシークレット「piyo: piyopiyo」として設定しました。

タスク実行ロールで必要な権限についてはそれぞれ以下を参照ください。

↓パラメータストア
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/specifying-sensitive-data-parameters.html#secrets-iam-parameters

↓Secrets Manager
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/specifying-sensitive-data-secrets.html#secrets-iam

パラメータストアの値に関しては同じリージョンならパスかARNで、異なるリージョンならARNで取得できます。
Secrets Managerの値はARNで取得出来ます。このときシークレットに設定した特定のキー(この場合、piyo)のみ取得する場合はARNの最後にキーを付けて取得することが出来ます。
今回の例だと
「arn:aws:secretsmanager:{リージョン}:{アカウントID}:secret:/omk-env/piyo:piyo::」
です。

↓参考
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/specifying-sensitive-data-secrets.html#secrets-envvar

では設定します。
1で環境変数を設定した際の「Value」を「ValueFrom」に変更することでパラメータストアやシークレットから値を取得できます。

では、タスクを起動して確認してみます。

ちゃんと設定されていることがわかります。

おわりに

ECSへの環境変数の渡し方をそれぞれ試してみました。
状況に合った方法で適切に設定したいですね。

以上、お付き合いありがとうございました。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA