こんにちは、香田です。
今回はCloud Workflowsを使用してワークフローをスケジュール実行する方法について紹介していきます。
Cloud Workflowsとは
Cloud Workflowsとは、GCPから提供されているサーバーレスなワークフローサービスです。
Google Cloudや外部サービスなどHTTPベースのAPIサービスを組み合わせ、条件に応じた実行や順序付け実行、エラー処理やリトライ処理等をYAML構文で定義し、処理を自動化することができるサービスです。
ワークフローの実行方法
はじめにワークフローの実行方法についてgcloud
コマンドを利用した方法について紹介していきます。
ワークフローをYAMLファイルで作成します。
- myFirstWorkflow.yaml
- getCurrentTime:
call: http.get
args:
url: https://us-central1-workflowsample.cloudfunctions.net/datetime
result: currentTime
- readWikipedia:
call: http.get
args:
url: https://en.wikipedia.org/w/api.php
query:
action: opensearch
search: ${currentTime.body.dayOfTheWeek}
result: wikiResult
- returnResult:
return: ${wikiResult.body[1]}
つぎに作成したYAMLファイルを指定し、ワークフローをデプロイします。
$ gcloud beta workflows deploy myFirstWorkflow --source=myFirstWorkflow.yaml
デプロイすると下記のようにワークフローが確認できます。
ワークフローの実行は下記になります。
$ gcloud beta workflows run myFirstWorkflow
下記のように実行の詳細について入力、出力といった形式で確認できます。
ワークフローの制御方法
ワークフローは下記のようにnext
やswitch
を使用して実行順序や条件を制御することが可能です。
- getCurrentTime:
call: http.get
args:
url: https://us-central1-workflowsample.cloudfunctions.net/datetime
result: currentTime
- conditionalSwitch:
switch:
- condition: ${currentTime.body.dayOfTheWeek == "Friday"}
next: friday
- condition: ${currentTime.body.dayOfTheWeek == "Saturday" OR currentTime.body.dayOfTheWeek == "Sunday"}
next: weekend
next: workWeek
- friday:
return: "金曜日です"
- weekend:
return: "週末です"
- workWeek:
return: "平日です"
ワークフローのスケジュール実行
ワークフローのスケジュール実行は、Cloud Schedulerを使用することで実行可能となります。
スケジュール実行する際、Cloud SchedulerがCloud Workflows APIにリクエストを送信する為、ワークフローで利用するサービスアカウントを作成する必要があります。
サービスアカウントを作成します。
$ gcloud iam service-accounts create schedule-workflow \
--display-name=schedule-workflow
つぎに作成したサービスアカウントに権限を付与します。
$ PROJECT_NAME=$(gcloud config get-value project)
$ SERVICE_ACCOUNT_NAME="schedule-workflow"
$ gcloud projects add-iam-policy-binding $PROJECT_NAME \
--member serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_NAME.iam.gserviceaccount.com \
--role roles/workflows.invoker
スケジュール実行したいワークフローをデプロイします。
$ gcloud beta workflows deploy myFirstWorkflow --source=myFirstWorkflow.yaml
5分毎にワークフローが実行されるスケジュールジョブを作成します。
$ WORKFLOW_NAME="myFirstWorkflow"
$ JOB_NAME="sampleJob"
$ TIME_ZONE="Asia/Tokyo"
$ REGION_NAME="us-central1"
$ gcloud beta scheduler jobs create http $JOB_NAME \
--schedule="*/5 * * * *" \
--uri="https://workflowexecutions.googleapis.com/v1beta/projects/$PROJECT_NAME/locations/$REGION_NAME/workflows/$WORKFLOW_NAME/executions" \
--time-zone="$TIME_ZONE" \
--oauth-service-account-email="$SERVICE_ACCOUNT_NAME@$PROJECT_NAME.iam.gserviceaccount.com"
下記のようにジョブが作成されていることが確認できます。
スケジュール実行によりワークフローが正常に実行されていることが確認できれば成功です。
さいごに
Cloud Workflowsを使用してワークフローをスケジュール実行する方法いかがでしたでしょうか。
Cloud Workflowsはサーバーレスなサービスな為、インフラの管理が不要な点やYAMLでワークフローを定義できる点など利用者に優しいサービスではないでしょうか。
最後までご覧いただきありがとうございます。