[CircleCI][AWS][Rails]OrbsのCommandsをつかってECR/ECS/Fargateにデプロイする
前回はCircleCIでECS/Fargateのデプロイ方法をブログしましたが、今回はRailsの db:migrate(マイグレーション)をするために run-task
を使ってCircleCIのOrbsで実装してみました。基本コンテナはSSHできないのでrun-taskを使えばバッチ的な役割を果たします。
■circleci/aws-ecs/Commands/run-task
https://circleci.com/orbs/registry/orb/circleci/aws-ecs#commands-run-task
とりあえずECSデプロイ後にマイグレーション処理を行えば良さそうなので commands
に追加するだけ。
ちなみに以下のようにOrbsのaws-cliを使えば同じ用にaws cliコマンドを使って実装できますが、aws-ecs Orbsを使うことで設定ファイルの管理が統一されて、めちゃくちゃ楽になります。
https://circleci.com/orbs/registry/orb/circleci/aws-cli
- config.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
version: 2.1 orbs: aws-ecr: circleci/aws-ecr@6.7.0 aws-ecs: circleci/aws-ecs@1.1.0 aws-cli: circleci/aws-cli@0.1.20 ~省略~ db_migrate_on_task_run_stg: steps: - aws-cli/setup: aws-access-key-id: AWS_ACCESS_KEY_ID_stg aws-secret-access-key: AWS_SECRET_ACCESS_KEY_stg aws-region: AWS_REGION - run: name: "db migrate" command: | aws ecs run-task --region $AWS_REGION \ --cluster adachin \ --task-definition adachin-app \ --count 1 \ --launch-type FARGATE \ --network-configuration "awsvpcConfiguration={subnets=[subnet-xxxxxxxxxxx,subnet-xxxxxxxx],securityGroups=[sg-xxxxxxxx]}" \ --overrides file://docker/stg/app/db_migrate/run_task_db_migrate_stg.json |
- run_task_db_migrate_stg.json
1 2 3 4 5 6 7 8 |
{ "containerOverrides": [ { "name": "adachin-app", "command": ["bundle exec rake db:migrate RAILS_ENV=stg"] } ] } |
■config.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
version: 2.1 orbs: aws-ecr: circleci/aws-ecr@6.7.0 aws-ecs: circleci/aws-ecs@1.1.0 ~省略~ db_migrate_stg: steps: - aws-ecs/run-task: cluster: 'adachin' task-definition: 'adachin-app' count: 1 launch-type: FARGATE awsvpc: true subnet-ids: subnet-xxxxxxxxxxxxxx security-group-ids: sg-xxxxxxxxxxxxxxxxxxxx overrides: "{\\\"containerOverrides\\\":[{\\\"name\\\": \\\"adachin-app\\\",\\\"command\\\": [\\\"bundle\\\", \\\"exec\\\", \\\"rake\\\", \\\"db:migrate\\\", \\\"RAILS_ENV=stg\\\"]}]}" jobs: rspec: working_directory: ~/rspec executor: default steps: - checkout - bundle_install_rspec deploy_stg: working_directory: ~/app executor: default steps: - setup_remote_docker - checkout - run: cp docker/stg/app/.env.example .env - run: echo DATABASE_HOST="${DATABASE_HOST_stg}" >> .env - run: echo DATABASE_NAME="${DATABASE_NAME_stg}" >> .env - run: echo DATABASE_PASSWORD="${DATABASE_PASSWORD_stg}" >> .env - run: echo DATABASE_USER="${DATABASE_USER_stg}" >> .env - run: echo SECRET_KEY_BASE="${SECRET_KEY_BASE_stg}" >> .env - build_and_push_docker_image_stg - db_migrate_stg workflows: version: 2 deploy_stg_and_rspec: jobs: - rspec - deploy_stg |
- CircleCI
- ECS
- CloudWatch Logs
マイグレーションされてログ出ていればOK!
■まとめ
統一されて見やすいし便利!!
以下のようにエラーが出た場合はダブルクオーテーションで囲いましょう!(公式に書いてなかった)
1 2 3 4 5 6 |
$ circleci config validate -c .circleci/config.yml Error: Error calling workflow: 'deploy_stg_and_rspec' Error calling job: 'deploy_stg' Error calling command: 'db_migrate_stg' Error calling command: 'aws-ecs/run-task' Type error for argument overrides: expected type: string, actual value: "{:\\\"containerOverrides\\\" clojure.lang.LazySeq@e74e877b}" (type mapping) |
0件のコメント