Docker Compose for Amazon ECSを試す

概要

下記記事にありますとおり、Docker Compose to ECS pluginを用いることで
これまでDocker Composeで起動していたコンテナ群をECSへデプロイすることが可能となります。

サンプルアプリケーション

動作確認をおこなうため公式のサンプルアプリケーションを利用させてもらいます。

下準備

Contextの確認

以下コマンドで現在のContextを確認します。

docker context list

表示結果例

$ docker context list
NAME                TYPE                DESCRIPTION                               DOCKER ENDPOINT               KUBERNETES ENDPOINT               ORCHESTRATOR
default *           moby                Current DOCKER_HOST based configuration   unix:///var/run/docker.sock   https://xxx.xxx.xxx.xxx (default)   swarm

ECS用のContext作成

以下コマンドで ecstest というContextを新規作成します。

docker context create ecs ecstest

表示結果例

? Create a Docker context using:  [Use arrows to move, type to filter]
> An existing AWS profile
  AWS secret and token credentials
  AWS environment variables

対話形式のプロンプトが表示されます。

> An existing AWS profile を選択します。

? Create a Docker context using: An existing AWS profile
? Select AWS Profile  [Use arrows to move, type to filter]
> default

どのAWS Profileを使用するか選択肢が表示されます。

> default を選択します。

? Create a Docker context using: An existing AWS profile
? Select AWS Profile default
Successfully created ecs context "ecstest"

無事選択が完了すると上記のような表示になります。

再度Contextを確認

再度下記コマンドでContextを確認します。

docker context ls

表示結果例

$ docker context ls
NAME                TYPE                DESCRIPTION                               DOCKER ENDPOINT               KUBERNETES ENDPOINT               ORCHESTRATOR
default *           moby                Current DOCKER_HOST based configuration   unix:///var/run/docker.sock   https://xxx.xxx.xxx.xxx (default)   swarm
ecstest             ecs

ecstest というContextが追加されていることを確認します。

Contextを選択

現在まだ ecstest というContextが追加されただけで有効状態となっていないため、 以下コマンドでContextを有効化します。

docker context use ecstest

表示結果例

$ docker context use ecstest
ecstest

Contextを確認

再度Contextを確認すると ecstest* マークが付いて有効状態になっていることが分かります。

docker context list

表示結果例

 $ docker context list
NAME                TYPE                DESCRIPTION                               DOCKER ENDPOINT               KUBERNETES ENDPOINT               ORCHESTRATOR
default             moby                Current DOCKER_HOST based configuration   unix:///var/run/docker.sock   https://xxx.xxx.xxx.xxx (default)   swarm
ecstest *           ecs

ECR認証

以下コマンドを実行してECRの認証を事前に済ませてください。

aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com

※リージョンやリポジトリURLはご自身ものと読み替えてください。

表示結果

Login Succeeded

docker-compose.yml の以下を修正

冒頭でご紹介しましたサンプルアプリケーションdocker-compose.yml を以下のように編集してください。

    x-aws-pull_credentials: <<<your arn for your secret you can get with docker ecs secret list>>>

削除


    image: <<<your docker hub user name>>>/timestamper

    image: xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/example

コンテナのビルド

docker compose build

表示例

