Amazon ECSで環境変数を簡単に設定できると聞いたので試してみる

2018.12.30

Amazon ECSでDockerコンテナを動かしたい

EC2で動いているサービスをDocker化したい。そのために必要なこととしては、環境ごとに異なるDBの接続先やパスワードなどをどうやってコンテナに渡すかを考えることがある。

以前調べたところ、AWS CLIコマンドをコンテナ起動時に実行してキーを読み込んで復号化するという手の込んだ感じの方法ばかり見つかってしまい、なかなか導入に踏み切れていなかった。

たまたま目にした以下の記事で、Amazon ECSでの環境変数の扱いが便利になったと知ったので重い腰を上げて試してみた。

開発環境

  • macOS Mojave 10.14.1
  • Docker Desktop Community 2.0.0.0-mac81 (29211)
  • Docker Engine 18.09.0

試すためのDockerイメージを定義したDockerfileを作成する



$ mkdir ecs_env
$ cd ecs_env
$ touch Dockerfile
$ touch phpinfo.php

Dockerfileには以下の内容を入力して保存する。



# 「php」というイメージの「7-apache」というタグがついたイメージをベースにする
FROM php:7-apache

# Macにあるphpinfo.phpをコンテナの/var/www/htmlにコピーする
COPY phpinfo.php /var/www/html

phpinfo.phpには以下の内容を入力して保存する。



<?php phpinfo();

これで準備完了。DockerfileのビルドはAmazon ECRにプッシュする段階で行う。

Amazon ECRにプッシュする

Amazon ECRにリポジトリを作成する

  • マネジメントコンソールのAmazon ECSの管理画面を開いて、サイドメニューの「Amazon ECR」の下の「リポジトリ」をクリックする。

  • 「リポジトリの作成」をクリックする。

Amazon ECSで環境変数を簡単に設定できると聞いたので試してみる

  • リポジトリ名を入力して「リポジトリの作成」をクリックする。

Amazon ECSで環境変数を簡単に設定できると聞いたので試してみる

  • リポジトリができたら、できたリポジトリをクリックして開いた画面で「プッシュコマンドの表示」をクリックする。

Amazon ECSで環境変数を簡単に設定できると聞いたので試してみる

  • 表示されたプッシュコマンドを一つずつ実行して、ビルドしたイメージをECRにプッシュする。

Amazon ECSで環境変数を簡単に設定できると聞いたので試してみる

ログインするコマンドだけ、AWS CLIのプロファイル機能を使っているので以下のように置き換えて実行した。ecr_sampleというプロファイルにはECRを操作できるポリシーが割り当ててある。



# Before
$(aws ecr get-login --no-include-email --region ap-northeast-1)

# After
$(aws ecr get-login --no-include-email --region ap-northeast-1  --profile=ecr_sample)

Systems Managerを使って環境変数を登録する

  • Systems Managerの管理画面を開いて、左メニューの「パラメータストア」を選択する。
  • 「パラメータの作成」をクリックする。

Amazon ECSで環境変数を簡単に設定できると聞いたので試してみる

  • パラメータの名前と説明と値を入力して作成する。今回は暗号化しない単なる値を試してみようと思うので「文字列」を選択した。

Amazon ECSで環境変数を簡単に設定できると聞いたので試してみる

環境変数と言えば、KEY=VALUEという形式だと思うが、パラメータの名前はこのキーに相当するわけではないらしい。ECSでタスク定義を作成するときに任意のキーに対してこのパラメータを割り当てる形になる模様。

今回はサービス中でHTTPリクエストのエンドポイントを指定するようなユースケースをイメージしてURLを値として設定してみた。(自分のブログ)

作成できると一覧に表示された。

Amazon ECSで環境変数を簡単に設定できると聞いたので試してみる

ECSのタスクがSystems Managerで作成したパラメータにアクセスできるようにIAMロールを作成する

  • IAMの管理画面を開いて、「ロールの作成」をクリックする。
  • 以下のように選択して次へ進む。完全に初見だが、どれを選べば良さそうか丁寧に書かれていて迷わなかった。

