CircleCIでCloudRunのデプロイをする方法

TL;DR

環境変数 GCLOUD_SERVICE_KEY にはGCRのpush用に roles/storage.admin とCloudRunデプロイ用に roles/run.developer を付けたサービスアカウント( 以下SA )の鍵を入れておきます。

[GCRのリポジトリ名][CloudRunのサービス名][GCPプロジェクトID] の部分を置き換えてください。

version: 2.1

commands:
  auth_gcloud:
    steps:
      - run:
          name: Authenticate gcloud
          command: |
            echo $GCLOUD_SERVICE_KEY | gcloud auth activate-service-account --key-file -
            gcloud auth configure-docker --quiet

  build_and_push:
    steps:
      - run:
          name: Build docker image
          command: |
            docker build -t [GCRのリポジトリ名]:${CIRCLE_SHA1} .
      - run:
          name: Push docker image
          command: |
            docker push [GCRのリポジトリ名]:${CIRCLE_SHA1}

  deploy_service:
    steps:
      - run:
          name: Deploy CloudRun service
          command: |
            gcloud run deploy [CloudRunのサービス名] \
              --project [GCPプロジェクトID] \
              --region asia-northeast1 \
              --platform managed \
              --image [GCRのリポジトリ名]:${CIRCLE_SHA1}
jobs:
  deploy:
    docker:
      - image: gcr.io/google.com/cloudsdktool/cloud-sdk:latest
    steps:
      - setup_remote_docker:
          version: 19.03.12
      - checkout
      - auth_gcloud
      - build_and_push
      - deploy_service

workflows:
  version: 2

  deploy:
    jobs:
      - deploy:
          filters:
            branches:
              only: main

モチベーション

CloudRun良いですよね。個人で使うにしろ、プロダクションで使うにしろ、これで事足りることはけっこう多いんじゃないでしょうか。

個人で使う場合の嬉しさはなんと言ってもその安さです。 CloudRunには無料tierがあり、CPUは180,000vCPU秒、メモリは360,000GiB秒、リクエストは200万リクエスト、下りネットワーキングは1GiBが無料です。コールドスタートを許容し、ゼロスケールするようにしておけば自分一人用のサービスは余裕で無料枠に収まります。

プロダクションで使う場合の嬉しさはサーバレスでコンテナが動くところでしょうか。 VMインスタンスやクラスタを管理することなく、スケールするサービスを提供できます。ゼロスケールするとコールドスタート時にコンテナが起動する遅延が発生するので最低インスタンス数を1( かそれ以上 )にしておくと良いかと思います。

Serverless VPC Access Connectorを使えばVPC経由でCloudSQLにプライベートIPアドレスで接続して低レイテンシで通信ができますし、最近はSecretManagerを使えるようになったので秘匿情報もいい感じに利用することができます。

デプロイも簡単です。Dockerイメージをビルドして、GCRにプッシュして、 gcloud run deploy 、以上!

今後CloudRunをCDすることが増えそうなのでコピペできるようにブログに書いておきます。

解説

auth_gcloud

gcloud でSAの認証をします。 --key-file はオプション名からは意外ですが鍵自体を入力することができるので echo $GCLOUD_SERVICE_KEY で鍵ファイルの中身を流し込んでます。

build_and_push

${CIRCLE_SHA1} をタグにしてイメージをビルド&プッシュ

deploy_service

特に gcloud config を設定していない場合、 project region platform の指定が必要になります。あとは image で先程ビルド&プッシュしたイメージを指定すればOKです。

今後

CloudRunの設定やSAの権限付与はterraformでやるようにしたいです。

Back to Top