backend uses an image, skipping
Building frontend
[+] Building 48.7s (11/11) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                                           0.3s
 => => transferring dockerfile: 273B                                                                                                                                                           0.0s
 => [internal] load .dockerignore                                                                                                                                                              0.0s
 => => transferring context: 2B                                                                                                                                                                0.0s
 => [internal] load metadata for docker.io/library/python:3.7-alpine                                                                                                                           5.1s
 => [auth] library/python:pull token for registry-1.docker.io                                                                                                                                  0.0s
 => [internal] load build context                                                                                                                                                              0.1s
 => => transferring context: 6.03kB                                                                                                                                                            0.0s
 => [1/5] FROM docker.io/library/python:3.7-alpine@sha256:210d832835bdgfe6c8e9f5d9ced848cf5f0e12211d39af52f0583b31f1bd197e                                                                    30.9s
 => => resolve docker.io/library/python:3.7-alpine@sha256:210d832835b56fe6c8e9f5d9cehgt48cf5f0e12211d39af52f0583b31f1bd197e                                                                     0.0s
 => => sha256:93ac4b41defece5c1a3aa47ac94370ff375e952ee425987fcd4601988ed6c840 7.85kB / 7.85kB                                                                                                 0.0s
 => => sha256:5843afab387455b37944e709ee8c78d7520df80f8d01cf7f8617nh63beeddb6b 2.81MB / 2.81MB                                                                                                12.0s
 => => sha256:1174600ee52d100500456dc0a808ba63ee6961c12e35603cf43c8oaq7c1e037ec 281.51kB / 281.51kB                                                                                             3.8s
 => => sha256:437edbe431b956a80d5c50783f7d5415c83187b0f74deb1e6be15dkgwee489eb 10.58MB / 10.58MB                                                                                              28.6s
 => => sha256:210d832835b56fe6c8e9f5d9ced848cf5f0e12211d39af52f0583b319jrtd197e 1.65kB / 1.65kB                                                                                                 0.0s
 => => sha256:74bea4dba75d8ceca71f194565de5b5e39991861b417b1428f0kg9bc6ecd4065 1.37kB / 1.37kB                                                                                                 0.0s
 => => sha256:1416265535ec68c82e9b39da6f113db62431d1d93641a871137fa6f14b126872 232B / 232B                                                                                                     4.2s
 => => sha256:dbf9391f7b29a85e3073a96afee48c33cd204ebf4979e282c1c324d4e551hhe6 2.35MB / 2.35MB                                                                                                18.4s
 => => extracting sha256:5843afab387455b37944e709ee8c78d7520df80f8d01cf7f861pok63beeddb6b                                                                                                      0.6s
 => => extracting sha256:1174600ee52d100500456dc0a808ba63ee6961c12e35603cmhyc8207c1e037ec                                                                                                      0.2s
 => => extracting sha256:437edbe431b956a80d5c50783f7d5415c83187b0f74deb1e6bpatd3b1ee489eb                                                                                                      1.2s
 => => extracting sha256:1416265535ec68c82e9b39da6f113db62431d1d93641a87mki7fa6f14b126872                                                                                                      0.0s
 => => extracting sha256:dbf9391f7b29a85e3073a96afee48c33cd204ebf4979e28165c324d4e55180e6                                                                                                      0.5s
 => [2/5] WORKDIR /app                                                                                                                                                                         0.9s
 => [3/5] COPY requirements.txt /app                                                                                                                                                           0.1s
 => [4/5] RUN pip3 install -r requirements.txt                                                                                                                                                10.5s
 => [5/5] COPY . /app                                                                                                                                                                          0.1s
 => exporting to image                                                                                                                                                                         0.5s
 => => exporting layers                                                                                                                                                                        0.5s
 => => writing image sha256:0570776b094200efc8798a5566bc3cedbabc5qyc0ee728de34450eab67964918                                                                                                   0.0s
 => => naming to xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/example:latest                                                                                                            0.0s

ECRへpush

以下コマンドでECRへイメージをpushします。

docker-compose push

表示結果例

$ docker-compose push
Pushing frontend (xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/example:latest)...
The push refers to repository [xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/example]
f760601fbeaf: Pushed
aa72e78c2b9c: Pushed
494997b28f0c: Pushed
633f227y15e9: Pushed
c1bf34232224: Pushed
cbce3a4hccab: Pushed
761ad82fb613: Pushed
97c7d4badd08: Pushed
72e830andff5: Pushed
latest: digest: sha256:710ef7409a8ced381d9903b47adbccd43f2a2boijnc47aab3d09b823d1d5d51e3 size: 2201

ECRリポジトリを確認

以下コマンドでECRのリポジトリを確認して正常にイメージがpushされているか確認します。

aws ecr list-images --repository-name example

表示結果例

$ aws ecr list-images --repository-name example
{
    "imageIds": [
        {
            "imageDigest": "sha256:710ef7409a8ced381d9903b47adbccd43f2a2b469c470633d09b823d1d5d51e3",
            "imageTag": "latest"
        }
    ]
}

ECSへデプロイ

以下コマンドでECSへデプロイをおこないます。

$ docker compose up

表示結果例

