Cloud Workflowsを使用してワークフローをスケジュール実行する

こんにちは、香田です。

今回はCloud Workflowsを使用してワークフローをスケジュール実行する方法について紹介していきます。

Cloud Workflowsとは

Cloud Workflowsとは、GCPから提供されているサーバーレスなワークフローサービスです。

Google Cloudや外部サービスなどHTTPベースのAPIサービスを組み合わせ、条件に応じた実行や順序付け実行、エラー処理やリトライ処理等をYAML構文で定義し、処理を自動化することができるサービスです。

Cloud Workflowsの概要

ワークフローの実行方法

はじめにワークフローの実行方法について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

下記のように実行の詳細について入力、出力といった形式で確認できます。

ワークフローの制御方法

ワークフローは下記のようにnextswitchを使用して実行順序や条件を制御することが可能です。

- 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 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でワークフローを定義できる点など利用者に優しいサービスではないでしょうか。

最後までご覧いただきありがとうございます。

SNSでもご購読できます。