できればインフラ構成についてもコード化したいため、CodeBuildのbuildspecでECSの設定を記述/更新しています。
このため、ECSの設定画面でポチポチと変更、検証することも可能ですが、Githubへのpush、CodeBuildで更新がかかると、ECSへの変更も元に戻ります。 (検証のために、ちょっとだけECS側で変更するのは無害です)
恒久的な変更はCodeBuild側へ変更するようにしましょう。
下記の手順はローカルでDockerイメージをダウンロードして検証する方法です。 「こうすると効率が良かった」というレベルのものです。
作業の流れ
- ECRからイメージダウンロード
- Mac上でコンテナを起動し、いろいろ検証( Dockerfileに必要な変更の検討など )
- 必要な修正が決まったら、Githubのtestブランチにpush
- Githubの testブランチへpushされるとCodeBuildでdocker buildが始まり、ECRにpushされる
- ECRのDockerレポジトリのイメージIDをメモ
- ECSで起動しているコンテナを変更して動作確認を行う という流れになります。
イメージをローカルにダウンロードする
プライベートなDockerレポジトリ(ECR)への認証を済ませる必要があります
認証情報の取得
eval (aws ecr get-login –profile=profile名 –no-include-email –region ap-northeast-1)
手元で実行
(2019/02/22の内容で、環境変数などは将来的に変更する可能性があります)
docker run -p 10022:22 -e GITHUB_ENV=env25 -e AWS_ACCESS_KEY_ID=XXXXXXXXXXX -e AWS_SECRET_ACCESS_KEY=YYYYYYYYYYYYYY -it 11111111.dkr.ecr.ap-northeast-1.amazonaws.com/image-name:latest /bin/bash
-p 10022:22 : リモートにSSHログインできるようにdocker内にsshdを立てました(将来的にはssmに切り替えたいですが)、sshdがlistenするポートが22番ポートなのですが、これをMacの10022にポートフォワードしています
-e GITHUB_ENV=env25 : ECSで「どの環境を更新するか」を指定しています(Githubの「どのブランチを読み込むのか?」にも使っています)
-it : Dockerコンテナに入ってCLIを利用したい時に使うオプションです
111111.dkr.ecr.ap-northeast-1.amazonaws.com/php-fpm:latest : 最新イメージの場合はlatestを指定しますが、トラブルシューティングの時には必要なタグを指定してください
/bin/bash : Dockerコンテナで実行するプログラムを指定します。今回はCLIをつかって調査したいので、/bin/bashを利用しています( /bin/bashをインストールしていないコンテナの場合は /bin/ash をお使いください )
検証が終わって「開発サーバ郡の標準のDockerイメージとして使いたくなった」ら
ECSで起動する際のdockerイメージですが、タスク定義で起動するDockerイメージのタグをstable
11111.dkr.ecr.ap-northeast-1.amazonaws.com/php-fpm:stable としています(デフォルトはlatestです)
ですので、ECSでの起動イメージを変更する場合は、 Dockerイメージのタグを変更します。
docker tag '11111.dkr.ecr.ap-northeast-1.amazonaws.com/php-fpm:latest' '898115053391.dkr.ecr.ap-northeast-1.amazonaws.com/php-fpm:stable'
docker push '11111.dkr.ecr.ap-northeast-1.amazonaws.com/php-fpm:stable'
なぜ「参照するDockerイメージはlatestではなくstableにしているか?」の背景
以前はデフォルトのlatestで行っていたのですが、これだと、Dockerイメージの検証をしている(つまりlatestが検証中の)タイミング)で、 Githubにpushがあると、その開発環境も不安定なlatestに切り替わってしまいます。 これはDockerの検証のスピードを著しく下げます(開発者がいない時間にしか検証できない、とか、pushされるとイメージを昔のものに切り戻さないといけない、とか) このため別のタグを指定し、latestは自由に切り替わっても大丈夫なようにしています。
Dockerイメージのタグはどこで指定しているのか?
- dockerイメージはECSのタスク定義で設定している
- ECSタスク定義はCodeBuildのbuildspecで設定している ので、CodeBuildのbuildspecで設定してます。
ある環境だけ少し新しいDockerイメージを試したい
CodeBuild, ECSタスク定義の参照するイメージを変更してください。一時的な検証であれば
11111.dkr.ecr.ap-northeast-1.amazonaws.com/image-name:73f8947 の 73f8947 のようなイメージのIDで指定するのもありです。