Docker Compose で ECS にアプリケーションをデプロイする

# 初めに

本日 `docker-compose` を使ってみた記事を書いたので、AWS ECS でも使えないかと調べたところ、ブログで見つけました。いずれ使うときが来るかもしれないのでメモとして残しておきます。

https://qiita.com/quryu/items/9ccda430f1ef90efd333

こちらが AWS ECS に Docker Compose でアプリケーションをデプロイする公式ブログになります。

https://aws.amazon.com/jp/blogs/containers/deploy-applications-on-amazon-ecs-using-docker-compose/

以下の記事も参考にしました。デプロイの詳細な手順について非常にわかりやすく書かれております。

https://qiita.com/Rubyist_SOTA/items/1ead200bf602569804ea

# 準備

Linux で Docker Compose CLI を使用するための前提条件があります。

>1 . Docker Desktop 最新版をダウンロードしインストールしていることが必要です。
>
- Download for Mac
- Download for Windows
>
あるいは Docker Compose CLI for Linux をインストールしていることが必要です。
>
2 . AWS アカウントを持っていることが必要です。

こちらのドキュメントを参考にインストールスクリプトを使用します。

```
curl -L https://raw.githubusercontent.com/docker/compose-cli/main/scripts/install/install_linux.sh | sh
```

# AWS コンテキストの生成

このコンテキストにより AWS への認証を行います。`aws configure` コマンドで認証情報をローカルに登録後、以下のコマンドを実行します。

```
docker context create ecs myecscontext
```

なお、このコマンド実行時、以下のエラーが発生しました。インスタンスに再ログインしたところ、正常に動作しました。

```
"docker context create" requires exactly 1 argument. when docker context create ecs myecscontext is executed
```

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

```
[ec2-user@ip-172-31-39-188 compose]$ docker context create ecs myecscontext
? Create a Docker context using:  [Use arrows to move, type to filter]
> An existing AWS profile
  AWS secret and token credentials
  AWS environment variables
```

# ECS へデプロイ

以下の記事で使用したアプリケーションを使用します。

https://qiita.com/quryu/items/9ccda430f1ef90efd333

編集前

```yml:docker-compose.yml
version: '3'
services:
  web:
    build: .
    ports:
     - "8080:5000"
    volumes:
     - .:/code
  redis:
    image: "redis:alpine"
```

編集後

```yml:docker-compose.yml
version: '3'
services:
  web:
    image: "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/web-app:latest"
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"
```

flask イメージはビルドではなく、ECR にプッシュしておきます。

ポート番号を `5000:5000` に変更したのは、`docker compose up` コマンド実行時に以下のエラーが発生したためです。

```
published port can't be set to a distinct value than container port: incompatible attribute
```

コンテキストを切り替えます。

```
docker context use myecscontext
```

現在のコンテキストを確認するには `docker context ls` コマンドを実行します。

```
[ec2-user@ip-172-31-39-188 compose]$ docker context ls
NAME                TYPE                DESCRIPTION                               DOCKER ENDPOINT               KUBERNETES ENDPOINT   ORCHESTRATOR
default             moby                Current DOCKER_HOST based configuration   unix:///var/run/docker.sock                         swarm
myecscontext *      ecs
```

コンテキストを切り替えた後ですが、通常の docker コマンドは使用できなくなるようです。例えば `docker ps` は使えなくなりました。

```
[ec2-user@ip-172-31-39-188 compose]$ docker ps
Command "ps" not available in current context (myecscontext)
```

こういった場合、コンテキストをデフォルトに戻します。

```
docker context use default
```

compose コマンドで ECS ヘアプリケーションをデプロイします。

```
docker compose up
```

以下はコマンド実行中です。完了すると、すべて青色に変わり、ユーザー入力を受け付けるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/2e53d9b3-6b0d-de44-a33e-822bf0eff8dd.png)

デプロイの後、`http://NLB の DNS 名:ポート番号` にアクセスします。これは例えば以下のような URL です。

```
http://compo-loadb-1grujljfn1mmd-06b3d6a23c13c06a.elb.ap-northeast-1.amazonaws.com:5000/
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/cdbcf1a1-e63f-08d7-acef-b6443a1e6db7.png)

リソース削除には以下のコマンドを実行します。

```
docker compose down
```

# AWS リソースの確認

`docker compose up` によって新規に作成されたリソースを確認します。VPC、サブネット、セキュリティグループはデフォルトのものが用いられていました。

- クラスター

クラスター名ですが、ローカルマシンの `docker-compose.yml` ファイルが存在するディレクトリのディレクトリ名が付けられていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/1ad69384-3577-d4ac-ccc0-ba847647b7da.png)

- サービス

flask タスクと redis タスクのサービスがそれぞれ作成されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/2bfd9577-9368-17ee-4d57-0b703bdf8e8e.png)

- NLB

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/fb83d4e4-e9bb-6199-a358-d217044af1af.png)


# 参考記事

https://aws.amazon.com/jp/blogs/containers/deploy-applications-on-amazon-ecs-using-docker-compose/

https://matsuand.github.io/docs.docker.jp.onthefly/cloud/ecs-integration/

https://qiita.com/Rubyist_SOTA/items/1ead200bf602569804ea