Docker と ecs の連携を少し掘り下げる

Docker と AWS ECS の連携でハマって、公式サイト等含めて情報も少なかったので、久々に書いてみます。

 

まずは、下記のサイト(見たのは主にオリジナルの英語版)等を参考に、docker から ecs のデプロイを試してみました。

matsuand.github.io

 

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 のトップのレイヤー、つまり、下記のような階層になります。私がドキュメントを見たときは、VPCVPCのARNという表記が見えましたが、IDでした。

version: "3"

x-aws-vpc: VPCのID

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 には含まれていないようで、別途インストールが必要です。手順は下記のページにありますが、注意点があるので次の項目に続きます。

github.com

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 をコンテナに取り込むことで利用できます。

 

以上、疲れました…