CircleCIでAWS ECR/ECSへデプロイする方法

RailsアプリをAWSへデプロイしたいと考え、CiecleCIを利用したCI/CDパイプライン構築について学んでいます。

公式[AWS ECR/ECS へのデプロイ - CircleCI](https://circleci.com/docs/ja/2.0/ecs-ecr/)にとても詳しく記載があるのですが、[完全な設定ファイル](https://circleci.com/docs/ja/2.0/ecs-ecr/#%E5%AE%8C%E5%85%A8%E3%81%AA%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)をコピペしても、エラーになってしまいます。

## 発生するエラー
```bash
#!/bin/sh -eo pipefail
# Error calling workflow: 'build-and-deploy'
# Error calling job: 'aws-ecr/build_and_push_image'
# Type error for argument region: expected type: env_var_name, actual value: \"${AWS_DEFAULT_REGION}\" (type string)
# Type error for argument account-url: expected type: env_var_name, actual value: \"${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com\" (type string)
# 
# -------
# Warning: This configuration was auto-generated to show you the message above.
# Don't rerun this job. Rerunning will have no effect.
false
```

エラー文章を読むと、`account-url` と `repo` の Value の記述で Type error が発生しているようです。

```bash
# 中略
account-url: "${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com"
repo: "${AWS_RESOURCE_NAME_PREFIX}"
```


## 解決策

Issueが上がっていました。
[Type check error when try to build using ecr version above 0.0.4 · Issue #47 · CircleCI-Public/aws-ecr-orb · GitHub](https://github.com/CircleCI-Public/aws-ecr-orb/issues/47#issuecomment-523753888)

APIのバージョンアップによって、記法が変わったようです。Issueを参考に`account-url`と`regiton`を書き換えて無事デプロイ出来ました。下記が私の設定ファイルです。
備忘録をかねてコメントを追加しています。

```.circleci/config.yml
version: 2.1
orbs:
  aws-ecr: circleci/aws-ecr@0.0.10
  aws-ecs: circleci/aws-ecs@0.0.8
workflows:
  build-and-deploy:
    jobs:
      - aws-ecr/build_and_push_image:
          # ECRのURL XXX.dkr.ecr.ap-northeast-1.amazonaws.com
          account-url: AWS_ECR_ACCOUNT_URL
          # ERCのリポジトリ名
          repo: AWS_ECR_REPO_NAME
          region: AWS_DEFAULT_REGION
          tag: "${CIRCLE_SHA1}"
      - aws-ecs/deploy-service-update:
          requires:
            - aws-ecr/build_and_push_image
          aws-region: AWS_DEFAULT_REGION
          # ECSのタスク定義名
          family: AWS_ECS_TASK_FAMILY_NAME
          # ECSのサービス名
          service-name: AWS_ECS_SERVICE_NAME
          # ECSのクラスタ名
          cluster-name: AWS_ECS_CLUSTER_NAME
          # ECSのタスク定義で指定したコンテナ名
          container-image-name-updates: "container=${AWS_ECR_REPO_NAME},tag=${CIRCLE_SHA1}"
```

ちなみに、設定した環境変数は下記です。

```
AWS_DEFAULT_REGION
AWS_ECR_REPO_NAME
AWS_ECS_TASK_FAMILY_NAME
AWS_ECS_SERVICE_NAME
AWS_ECS_CLUSTER_NAME
```

## 補足1. CircleCIの設定ファイルの解析について

構文エラーあらかじめバリデーションすることで検知することができます。
エラーが無ければ、下記のような文言が出力されます。

```bash
$ circleci config validate
Config file at .circleci/config.yml is valid.
```

参考: [CircleCI コンフィグのバリデーション – CircleCI Japanese Support Center](https://support.circleci.com/hc/ja/articles/360006735753-CircleCI-%E3%82%B3%E3%83%B3%E3%83%95%E3%82%A3%E3%82%B0%E3%81%AE%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)

## 補足2. デプロイ時のECS RUN TASKについて
デプロイ時には、合わせてマイグレーションなどのタスクを実行したいこともあるでしょう。
`aws-ecs` の Orb を利用してタスクを実行しましょう。

```.circleci/config.yml
version: 2.1
orbs:
  aws-ecr: circleci/aws-ecr@0.0.10
  aws-ecs: circleci/aws-ecs@0.0.8
workflows:
  build-and-deploy:
    jobs:
      - aws-ecr/build_and_push_image:
      # 略
      - aws-ecs/deploy-service-update:
      # 略
      - aws-ecs/run-task:
          requires:
            - aws-ecs/deploy-service-update
          awsvpc: false
          launch-type: EC2
          cluster: sample-ecs-cluster
          task-definition: webapp-migration
```

参考: [run-task — AWS CLI 1.19.21 Command Reference](https://docs.aws.amazon.com/cli/latest/reference/ecs/run-task.html)