Docker と ecs の連携を少し掘り下げる
Docker と AWS ECS の連携でハマって、公式サイト等含めて情報も少なかったので、久々に書いてみます。
まずは、下記のサイト(見たのは主にオリジナルの英語版)等を参考に、docker から ecs のデプロイを試してみました。
docker context create ecs コンテキスト名
とやって、AWS の認証情報を設定し、
docker context use コンテキスト名
でコンテキストを切り替えて、
docker compose up
(※ ハイフンがないことに注意)とすると、ECS にクラスタやタスク、ロードバランサが自動で作られて、デプロイされます。
ここまでを前提に、ハマった点などをいくつか取り上げます。
IAMの権限がさらに追加で必要
上記サイトの「前提条件」にあるパーミッションをつけてみましたが、足りませんでした(その後更新等されているかもしれません)。手元にリストがないですが、事項すると足りない権限がエラーに表示されるので、一つずつ追加して、さらにEC2のフルの権限をつけて、ようやく利用できました。
VPCとロードバランサーの指定について
VPC は x-aws-vpc、ロードバランサーはx-aws-loadbalancer で指定できるとあります。これで、独自に作ったVPCやロードバランサーに、ECSのクラスタを紐づけることができます。(クラスタも同様に指定できるようですが、未検証)。
例がなくて、分かりにくかったのですが、docker-compose.yml のトップのレイヤー、つまり、下記のような階層になります。私がドキュメントを見たときは、VPCはVPCのARNという表記が見えましたが、IDでした。
version: "3"
x-aws-loadbalancer: ロードバランサーのARN
services:
(略)
DooD (Docker out of Docker) 環境での実行について
CI/CD まわりを整えようと、docker 内でビルドできるようにするために、さらにいくつかトピックがあります。DinDでも同様のことが必要かと思います。
linux での実行方法
Docker と AWS の連携は、compose-cli というのが実態のようですが、Window、Mac の Docker Desktopには含まれているものの、Docker Engine には含まれていないようで、別途インストールが必要です。手順は下記のページにありますが、注意点があるので次の項目に続きます。
docker イメージでの実行
上記リンク内に、install script がありますが、docker 公式イメージ(あるいはdocker/compose のイメージ)では動作しませんでした。compose-cliのインストールスクリプトは /usr/bin に docker がインストールされていることが前提ですが、公式イメージでは /usr/local/bin にインストールされているためです。
manual install の手順だとうまく動作しました。
私の場合、docker-linux-amd64.tar.gz を解凍したものを /docker ディレクトリに配置したのですが、
ln -s /usr/local/bin/docker /usr/local/bin/com.docker.cli
としたうえで、docker 実行時は、docker ではなく、 配置した方の /docker/docker で実行します。
docker context create を対話なしで実行
docker context create ecs コンテキスト名 --profile AWSのプロファイル名
とすることで、対話なしで実行できました(ドキュメントが見当たらず、github での提案をもとに試してみたらできた…)
話がそれますが、プロファイルは .aws をコンテナに取り込むことで利用できます。
以上、疲れました…