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-url
と repo
の 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-url
とregiton
を書き換えて無事デプロイ出来ました。下記が私の設定ファイルです。
備忘録をかねてコメントを追加しています。
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 を利用してタスクを実行しましょう。
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