Workflows のスケジュール


このチュートリアルでは、Cloud Scheduler を使用してワークフローを自動的に実行し、ワークローが特定のスケジュール(この場合は 5 分ごと)で実行されるようにする方法について説明します。

目標

  1. ランタイム引数を受け取ることができるワークフローを作成してデプロイします。
  2. ワークフローをトリガーし、正しい形式の JSON 引数を渡して 5 分ごとにワークフローを実行する Cloud Scheduler ジョブを作成します。

費用

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

  1. App Engine アプリの作成など、Cloud Scheduler 用に環境を設定します。
  2. Enable the Workflows API.

    Enable the API

  3. このチュートリアルで使用するデフォルトのロケーションを設定します。
      gcloud config set workflows/location REGION
    REGION は、サポートされている Workflows のロケーションに置き換えます。
  4. ワークフローが使用するサービス アカウントを作成します。例: sa-name
      gcloud iam service-accounts create sa-name
  5. アカウントがワークフローをトリガーする権限を持つよう、サービス アカウントに workflows.invoker のロールを付与します。
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member "serviceAccount:sa-name@PROJECT_ID.iam.gserviceaccount.com" \
          --role "roles/workflows.invoker"
  6. PROJECT_ID は、Google Cloud プロジェクト ID に置き換えます。
  7. サービス アカウントに logging.logWriter ロールを付与します。
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member "serviceAccount:sa-name@PROJECT_ID.iam.gserviceaccount.com" \
          --role "roles/logging.logWriter"

ランタイム引数を受け取るワークフローを作成する

ワークフローは、Workflows 構文で記述された一連のステップで構成され、YAML 形式または JSON 形式のいずれでも記述できます。ワークフローを作成したら、デプロイして実行できるようにします。

Console

  1. Google Cloud コンソールで、[ワークフロー] ページに移動します。

    [ワークフロー] に移動

  2. [作成] をクリックします。

  3. 新しいワークフローの名前として「myFirstWorkflow」を入力します。

  4. リージョンには us-central1 を選択します。

  5. 以前に作成したサービス アカウントを選択します。

  6. [次へ] をクリックします。

  7. ワークフロー エディタで、次のワークフローの定義を入力します。

    YAML

    main:
      params: [args]
      steps:
        - step1:
            assign:
              - outputVar: ${"Hello, " + args.firstName + " " + args.lastName + "!"}
        - step2:
            return: ${outputVar}

    JSON

    {
      "main": {
        "params": [
          "args"
        ],
        "steps": [
          {
            "step1": {
              "assign": [
                {
                  "outputVar": "${\"Hello \" + args.firstName + \" \" + args.lastName}"
                }
              ]
            }
          },
          {
            "step2": {
              "return": "${outputVar}"
            }
          }
        ]
      }
    }
      

    このワークフローは、ランタイムの引数として渡された姓と名の人に対する「Hello」というあいさつを返します。

  8. [デプロイ] をクリックします。

gcloud

  1. ターミナルを開きます。
  2. 次のワークフロー定義を YAML または JSON ファイル(myFirstWorkflow.yamlmyFirstWorkflow.json など)として保存します。

    YAML

    main:
      params: [args]
      steps:
        - step1:
            assign:
              - outputVar: ${"Hello, " + args.firstName + " " + args.lastName + "!"}
        - step2:
            return: ${outputVar}

    JSON

    {
      "main": {
        "params": [
          "args"
        ],
        "steps": [
          {
            "step1": {
              "assign": [
                {
                  "outputVar": "${\"Hello \" + args.firstName + \" \" + args.lastName}"
                }
              ]
            }
          },
          {
            "step2": {
              "return": "${outputVar}"
            }
          }
        ]
      }
    }
      

    このワークフローは、ランタイムの引数として渡された姓と名の人に対する「Hello」というあいさつを返します。

  3. 次のコマンドを入力してワークフローをデプロイします。

    gcloud workflows deploy myFirstWorkflow \
        --source=myFirstWorkflow.yaml_OR_json \
        --service-account=sa-name@PROJECT_ID.iam.gserviceaccount.com

    以前に作成したワークフロー定義ファイルの形式に応じて、yaml_OR_jsonyaml または json に置き換えます。

ワークフローをスケジュールする

以前に作成したサービス アカウントを使用して、ワークフローをトリガーする Cloud Scheduler ジョブを作成します。

Console

  1. Google Cloud コンソールで [Cloud Scheduler] ページに移動します。

    Cloud Scheduler に移動

  2. [ジョブを作成] をクリックします。

  3. [名前] を my-workflow-job に設定します。

  4. [頻度] に、以下を入力します。

    */5 * * * *
    これにより、5 分ごとにジョブが実行されます。間隔は unix-cron 形式を使用して定義されます。

  5. [タイムゾーン] で、国とタイムゾーンを選択します。

    たとえば、米国とロサンゼルスや太平洋夏時間(PDT)を選択します。

  6. [続行] をクリックします。

  7. [ターゲット タイプ] で [HTTP] を選択します。

  8. [URL] に以下のように入力します。

    https://workflowexecutions.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/workflows/myFirstWorkflow/executions
    

  9. [HTTP メソッド] はデフォルトの POST のままにします。

  10. 次の 2 つの HTTP ヘッダーを追加します。

    • 名前: Content-Type、値: application/octet-stream
    • 名前: User-Agent、値: Google-Cloud-Scheduler
  11. [本文] に以下のように入力します。

    {"argument": "{\"firstName\":\"Sherlock\", \"lastName\":\"Holmes\"}"}
    

    これは、ワークフローの引数の JSON エンコードを渡します。この場合、名は「Sherlock」、姓は「Holmes」です。文字列に含まれる二重引用符はバックスラッシュ(\)を使用してエスケープします。

  12. [Auth ヘッダー] で [OAuth トークンを追加] を選択します。

  13. 以前に作成したサービス アカウントを入力します。

    sa-name@PROJECT_ID.iam.gserviceaccount.com
    
    https://www.googleapis.com/auth/cloud-platform のデフォルトが使用されるため、スコープを指定する必要はありません。

  14. その他の値はすべてデフォルトのままにして、[作成] をクリックします。

