Docker-ComposeのAWS ECSデプロイをGithub Actionでやる

# 前置き
Docker-Composeで環境を作っているのでそのままそれを使ってpushできると楽だと思った。

いろいろ調べたがあまりまとまっているものがなかったので書いた。


# 前提条件
- Mac
- AWSアカウントがある。
- Docker Desktop環境がある
- AWS CLI環境がある


# 手順

1. IAMユーザを作る。以下の権限をユーザorグループにつけておく。

- Administrator Access
- AmazonECS_FullAccess

AWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYを控えておく。


2. Amazon ECS用のcontextを作る。

以下のコマンドを実行

```
$ docker context create ecs [contextname]
```

`? Create a Docker context using`と聞かれるので`AWS secret and token credetials`を選択

AWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYを入力。

`$ docker context list`で追加できたか確認できる。`$ docker context use [context name]で選択できる。現在はdefaultにしておく。

3. AWSコンソールでECRのプライベートリポジトリを作る。一つのDocker Imageにつき一つ作成する。

uriをコピーしておく

4. レジストリに対してDockerクライアントを認証する。AWSコンソール上のプッシュコマンドの表示をクリックして１つめのコマンドをコピーして実行する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573723/835f6c5b-3efc-8813-642e-2ea032b0f5b1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573723/740442d1-e65c-1e0c-63e7-ce3ea1714600.png)

5. yamlのimageをそれぞれECRのリポジトリパスに修正

```
version: "3"
services:
  backend:
    image: リポジトリパス # ここ
    build:
      context: .
      dockerfile: ./backend/Dockerfile
    container_name: backend
    tty: true
    ports:
      - 8000:8000
    volumes:
      - .:/app
      - node_modules:/app/frontend/node_modules
  frontend:
    image: リポジトリパス #ここ
    build:
      context: .
      dockerfile: ./frontend/Dockerfile
    container_name: frontend
    tty: true
    env_file: .env.development
    ports:
      - 3000:3000
    volumes:
      - .:/app
      - node_modules:/app/frontend/node_modules
    depends_on:
      - backend
volumes:
  node_modules:
```

6. `$docker-compose push`でdocker imageをECRにプッシュ
7. `$docker context use [context name]`でcontextをECSのものに切り替える。
8. `$docker compose up`でECSデプロイ完了。コンソール上で確認できるはず。
8. githubのSecretsに`AWS_ACCESS_KEY_ID`と`AWS_SECRET_ACCESS_KEY`と`AWS_ECR_REPO_NAME`を登録
8. 以下のymlファイルをActionに登録してpushしておしまい！！！

```ecs.yaml
name: ECR Push

on:
  push:

jobs:
  ecr-push:
    runs-on: ubuntu-latest
    name: ECR Push
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-east-1"

      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v1

      - name: Build, to Amazon ECR
        run: |
          docker-compose -f docker-compose.prod.yml build

      - name: push image to Amazon ECR
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          ECR_REPOSITORY: ${{ secrets.AWS_ECR_REPO_NAME }}
          IMAGE_TAG: latest
        run: |
          docker-compose -f docker-compose.prod.yml push
```

# エラーハンドリング
- docker-compose pushで以下のエラーが出たらimageのtagが設定できていない。

```
$ docker-compose -f docker-compose.ecs.yaml push                                                           
An image does not exist locally with the tag: 785741758597.dkr.ecr.us-east-1.amazonaws.com/kanji-visualization/frontend

```


これを参考にタグ付けすることで解決
![スクリーンショット 2022-02-19 17.12.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573723/384db21f-a4da-e83c-6098-551b6e213b67.png)



# 参考文献

- https://zenn.dev/soreiyu/articles/29fe1cacc071bd