$ docker compose up
WARNING services.build: unsupported attribute
[+] Running 18/18
 ⠿ example                        CreateComplete                                                                                                                                             263.0s
 ⠿ LoadBalancer                   CreateComplete                                                                                                                                             153.9s
 ⠿ CloudMap                       CreateComplete                                                                                                                                              48.2s
 ⠿ Cluster                        CreateComplete                                                                                                                                               8.2s
 ⠿ FrontendTCP5000TargetGroup     CreateComplete                                                                                                                                               1.2s
 ⠿ DefaultNetwork                 CreateComplete                                                                                                                                               8.2s
 ⠿ BackendTaskExecutionRole       CreateComplete                                                                                                                                              15.8s
 ⠿ LogGroup                       CreateComplete                                                                                                                                               2.1s
 ⠿ FrontendTaskExecutionRole      CreateComplete                                                                                                                                              16.5s
 ⠿ DefaultNetworkIngress          CreateComplete                                                                                                                                               0.0s
 ⠿ Default5000Ingress             CreateComplete                                                                                                                                               0.0s
 ⠿ BackendTaskDefinition          CreateComplete                                                                                                                                               5.4s
 ⠿ FrontendTaskDefinition         CreateComplete                                                                                                                                               1.8s
 ⠿ FrontendServiceDiscoveryEntry  CreateComplete                                                                                                                                               2.0s
 ⠿ BackendServiceDiscoveryEntry   CreateComplete                                                                                                                                               2.0s
 ⠿ BackendService                 CreateComplete                                                                                                                                              79.5s
 ⠿ FrontendTCP5000Listener        CreateComplete                                                                                                                                               3.3s
 ⠿ FrontendService                CreateComplete                                                                                                                                              97.3s

LoadBalancerのエンドポイント確認

以下コマンドでECSにデプロイをおこなったコンテナのエンドポイントを確認することが出来ます。

docker compose ps

表示結果例

$ docker compose ps
NAME                                            SERVICE             STATUS              PORTS
task/example/afd1257f2411475fakoa5647de8ddbfb   frontend            Running             examp-LoadB-XXXXX-xxxxx.elb.ap-northeast-1.amazonaws.com:5000->5000/tcp
task/example/ea9d2b531f794a4ba6vvx2a03c63cdad   backend             Running

ブラウザでエンドポイントへアクセス

先程確認したエンドポイントにブラウザからアクセスします。

表示結果例

f:id:tsunokawa:20210713003827p:plain

リソースの削除

以下コマンドで関連リソースが一括で削除されます。

docker compose down

表示結果

$ docker compose down
[+] Running 18/18
 ⠿ example                        DeleteComplete                                                                                                                                             513.5s
 ⠿ DefaultNetworkIngress          DeleteComplete                                                                                                                                               1.0s
 ⠿ Default5000Ingress             DeleteComplete                                                                                                                                               1.0s
 ⠿ FrontendService                DeleteComplete                                                                                                                                             386.0s
 ⠿ FrontendServiceDiscoveryEntry  DeleteComplete                                                                                                                                               0.6s
 ⠿ BackendService                 DeleteComplete                                                                                                                                              64.5s
 ⠿ FrontendTCP5000Listener        DeleteComplete                                                                                                                                               1.2s
 ⠿ FrontendTaskDefinition         DeleteComplete                                                                                                                                               0.6s
 ⠿ FrontendTaskExecutionRole      DeleteComplete                                                                                                                                               1.0s
 ⠿ LoadBalancer                   DeleteComplete                                                                                                                                               0.9s
 ⠿ FrontendTCP5000TargetGroup     DeleteComplete                                                                                                                                               0.9s
 ⠿ BackendTaskDefinition          DeleteComplete                                                                                                                                               1.8s
 ⠿ DefaultNetwork                 DeleteComplete                                                                                                                                              59.3s
 ⠿ Cluster                        DeleteComplete                                                                                                                                               0.9s
 ⠿ BackendServiceDiscoveryEntry   DeleteComplete                                                                                                                                               0.9s
 ⠿ CloudMap                       DeleteComplete                                                                                                                                              46.0s
 ⠿ LogGroup                       DeleteComplete                                                                                                                                               1.2s
 ⠿ BackendTaskExecutionRole       DeleteComplete                                                                                                                                               2.1s

上記でDocker ComposeでECSへデプロイ及びリソースの後片付けまで動作の確認が出来ました。