gcloud

次のコマンドを入力して、my-workflow-job というジョブをスケジュールします。

gcloud scheduler jobs create http my-workflow-job \
    --schedule="*/5 * * * *" \
    --uri="https://workflowexecutions.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/workflows/myFirstWorkflow/executions" \
    --message-body="{\"argument\": \"{\\\"firstName\\\":\\\"Sherlock\\\", \\\"lastName\\\":\\\"Holmes\\\"}\"}" \
    --time-zone="America/Los_Angeles" \
    --oauth-service-account-email="sa-name@PROJECT_ID.iam.gserviceaccount.com"

間隔は unix-cron 形式を使用して定義されます。

message-body フラグを使用すると、ワークフローの引数の JSON エンコードを渡します。この場合、名は「Sherlock」、姓は「Holmes」です。文字列に含まれる二重引用符はバックスラッシュ(\)を使用してエスケープします。

これで、ワークフローは 5 分ごとに実行されるようになります。

gcloud scheduler フラグの詳細と、ワークフローの実行中に各呼び出しステップがログに記録されるようにコールロギングを適用する方法については、ワークフローをスケジュールするgcloud リファレンスをご覧ください。

ジョブを実行して結果を確認する

Console

  1. Google Cloud コンソールで [Cloud Scheduler] ページに移動します。

    Cloud Scheduler に移動

    ジョブが表示されない場合は、ページの更新が必要になることがあります。

  2. my-workflow-job という名前のジョブで、[今すぐ実行] をクリックします。

    結果」の値が 「成功」に更新されます。

  3. Google Cloud コンソールで、[ワークフロー] ページに移動します。

    [ワークフロー] に移動

  4. ワークフローのリストから、[myFirstWorkflow] をクリックして詳細ページを開きます。

    ワークフローの実行状態が「完了」になっているはずです。

  5. ワークフローの実行 ID をクリックして詳細ページを開き、ワークフローの結果を出力ペインに表示します。

    出力は「Hello, Sherlock Holmes!」となります。

gcloud

  1. Cloud Scheduler ジョブを実行してワークフローを実行します。

    gcloud scheduler jobs run my-workflow-job
    
  2. ワークフローの実行 ID を取得します。

    gcloud workflows executions list myFirstWorkflow
    

    次のような出力(実行 ID は太字で表示)が表示されます。

    projects/316710615161/locations/us-central1/workflows/myFirstWorkflow/executions/138b31e1-f3bb-4ba7-a6da-008d0cb4a320
  3. ワークフローの実行結果を取得します。

    gcloud workflows executions describe EXECUTION_ID --workflow myFirstWorkflow

    EXECUTION_ID は、前の手順で返された実行 ID で置き換えます。

    出力は次のようになります。

    argument: '{"firstName":"Sherlock","lastName":"Holmes"}'
    endTime: '2021-09-09T15:15:00.869350639Z'
    name: projects/316710615161/locations/us-central1/workflows/myFirstWorkflow/executions/138b31e1-f3bb-4ba7-a6da-008d0cb4a320
    result: '"Hello, Sherlock Holmes!"'
    startTime: '2021-09-09T15:15:00.839175480Z'
    state: SUCCEEDED
    workflowRevisionId: 000001-4f9

お疲れさまでした。これで、特定のスケジュールでワークフローを自動的に実行する Cloud Scheduler ジョブが正常に作成されました。

クリーンアップ

チュートリアルが終了したら、作成したリソースをクリーンアップして、割り当ての使用を停止し、課金されないようにできます。次のセクションで、リソースを削除または無効にする方法を説明します。

プロジェクトの削除

課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除するには:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Cloud Scheduler ジョブの削除

  1. Google Cloud コンソールの [Cloud Scheduler] ページに移動します。

    Cloud Scheduler に移動

  2. ジョブの横のチェックボックスを選択します。

  3. ページの上部にある [削除] をクリックして、削除操作を確定します。

ワークフローの削除

  1. Google Cloud コンソールの [Workflows] ページに移動します。

    [ワークフロー] に移動

  2. ワークフローを選択します。

  3. ページの上部にある [削除] をクリックします。ワークフローの名前を入力し、削除操作を確定します。

App Engine アプリを無効にする

App Engine アプリを無効にすると、アプリケーション データと設定は保持されますが、アプリケーションによるインスタンスの実行やリクエストの処理が停止されます。

  1. Google Cloud コンソールの [アプリケーション設定] ページに移動します。

    [アプリケーションの設定] に移動

  2. [アプリケーションを無効にする] をクリックします。

  3. 表示される手順に沿って操作します。

次のステップ