CircleCI+ecspressoでECSにデプロイする


ECSのデプロイ

ここ数年、基本的にECSを利用しているのですが、デプロイをどうやって行うかでいつも迷います
GitHubでデプロイ用のブランチ(たとえばproductionブランチ)にマージされたらデプロイを行いたいとして、手段はかなりいろいろあると思うんですよ
僕が今までやってきたのだと、
AWSのCodePipelineを使ってイメージのビルド=>タスクの更新=>サービスの更新
だとか
CircleCIのOrb(aws-ecr/aws-ecs)使ってデプロイ
とか

いずれもそんなに大きな不満はないです
最初に設定を理解するのが難しい、くらいで

しかし「もっとわかりやすいのあるんじゃないか」くらいの気持ちで見ていたら、たまたまecspressoを見つけたので今回試してみることにしました

ecspresso

面白法人カヤックさんが作ったツールだそうです
Golangで書かれている点が個人的には好きです

使い方もとてもシンプルで、予め.awsディレクトリにconfig的な、awsと疎通できる状態にしたうえで

$ ecspresso init --region ap-northeast-1 --cluster クラスタ名 --service サービス名 --config hogehoge.yaml

と、initコマンドを叩くと、指定したクラスタ/サービスの設定を引っ張ってきてくれます
hogehoge.yamlはこんな感じ

region: ap-northeast-1
cluster: クラスタ名
service: サービス名
service_definition: ecs-service-def.json
task_definition: ecs-task-def.json
timeout: 10m0s

hogehoge.yamlと一緒に降ってくるecs-service-def.jsonがサービス定義、ecs-task-def.jsonがタスク定義になるので、変更したいときはこの辺を適宜変えてあげればいいって寸法です

デプロイする際は

$ ecspresso deploy --config hogehoge.yaml

とdeployコマンドを実行するだけです!
シンプル!わかりやすい!好き!!

CircleCIで実行しよう

プラン

なるほど、これだけシンプルならあとはこれをCircleCIで実行してあげるだけですね
ちゃんとOrbありました

流れとしては

GitHubで対象ブランチにマージされる
↓
CircleCIでテスト実行
↓
CircleCIでイメージビルド&ECRにpush
↓
CircleCIでecspresso使ってdeploy

これでいきましょう

イメージビルドに関しては、aws-ecrのOrb使うのが手っ取り早いのでそうします
その後は上述のecspressoのOrb使ってdeployを実行しましょう

.circleci/config.yml

できあがったconfigはこんな感じ

version: 2.1

orbs:
  aws-ecr: circleci/[email protected]
  ecspresso: fujiwara/[email protected]

executors:
  docker_build:
    machine:
      docker_layer_caching: true

  general:
    docker:
      - image: cimg/base:stable

workflows:
  main:
    jobs:
      - test

      - aws-ecr/build-and-push-image:
          name: push app image
          executor: docker_build # DLCオプション付けたexecutorつくっておく
          requires:
            - test
          dockerfile: Dockerfile
          repo: "hogehoge"
          tag: "fuga"

      - deploy:
          requires:
            - push app image

jobs:
  test:
    # 今回の本題と関係ないので省略

  deploy:
    executor: general # 軽いイメージのexecutor用意しておく
    steps:
      - checkout
      - ecspresso/install # Orbはecspressoを簡単にinstallをしてくれる
      - run:
          command: |
            # deployの前にmigrateしたいんや
            ecspresso run --config hogehoge.yaml --task-def=ecs-task-def-migrate.json
            ecspresso deploy --config hogehoge.yaml

しれっとmigrateしてるのがポイント←
ecspressoはrunコマンドを使えばちょっとtask流したいだけみたいなのも簡単にできます
今回はmigrate用のタスク定義.json(Railsならbundle exec rails db:migrateコマンドになってるようなやつ)を用意しておいて、それを実行することでmigrateを済ませてからdeployする流れになってます

あ、ところでCircleCI上で実行する際はAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYの環境変数を設定するのをお忘れなく

感想

CircleCI+ecspressoで簡単にデプロイできちゃったので気持ちよかったですし、すごくシンプルでわかりやすくて使いやすかったです
まだローリングデプロイとか試してないので、今後はその辺を使ってみたいところ
もちろんCI上ではなく、手元でECSゴニョゴニョしたいときに使うコマンドとしてもかなり使いやすくていいなと思いました
自分はECS操作はecspressoメインでもいいなって思いました

以上、なにかの参考になれば幸いです