Cloud Workflows から Cloud Run Jobs を実行してみた
はじめに
Google I/O 2022 の開発者キーノートで発表された Cloud Run Jobs を聞いて K8s の kind: Job
ポジションかなと思いつつ、自動化周りで Cloud Workflows との組み合わせができれば色んなユースケースで使えそうな気がしましたが、ちょうど該当する Cloud Workflows Connector も用意されていたので軽く試してみました。
触ってみる
Cloud Run Jobs パターン
実装
Terraform
resource "google_artifact_registry_repository" "integration_cloud_run_jobs" {
provider = google-beta
location = "asia-northeast1"
repository_id = "integration-cloud-run-jobs"
format = "DOCKER"
}
resource "google_service_account" "integration_cloud_run_jobs" {
account_id = "icrj-workflow"
}
variable "workflow_roles" {
default = [
"roles/logging.logWriter",
"roles/run.admin"
]
}
resource "google_project_iam_member" "workflow" {
for_each = toset(var.workflow_roles)
role = each.value
member = "serviceAccount:${google_service_account.integration_cloud_run_jobs.email}"
}
resource "google_workflows_workflow" "integration_cloud_run_jobs" {
name = "integration-cloud-run-jobs-workflow"
region = "asia-southeast1"
service_account = google_service_account.integration_cloud_run_jobs.id
source_contents = templatefile("${path.module}/workflow.yaml", {})
}
workflow.yaml
まだ europe-west9
リージョンしか動けないので注意。
main:
params: [args]
steps:
- init:
assign:
- project_number: $${sys.get_env("GOOGLE_CLOUD_PROJECT_NUMBER")}
- test_cloudrun_jobs:
call: googleapis.run.v1.namespaces.jobs.run
args:
name: $${"namespaces/" + project_number + "/jobs/integration-cloud-run-jobs"}
location: europe-west9
result: resp
- test_output:
call: sys.log
args:
text: $${resp}
severity: INFO
- finish:
return: "OK"
main.go
package main
import "fmt"
func main() {
fmt.Println("Hello World")
}
Dockerfile
FROM golang:1.16-alpine as builder
ENV CGO_ENABLED=0 GOOS=linux GOARCH=amd64
WORKDIR /go/src/app
COPY . /go/src/app
RUN go mod download
RUN go clean -cache \
&& go build -o /go/bin/app
FROM gcr.io/distroless/base
COPY /go/bin/app /
CMD ["/app"]
Makefile
REGISTRY := "asia-northeast1-docker.pkg.dev/PROJECT_ID/integration-cloud-run-jobs/hello-world"
TAG := "latest"
auth:
@gcloud auth configure-docker asia-northeast1-docker.pkg.dev
build:
@docker build -t $(REGISTRY):$(TAG) .
push:
@docker push $(REGISTRY):$(TAG)
# https://cloud.google.com/sdk/gcloud/reference/beta/run/jobs/create
create-job:
@gcloud beta run jobs create integration-cloud-run-jobs \
--region europe-west9 \
--image $(REGISTRY) \
--cpu 1.0 --memory 512Mi \
--tasks 2 --task-timeout 3m \
--max-retries 2 \
--parallelism 2
ハマった箇所
Cloud Workflows Connector の googleapis.run.v1.namespaces.jobs.run
モジュールの args.name
に Cloud Run Jobs の名前だけ入れればいけるかなと思ったんですが、Cloud Workflows ジョブを実行してみたら The requested URL <code>/apis/run.googleapis.com/v1/integration-cloud-run-jobs:run</code> was not found on this server.
っていうエラーが返して来ました。ちょっと Cloud Run Jobs の yaml を確認してみたら selfLink
に namespace の情報も埋まっていたので色々試した結果 namespaces/PROJECT_NUMBER/jobs/CLOUD_RUN_JOBS_NAME
で正常に実行することができました。
終わりに
ちょっと重たいデータの集計処理などを Cloud Run Jobs に任せて Cloud Workflows を通して他の Google Cloud サービスとのパイプラインを組むことができるようになったのでアプリレベルのトランジェクションの選択肢がもっと増えたかなと思われます。
こちらの記事に載せられているコードはこちらをご参考お願いします。
Discussion