2018.12.30
EC2で動いているサービスをDocker化したい。そのために必要なこととしては、環境ごとに異なるDBの接続先やパスワードなどをどうやってコンテナに渡すかを考えることがある。
以前調べたところ、AWS CLIコマンドをコンテナ起動時に実行してキーを読み込んで復号化するという手の込んだ感じの方法ばかり見つかってしまい、なかなか導入に踏み切れていなかった。
たまたま目にした以下の記事で、Amazon ECSでの環境変数の扱いが便利になったと知ったので重い腰を上げて試してみた。
$ 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 ECSの管理画面を開いて、サイドメニューの「Amazon ECR」の下の「リポジトリ」をクリックする。
「リポジトリの作成」をクリックする。
ログインするコマンドだけ、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)
環境変数と言えば、KEY=VALUE
という形式だと思うが、パラメータの名前はこのキーに相当するわけではないらしい。ECSでタスク定義を作成するときに任意のキーに対してこのパラメータを割り当てる形になる模様。
今回はサービス中でHTTPリクエストのエンドポイントを指定するようなユースケースをイメージしてURLを値として設定してみた。(自分のブログ)
作成できると一覧に表示された。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssm:GetParameters"
],
"Resource": "*"
}
]
}
ここの環境変数の設定が肝。任意のキー名に対して、「valueFrom」を選択してパラメータストアの名前を入力する。
準備ができたらタスク定義を作成する。
http://XXX.XXX.XXX.XXX/phpinfo.php
にアクセスする。無事phpinfo.php
が表示されて、環境変数API_ENDPOINT
が設定されていることが確認できた。
暗号化した環境変数もほぼ同じ手順でコンテナに渡せるとのことなので、DBサーバーのホスト名・ユーザー名・DB名・パスワードなどは全部問題なく渡せそう。あとは、ECSのタスク定義やタスクの実行をいかにバージョニングしつつ手作業で行わないかがわかればもう本番での運用は目前かも。
今回の試行錯誤でIAMロールやECSの設定にかなり慣れることができた。自分で手を動かしてみることって大切。