概要
開発環境でなんらかの機能を追加した際に、本番環境へのデプロイと同時にdb:migrateしたい場合、CircleCIのOrbsを使うと楽に実装可能
前提
Terraformやコンソールからすでにサービスをデプロイしていること
migrationの実行
今回はTerraformから、マイグレーション用のタスクを準備した
task_definition.tf
resource "aws_ecs_task_definition" "rails-migration" {
family = "rails-migration"
container_definitions = file("./container_definitions/migration.json") # jsonfileはサービスで使用しているタスクのcommandを"ash", "-c", "bundle exec rails db:create db:migrate"に変更 logを出力している場合はprefixをmigrationとかに変更してやるとあとで楽
task_role_arn = data.terraform_remote_state.iam.outputs.ecs_task_role_arn
execution_role_arn = data.terraform_remote_state.iam.outputs.ecs_task_role_arn
network_mode = "bridge"
}
CircleCIでデプロイ時にマイグレーションする用に設定する
.circleci/config.yml
version: 2.1
orbs:
aws-ecr: circleci/aws-ecr@6.11.0
aws-ecs: circleci/aws-ecs@1.2.0
workflows:
rails_build_and_deploy_and_migration:
jobs:
# イメージのビルドとプッシュ
- aws-ecr/build-and-push-image:
account-url: AWS_ECR_ACCOUNT_URL
extra-build-args: "--build-arg RAILS_MASTER_KEY=${RAILS_MASTER_KEY}"
region: AWS_REGION
repo: 'app-image'
tag: '${CIRCLE_SHA1}'
filters:
branches:
only:
- master
# デプロイ(サービスのアップデート)
- aws-ecs/deploy-service-update:
requires:
- aws-ecr/build-and-push-image
family: '${MY_APP_PREFIX}-service'
cluster-name: '${MY_APP_PREFIX}-cluster'
container-image-name-updates: 'container=rails, tag=${CIRCLE_SHA1}'
# ここからマイグレーションの実行
- aws-ecs/run-task:
cluster: '${MY_APP_PREFIX}-cluster'
task-definition: rails-migration # マイグレーション用に定義したタスクの名前
awsvpc: false # 環境に合わせて
launch-type: EC2 # 環境に合わせて
requires:
- aws-ecs/deploy-service-update
Orbs
を使用すると簡単に実装できる