CircleCI Orbsでデプロイ承認ボタンを作ってSlackに通知させる


概要

以前、CircleCI OrbsでECS Fargateのデプロイを自動化という記事を書いたのですが、
この仕組みだと特定のブランチにマージしたタイミングで自動デプロイが走ってしまいます。

本番環境だけは、マージ=デプロイ でななく、任意のタイミングでデプロイしたいってこともあると思うので、
CircleCI Orbsを使ってそのあたりを制御したい思います。

イメージとしては、特定のブランチにマージした段階で

と言うようなSlack通知が来て、Visit Workflowのリンクを踏むと

が表示され、Approveをクリックすると、デプロイできるという仕組みが作れます。

前提条件

  • CircleCIとGithubのインテグレーションは設定しておく

設定

前回のconfig.yamlを基に設定してみます。
前回からの差分のみコメントを入れてます。


version: 2.1
orbs:
  aws-ecr: circleci/[email protected]
  aws-ecs: circleci/[email protected]
  slack: circleci/[email protected] # (1)circleci/slack 設定

executors:
  docker_build:
    machine:
      docker_layer_caching: true

workflows:
  build-and-deploy:
    jobs:
      - build
      - aws-ecr/build_and_push_image:
          executor: docker_build
          name: 'build-staging'
          account-url: AWS_ECR_ACCOUNT_URL
          region: AWS_REGION
          repo: '<ECRのリポジトリ名>'
          tag: "${CIRCLE_SHA1}"
          path: ./
          dockerfile: Dockerfile-staging
          requires:
            - build
          filters:
            branches:
              only:
                - staging
      - slack/approval-notification: #(2)Slack通知用jobを追加
          message: "<Your APP NAME>ステージング環境へのデプロイを承認してください。"
          color: "#F5E911"
          requires:
            - build-staging
      - approval-deploy: #(3)承認用jobを追加
          type: approval
          requires:
            - build-staging
      - aws-ecs/deploy-service-update:
          requires:
            - build-staging
            - approval-deploy #(4) approval-deployで承認されるないと走らない
          family: '<Fargateのタスク定義名>'
          service-name: '<Fargateのサービス名>'
          cluster-name: '<Fargateのクラスタ名>'
          container-image-name-updates: 'container=<タスク定義で設定したコンテナ名>,image-and-tag=${AWS_ECR_ACCOUNT_URL}/<ECRのリポジトリ名>:${CIRCLE_SHA1}'
          filters:
            branches:
              only:
                - staging

ざっくり解説すると、

  • (2) でSlack通知用の詳細設定を入れて
  • (3) でさきほどの例で示した承認ボタンを作ります。
  • (4) でデプロイするんですが、requiresapproval-deployを入れてるため、承認ボタンが押されるまではデプロイが走りません。

(2)に関しては、メンションもつけることが可能なので詳細は、オフィシャルドキュメントを参考にしてください。

基本的に当該リポジトリへの権限がある人しか承認ボタンを押せないとと思うので、
ある程度はセキュリティは担保できるかと。ちなみに誰が承認したかも分かります。

参考文献

この記事は以下の情報を参考にして執筆しました。

CircleCIのManual Approval機能を試した