SIMPLE

Github ActionでCloud Runにデプロイ(後編)

Cloud Runを使うことで、コンテナ化したアプリケーションをホストすることができます。 Github Actionにより、コンテナ化したアプリケーションのCloud Runへのデプロイを自動化することができます。 後編ではGithub Actionを使用したCloud Runへのデプロイを行います。

通りすがりのラマ🦙
27 January, 2025

サムネイルはUnsplashMahdi Soheiliが撮影した写真

はじめに

本記事は前編記事の続きです。

前編で行った設定を前提にした手順になっているので、必要に応じて前編を参照ください。

構成図(再掲)

本記事で解説する設定を全て行うと、最終的には上記の構成になります。

  • Github Action:コンテナイメージのビルド、ServiceAccountを使ったArtifact RegistryへのイメージのPush、Cloud Runへのデプロイを行う
  • Service Account:Github Actionで使用するアカウント。Artifact RegistryとCloud Runを操作するためのポリシーを付与する
  • Artifact Registry:コンテナレジストリ
  • Cloud Run:コンテナアプリケーションの実行

前編まででGoogle Cloud側の設定が完了しています。本記事ではGithub Actionの設定をメインで行います。

Github Actionの設定ファイル

以下の設定ファイルを使用することで、Cloud Runへのデプロイを行うことができます。

name: CI/CD pipeline
on:
  push:
    branches:
      - main
jobs:
  deploy-front-app:
    runs-on: ubuntu-latest

    env:
      REGION: <your-region> # Cloud Run and Artifact Registry region
      IMAGE_REPO_NAME: <your-repo-name> # Artifact Registry repository name
      SERVICE_NAME: <your-service-name> # Cloud Run service name
      PROJECT: <your-project-id> # GCP project ID
      ARTIFACT_REGISTRY_HOST: ${{ env.REGION }}-docker.pkg.dev
      IMAGE_NAME: ${{ env.ARTIFACT_REGISTRY_HOST }}/${{ env.PROJECT }}/${{ env.IMAGE_REPO_NAME }}/${{ env.SERVICE_NAME }}:latest

    steps:
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Checkout code
        uses: actions/checkout@v3

      - name: Build in Github
        env:
          BUILD_ARG_1: ${{ vars.BUILD_ARG_1 }}
        run: |
          echo "Building image: $IMAGE_NAME"
          docker build -t $IMAGE_NAME \
            --build-arg BUILD_ARG_1="$BUILD_ARG_1" \
            --progress=plain \
            .

      - uses: 'google-github-actions/auth@v2'
        with:
          credentials_json: '${{ secrets.GCP_SA_KEY }}'

      - name: 'Set up Cloud SDK'
        uses: 'google-github-actions/setup-gcloud@v2'

      - name: Configure Google Cloud
        run: |
          gcloud config set project $PROJECT
          gcloud auth configure-docker $IMAGE_REPO_REGION

      - name: Push and Deploy
        run: |
          docker push $IMAGE_NAME
          gcloud run deploy $SERVICE_NAME \
            --image $IMAGE_NAME \
            --region $REGION \
            --allow-unauthenticated \
            --min-instances 0 \
            --max-instances 5 \
            --memory 512Mi \
            --cpu 1 \
            --update-env-vars RUNTIME_ARG_1=${{ vars.RUNTIME_ARG_1 }}

このGithub Actionでは、Github上でコンテナイメージをビルドしたのち、Artifact RegistryにPushします。

その後、Pushしたコンテナイメージを参照し、Cloud Runサービスのデプロイを行なっています。

使用方法

1. ファイルの配置

リポジトリ内の「.github/workflows」フォルダ配下に上記ファイルを配置します。

2. 環境変数の設定

コメントを参考に、環境変数の設定を行います。

3. Github Action Secretの設定

GCP_SA_KEYという名前のシークレットを作成します。

値には前編で作成したサービスアカウントの鍵情報が含まれたJSONを指定します。

Github Action Secretの設定画面
Github Action Secretの設定画面

4. コミット

mainブランチにコミットするとGithub Actionが起動します。

以上で完了です。

設定ファイルの解説

1. 環境変数の設定

    env:
      REGION: <your-region> # Cloud Run and Artifact Registry region
      IMAGE_REPO_NAME: <your-repo-name> # Artifact Registry repository name
      SERVICE_NAME: <your-service-name> # Cloud Run service name
      PROJECT: <your-project-id> # GCP project ID
      ARTIFACT_REGISTRY_HOST: ${{ env.REGION }}-docker.pkg.dev
      IMAGE_NAME: ${{ env.ARTIFACT_REGISTRY_HOST }}/${{ env.PROJECT }}/${{ env.IMAGE_REPO_NAME }}/${{ env.SERVICE_NAME }}:latest

