WorkflowsをGoから実行する

2 min read読了の目安(約1900字

はじめに

GCPのWorkflowsにて作成したワークフローの実行方法は2021年4月現在、
次の3種類の方法で実行することができます。

  • Console
  • gcloud
  • REST API

https://cloud.google.com/workflows/docs/executing-workflow?hl=ja#executing_a_workflow

Goから実行する

GoからGCPプロダクトを扱う場合、google-cloud-goを利用するのがほとんどですが、
現状はWorkflowsのパッケージがないので、 googleapis/google-api-go-client を使用します。

https://pkg.go.dev/google.golang.org/api@v0.43.0/workflows/v1

以下、サンプルコード
projectIDlocationを任意の値に変更してください。

main.go
package main

import (
	"context"
	"fmt"

	"google.golang.org/api/workflowexecutions/v1"
	"google.golang.org/api/workflows/v1"
)

const (
	projectID = "YOUR_PROJECT_ID"
	location  = "YOUR_LOCATION"
)

func main() {

	ctx := context.Background()

	// workflowリストを取得
	var targetWorkflowName string
	{
		workflow, err := workflows.NewService(ctx)
		if err != nil {
			panic(err)
		}

		// 指定したプロジェクトID・ロケーションのワークフロー一覧を取得
		parent := fmt.Sprintf("projects/%s/locations/%s", projectID, location)
		resp, err := workflow.Projects.Locations.Workflows.List(parent).Do()
		if err != nil {
			panic(err)
		}

		for _, workflow := range resp.Workflows {

			// ワークフロー名を出力
			fmt.Println(workflow.Name)

			// 最終ループのワークフロー名を代入(※雑なコードなのはご容赦)
			targetWorkflowName = workflow.Name
		}
	}

	// targetWorkflowNameを実行する
	workflowExecService, err := workflowexecutions.NewService(ctx)
	if err != nil {
		panic(err)
	}

	// ワークフローの実行
	// e.g. targetWorkflowName="projects/{PROJECT_ID}/locations/{LOCATION}/workflows/{WORKFLOW_NAME}"
	exe, err := workflowExecService.Projects.Locations.Workflows.Executions.Create(targetWorkflowName, &workflowexecutions.Execution{
		Name: targetWorkflowName,
	}).Do()
	if err != nil {
		panic(err)
	}

	// 実行結果出力
	fmt.Println(exe.Name)
}

そのほか参考リンク

https://cloud.google.com/workflows/docs/reference/rest/v1beta/projects.locations.workflows/list