Cloud Run Jobsでバッチ実行する
はじめに
Cloud Run Jobsを使ったことがなかったので、バッチを構築してみようと思います!
対象読者
- Cloud Run Jobsを使用したい方
やること
- Cloud Storageにアップロードされた、csvファイルを使用してバッチ処理をするCloud Run Jobsを作成したい方
なぜ、やるか?
今まで、よく、Cloud Runは使用してきましたが、Cloud Run Jobsは使用したことがなかったので、使ってみたかったからです。
方法
- Cloud Storageのファイル取得権限をサービスアカウントに付与する
- バッチを実装する
- コンテナで動作するようにdockefileを書く
- Cloud Run Jobsを設定する
解説
1,2は、難しくもないしCloud Run Jobsを使用するという観点からは外れてしまうため詳しく説明しません。
3は、APIをCloud Runにデプロイする際同様に、Dockerfileを書いてコンテナイメージを作成します。
ここでは、マルチステージビルドをしています。
#バッチ用コンテナに含めるバイナリを作成するコンテナ
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 /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のデプロイも記載します。
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 \
デプロイしたバッチを起動してみます。
ジョブ一覧画面から起動したいジョブを選択します
ジョブ詳細画面に遷移したら、画面上部の実行の右隣の🔽をクリックします
表示されたオーバーライド使用して実行をクリックします
サイドメニューが表示されるので、コンテナ引数や、環境変数を追加して実行をクリックします
ジョブの詳細画面に新しく実行ログが作成されるのでクリックします
ログのタブを選択すると、受部を実行したログが表示されます
参考
Discussion