Amazon ECSで環境変数を簡単に設定できると聞いたので試してみる

  • ポリシーは自分で作成する。JSON形式で以下のように入力した。



{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ssm:GetParameters"
      ],
      "Resource": "*"
    }
  ]
}

Amazon ECSで環境変数を簡単に設定できると聞いたので試してみる

  • 名前と説明を入力してポリシーを保存する。

Amazon ECSで環境変数を簡単に設定できると聞いたので試してみる

  • 作成したポリシーをロールに割り当てる。フィルタの関係で表示されていないが、「AmazonECSTaskExecutionRolePolicy」も必ず割り当てる。これを割り当てないとECSタスクが起動後すぐに終了してしまう。

Amazon ECSで環境変数を簡単に設定できると聞いたので試してみる

  • ロール名と説明を入力してロールを保存する。

Amazon ECSで環境変数を簡単に設定できると聞いたので試してみる

Amazon ECSでタスク定義を作成する

  • Amazon ECSの管理画面を開いて、左メニューの「タスク定義」を開く。
  • 「新しいタスク定義の作成」をクリックする。

Amazon ECSで環境変数を簡単に設定できると聞いたので試してみる

  • 起動タイプは「Fargate」一択。

Amazon ECSで環境変数を簡単に設定できると聞いたので試してみる

  • タスクとコンテナの定義の設定は以下のように設定した。(以下のスクショではコンテナの部分は未設定)

Amazon ECSで環境変数を簡単に設定できると聞いたので試してみる

  • コンテナの設定項目はたくさんあるが、上の方と環境変数の部分だけ設定すれば良い。

Amazon ECSで環境変数を簡単に設定できると聞いたので試してみる

ここの環境変数の設定が肝。任意のキー名に対して、「valueFrom」を選択してパラメータストアの名前を入力する。

Amazon ECSで環境変数を簡単に設定できると聞いたので試してみる

準備ができたらタスク定義を作成する。

Amazon ECSでクラスターを作成する

  • Amazon ECSの管理画面を開き、左メニューの「クラスター」から「クラスターの作成」を選択する。

Amazon ECSで環境変数を簡単に設定できると聞いたので試してみる

  • クラスターテンプレートは「ネットワーキングのみ」を選択する。

Amazon ECSで環境変数を簡単に設定できると聞いたので試してみる

  • 任意のクラスター名を指定して作成する。

Amazon ECSで環境変数を簡単に設定できると聞いたので試してみる

Amazon ECSでタスクを起動する

  • 作成したクラスターを選択して、「タスク」タブの「新しいタスクの実行」をクリックする。

Amazon ECSで環境変数を簡単に設定できると聞いたので試してみる

  • タスクの設定を適宜行い、「タスクの実行」をクリックする。

Amazon ECSで環境変数を簡単に設定できると聞いたので試してみる

  • クラスターの「タスク」タブに行が増えて、「前回のステータス」が「PROVISIONING」→「PENDING」→「RUNNING」と変化するのを見守る。

Amazon ECSで環境変数を簡単に設定できると聞いたので試してみる

コンテナにHTTPアクセスしてみる

  • RUNNING状態になったタスクをクリックする。

Amazon ECSで環境変数を簡単に設定できると聞いたので試してみる

  • 「Network」のエリアの「Public IP」を使ってhttp://XXX.XXX.XXX.XXX/phpinfo.phpにアクセスする。

Amazon ECSで環境変数を簡単に設定できると聞いたので試してみる

無事phpinfo.phpが表示されて、環境変数API_ENDPOINTが設定されていることが確認できた。

感想

暗号化した環境変数もほぼ同じ手順でコンテナに渡せるとのことなので、DBサーバーのホスト名・ユーザー名・DB名・パスワードなどは全部問題なく渡せそう。あとは、ECSのタスク定義やタスクの実行をいかにバージョニングしつつ手作業で行わないかがわかればもう本番での運用は目前かも。

今回の試行錯誤でIAMロールやECSの設定にかなり慣れることができた。自分で手を動かしてみることって大切。