🎢

Cloud Workflows から Cloud Run Jobs を実行してみた

2022/05/14に公開

はじめに

Google I/O 2022 の開発者キーノートで発表された Cloud Run Jobs を聞いて K8s の kind: Job ポジションかなと思いつつ、自動化周りで Cloud Workflows との組み合わせができれば色んなユースケースで使えそうな気がしましたが、ちょうど該当する Cloud Workflows Connector も用意されていたので軽く試してみました。

触ってみる

Cloud Run Jobs パターン

https://cloud.google.com/workflows/docs/reference/googleapis/run/v1/namespaces.jobs/run

実装

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 --from=builder /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 サービスとのパイプラインを組むことができるようになったのでアプリレベルのトランジェクションの選択肢がもっと増えたかなと思われます。

こちらの記事に載せられているコードはこちらをご参考お願いします。

https://github.com/sano307/cloud-workflows-demo/tree/main/modules/integration-cloud-run-jobs

Discussion