LoginSignup
2
2

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-03-03

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

公式AWS ECR/ECS へのデプロイ - CircleCIにとても詳しく記載があるのですが、完全な設定ファイルをコピペしても、エラーになってしまいます。

発生するエラー

#!/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-urlrepo の Value の記述で Type error が発生しているようです。

# 中略
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

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

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の設定ファイルの解析について

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

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

参考: CircleCI コンフィグのバリデーション – CircleCI Japanese Support Center

補足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

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2