このセクションでは、後続のステップで使用している環境変数の定義を行います。

  • REGION:Cloud RunおよびArtifact Registryで使用するリージョンを指定します。使用できるリージョンはこちらから確認できます。
  • IMAGE_REPO_NAME:Artifact Registryのリポジトリ名です。
  • SERVICE_NAME:Cloud Runのサービス名です。
  • PROJECT:Google CloudのプロジェクトIDを指定します。
  • ARTIFACT_REGISTRY_HOST:Artifact Registryのリポジトリのホスト名です。REGIONの値を元に定義しています。
    • 例:asia-northeast1-docker.pkg.dev
  • IMAGE_NAME(自動設定):Artifact RegistryにPushするイメージ名を指定します。他の環境変数の値を元に定義しています。
    • 例:asia-northeast1-docker.pkg.dev/blog-project/blog-image-repo/blog-app-image:latest

2. 前準備

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Checkout code
        uses: actions/checkout@v3

このセクションではイメージビルドのために必要な前準備を行なっています。

Github ActionのランナーのCPUがx86で、Cloud RunのCPUはARM64であるため、buildxを使用しマルチアーキテクチャに対応させています。(CPUアーキテクチャの詳細については本題ではないので、割愛します。)

checkout codeではソースコードの取得を行なっています。

3. コンテナイメージのビルド

      - name: Build in Github
        env:
          BUILD_ARG_1: ${{ vars.BUILD_ARG_1 }}
        run: |
          echo "Building image: $IMAGE_NAME"
          docker build -t $IMAGE_NAME \
            --build-arg BUILD_ARG_1="$BUILD_ARG_1" \
            --progress=plain \
            .

コンテナイメージのビルドを行います。

「BUILD_ARG_1」にはビルド変数を指定しています。必要に応じて追加/削除してください。

4. Google Cloudの設定

      - uses: 'google-github-actions/auth@v2'
        with:
          credentials_json: '${{ secrets.GCP_SA_KEY }}'

      - name: 'Set up Cloud SDK'
        uses: 'google-github-actions/setup-gcloud@v2'

      - name: Configure Google Cloud
        run: |
          gcloud config set project $PROJECT
          gcloud auth configure-docker $IMAGE_REPO_REGION

前編で用意したService Accountの鍵情報を使用して以下を実施します。

  • Google Cloudの認証
  • Cloud SDKのセットアップ
  • プロジェクトとArtifact Registryのリージョンの設定

5. イメージのPushとデプロイ

      - name: Push and Deploy
        run: |
          docker push $IMAGE_NAME
          gcloud run deploy $SERVICE_NAME \
            --image $IMAGE_NAME \
            --region $REGION \
            --allow-unauthenticated \
            --min-instances 0 \
            --max-instances 5 \
            --memory 512Mi \
            --cpu 1 \
            --update-env-vars RUNTIME_ARG_1=${{ vars.RUNTIME_ARG_1 }}

ビルドしたコンテナイメージをArtifact RegistryにPushします。

その後、そのイメージを参照しCloud Runサービスのデプロイを行います。

おわりに

本記事ではGithub Actionを使用したCloud Runへのデプロイを解説しました。このGithub Action内のイメージプッシュ、デプロイするコードを変更すれば別のクラウドプロバイダーへのデプロイも同様の構成で行うことができます。

最近では各クラウドベンダー側に、Githubリポジトリを連携することでビルド・イメージのプッシュ・デプロイまで全て行なってくれるサービスが大多数です。(Cloud RunもGithub連携が可能です。)

これらの機能は簡単に設定できる一方で、追加の学習・金銭コストがかかることや、ベンダーロックインにも繋がります。それを避けたい場合はGithub Actionを使ったコマンドでのデプロイが選択肢の一つになります。どちらが一方的に優れている、ということはないので要件に応じて使い分けられると良いと思います。

最後までご覧いただきありがとうございました。

通りすがりのラマ🦙

このブログでは個人開発で得た知見や興味のあるテクノロジーに関する記事を執筆します。 日々公開されている情報に助けられているので、自分が得た知見も世の中に還元していければと思います。 解決できないバグに出会うと、草を食べます。🦙🌿 経歴: 情報工学部→日系SIer→外資系IT企業 興味: Webアプリケーション開発、Webデザイン、AI 趣味: 個人開発、テニス