👻

Cloud Run Jobsでバッチ実行する

2024/04/20に公開

はじめに

Cloud Run Jobsを使ったことがなかったので、バッチを構築してみようと思います!

対象読者

  • Cloud Run Jobsを使用したい方

やること

  • Cloud Storageにアップロードされた、csvファイルを使用してバッチ処理をするCloud Run Jobsを作成したい方

なぜ、やるか?

今まで、よく、Cloud Runは使用してきましたが、Cloud Run Jobsは使用したことがなかったので、使ってみたかったからです。

方法

  1. Cloud Storageのファイル取得権限をサービスアカウントに付与する
  2. バッチを実装する
  3. コンテナで動作するようにdockefileを書く
  4. Cloud Run Jobsを設定する

解説

1,2は、難しくもないしCloud Run Jobsを使用するという観点からは外れてしまうため詳しく説明しません。

3は、APIをCloud Runにデプロイする際同様に、Dockerfileを書いてコンテナイメージを作成します。
ここでは、マルチステージビルドをしています。

Dockefile
#バッチ用コンテナに含めるバイナリを作成するコンテナ
FROM golang:1.22-bullseye as deploy-batch-builder

WORKDIR /app

COPY go.mod go.sum ./
RUN go mod download
COPY . .

RUN go build -trimpath -ldflags "-w -s" -o main ./app/cmd/batch/main.go

#バッチ デプロイ用コンテナ
FROM centos:centos7 as deploy-batch

RUN yum -y update

EXPOSE "8080"

COPY --from=deploy-batch-builder /app/main .

CMD ["./main"]

Dockerfileを作成したら、イメージのビルドとArtifact RegistryにPushします。

プロジェクトのルートディレクトリで以下を実行する

docker build --platform linux/amd64 -t [イメージのタグ名] -f [Dockerfileのパス] --target deploy-batch .
docker push [イメージのタグ名]

これで、DockerイメージをArtifact Registryにアップロードできました。
いよいよ、Cloud Run Jobsにデプロイします。

すでに存在するジョブを上書きして際デプロイする場合

gcloud run jobs update [バッチの名前] \
    --image [イメージのタグ名] \
    --region [デプロイするリージョン] \
    --service-account=[デプロイに使用するCloud Runの起動権限を持ったサービスアカウント] \
    --set-secrets=[Secrets Managerの環境変数名]=[アプリで使用する環境変数名]:[Secrets Managerの環境変数のバージョン] \

新規でジョブをデプロイする場合

gcloud run jobs create [バッチの名前] \
    --image [イメージのタグ名] \
    --region [デプロイするリージョン] \
    --service-account=[デプロイに使用するCloud Runの起動権限を持ったサービスアカウント] \
    --set-secrets=[Secrets Managerの環境変数名]=[アプリで使用する環境変数名]:[Secrets Managerの環境変数のバージョン] \

まとめ

簡単にジョブもデプロイできました。これで、Cloud Runの一通りの機能は使えたので、もっと、発展的な使い方もしてみたいです。

おまけ

おまけとして、GitHub ActionsによるCloud Run Jobsのデプロイも記載します。

deploy_batch.yml
name: Batch Deploy

on:
  push:

env:
  JOB_NAME: api-batch
  GCP_PROJECT_ID: ${{ secrets.GCP_PROJECT_ID }}
  GCP_REGION: ${{ secrets.GCP_REGION }}
  GCP_REPOSITORY: ${{ secrets.GCP_REPOSITORY }}
  GCP_SERVICE_ACCOUNT: ${{ secrets.GCP_SERVICE_ACCOUNT }}
  IMAGE: asia-northeast1-docker.pkg.dev/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_REPOSITORY }}/api-batch:${{ github.sha }}

jobs:
  deploy:
    runs-on: ubuntu-latest

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

      - id: "auth"
        uses: "google-github-actions/auth@v0"
        with:
          credentials_json: "${{ secrets.GCP_SA_KEY }}"

      - name: Configure docker for artifact registry
        run: |
          gcloud auth configure-docker asia-northeast1-docker.pkg.dev

      - name: Build a docker image
        run: |
          docker build --platform linux/amd64 -t ${{ env.IMAGE }} -f environment/go/Dockerfile --target deploy-batch .

      - name: Push the docker image
        run: docker push ${{ env.IMAGE }}

      - name: Deploy to Cloud Run
        run: |
          gcloud run jobs update ${{ env.JOB_NAME }} \
            --image ${{ env.IMAGE }} \
            --region ${{ env.GCP_REGION }} \
            --service-account=${{ env.GCP_SERVICE_ACCOUNT }} \
            --set-secrets=DATABASE_URL=DATABASE_URL:latest \

デプロイしたバッチを起動してみます。

ジョブ一覧画面から起動したいジョブを選択します

alt text

ジョブ詳細画面に遷移したら、画面上部の実行の右隣の🔽をクリックします
表示されたオーバーライド使用して実行をクリックします

alt text

サイドメニューが表示されるので、コンテナ引数や、環境変数を追加して実行をクリックします

alt text

ジョブの詳細画面に新しく実行ログが作成されるのでクリックします
ログのタブを選択すると、受部を実行したログが表示されます

alt text

参考

https://zenn.dev/108yen/articles/6e2401d12d1145

Discussion