クイックスタート: Cloud クライアント ライブラリを使用してワークフローを実行する

このクイックスタートでは、ワークフローを実行して、クライアント ライブラリを使用して実行結果を表示する方法を説明します。

クライアント ライブラリのインストールと開発環境の設定の詳細については、Workflows クライアント ライブラリの概要をご覧ください。

始める前に

組織が Google Cloud 環境に制約を適用すると、このドキュメントの一部の手順が正しく機能しない場合があります。その場合、パブリック IP アドレスやサービス アカウント キーを作成するようなタスクを完了できない場合があります。制約に関するエラーを返すリクエストを行う場合は、制約がある Google Cloud 環境でアプリケーションを開発する方法をご覧ください。

  1. このクイックスタートのサンプルでは、ワークフロー myFirstWorkflow をすでにデプロイしていることを前提としています。まだデプロイしていない場合は、Google Cloud Console または gcloud コマンドライン ツールを使用して、ここでデプロイしてください。
  2. git ソースコードの管理ツールをダウンロードしてインストールします。

サンプルコードを取得する

  1. ローカルマシンにサンプルアプリのリポジトリのクローンを作成します。

    Java

    git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git

    または、zip 形式のサンプルをダウンロードし、ファイルを抽出してもかまいません。

    Node.js

    git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git

    または、zip 形式のサンプルをダウンロードし、ファイルを抽出してもかまいません。

    Python

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git

    または、zip 形式のサンプルをダウンロードし、ファイルを抽出してもかまいません。

  2. Workflows のサンプルコードが含まれているディレクトリに移動します。

    Java

    cd java-docs-samples/workflows/cloud-client/

    Node.js

    cd nodejs-docs-samples/workflows/quickstart/

    Python

    cd python-docs-samples/workflows/cloud-client/

  3. サンプルコードを見てみましょう。

    Java

    
    // Imports the Google Cloud client library
    
    import com.google.cloud.workflows.executions.v1.CreateExecutionRequest;
    import com.google.cloud.workflows.executions.v1.Execution;
    import com.google.cloud.workflows.executions.v1.ExecutionsClient;
    import com.google.cloud.workflows.executions.v1.WorkflowName;
    import java.io.IOException;
    import java.util.concurrent.ExecutionException;
    
    public class WorkflowsQuickstart {
    
      private static final String PROJECT = System.getenv("GOOGLE_CLOUD_PROJECT");
      private static final String LOCATION = System.getenv().getOrDefault("LOCATION", "us-central1");
      private static final String WORKFLOW = System.getenv().getOrDefault("WORKFLOW",
          "myFirstWorkflow");
    
      public static void main(String... args)
          throws IOException, InterruptedException, ExecutionException {
        if (PROJECT == null) {
          throw new IllegalArgumentException(
            "Environment variable 'GOOGLE_CLOUD_PROJECT' is required to run this quickstart.");
        }
        workflowsQuickstart(PROJECT, LOCATION, WORKFLOW);
      }
    
      private static volatile boolean finished;
    
      public static void workflowsQuickstart(String projectId, String location, String workflow)
          throws IOException, InterruptedException, ExecutionException {
        // Initialize client that will be used to send requests. This client only needs
        // to be created once, and can be reused for multiple requests. After completing all of your
        // requests, call the "close" method on the client to safely clean up any remaining background
        // resources.
        try (ExecutionsClient executionsClient = ExecutionsClient.create()) {
          // Construct the fully qualified location path.
          WorkflowName parent = WorkflowName.of(projectId, location, workflow);
    
          // Creates the execution object.
          CreateExecutionRequest request =
              CreateExecutionRequest.newBuilder()
                  .setParent(parent.toString())
                  .setExecution(Execution.newBuilder().build())
                  .build();
          Execution response = executionsClient.createExecution(request);
    
          String executionName = response.getName();
          System.out.printf("Created execution: %s%n", executionName);
    
          long backoffTime = 0;
          long backoffDelay = 1_000; // Start wait with delay of 1,000 ms
          final long backoffTimeout = 10 * 60 * 1_000; // Time out at 10 minutes
          System.out.println("Poll for results...");
    
          // Wait for execution to finish, then print results.
          while (!finished && backoffTime < backoffTimeout) {
            Execution execution = executionsClient.getExecution(executionName);
            finished = execution.getState() != Execution.State.ACTIVE;
    
            // If we haven't seen the results yet, wait.
            if (!finished) {
              System.out.println("- Waiting for results");
              Thread.sleep(backoffDelay);
              backoffTime += backoffDelay;
              backoffDelay *= 2; // Double the delay to provide exponential backoff.
            } else {
              System.out.println("Execution finished with state: " + execution.getState().name());
              System.out.println("Execution results: " + execution.getResult());
            }
          }
        }
      }
    }

    Node.js

    const {ExecutionsClient} = require('@google-cloud/workflows');
    const client = new ExecutionsClient();
    
    /**
     * Sleeps the process N number of milliseconds.
     * @param {Number} ms The number of milliseconds to sleep.
     */
    function sleep(ms) {
      return new Promise(resolve => {
        setTimeout(resolve, ms);
      });
    }
    
    // Execute workflow
    try {
      const createExecutionRes = await client.createExecution({
        parent: client.workflowPath(projectId, location, workflow),
      });
      const executionName = createExecutionRes[0].name;
      console.log(`Created execution: ${executionName}`);
    
      // Wait for execution to finish, then print results.
      let executionFinished = false;
      let backoffDelay = 1000; // Start wait with delay of 1,000 ms
      console.log('Poll every second for result...');
      while (!executionFinished) {
        const [execution] = await client.getExecution({
          name: executionName,
        });
        executionFinished = execution.state !== 'ACTIVE';
    
        // If we haven't seen the result yet, wait a second.
        if (!executionFinished) {
          console.log('- Waiting for results...');
          await sleep(backoffDelay);
          backoffDelay *= 2; // Double the delay to provide exponential backoff.
        } else {
          console.log(`Execution finished with state: ${execution.state}`);
          console.log(execution.result);
          return execution.result;
        }
      }
    } catch (e) {
      console.error(`Error executing workflow: ${e}`);
    }

    Python

    import time
    
    from google.cloud import workflows_v1beta
    from google.cloud.workflows import executions_v1beta
    from google.cloud.workflows.executions_v1beta.types import executions
    
    # TODO(developer): Uncomment these lines and replace with your values.
    # project = 'my-project-id'
    # location = 'us-central1'
    # workflow = 'myFirstWorkflow'
    
    if not project:
        raise Exception('GOOGLE_CLOUD_PROJECT env var is required.')
    
    # Set up API clients.
    execution_client = executions_v1beta.ExecutionsClient()
    workflows_client = workflows_v1beta.WorkflowsClient()
    
    # Construct the fully qualified location path.
    parent = workflows_client.workflow_path(project, location, workflow)
    
    # Execute the workflow.
    response = execution_client.create_execution(request={"parent": parent})
    print(f"Created execution: {response.name}")
    
    # Wait for execution to finish, then print results.
    execution_finished = False
    backoff_delay = 1  # Start wait with delay of 1 second
    print('Poll every second for result...')
    while (not execution_finished):
        execution = execution_client.get_execution(request={"name": response.name})
        execution_finished = execution.state != executions.Execution.State.ACTIVE
    
        # If we haven't seen the result yet, wait a second.
        if not execution_finished:
            print('- Waiting for results...')
            time.sleep(backoff_delay)
            backoff_delay *= 2  # Double the delay to provide exponential backoff.
        else:
            print(f'Execution finished with state: {execution.state.name}')
            print(execution.result)
            return execution.result

このプログラムは次の処理を行います。

  1. Workflows 用の Cloud クライアント ライブラリを設定します。
  2. ワークフローを実行します。
  3. 実行が終了するまで、ワークフローの実行をポーリングします(指数バックオフを使用)。
  4. 実行結果を出力します。

サンプルの実行

  1. サンプルを実行するには、まず依存関係をインストールします。

    Java

    mvn compile

    Node.js

    npm install

    Python

    pip3 install -r requirements.txt

  2. スクリプトを実行します。

    Java

    GOOGLE_CLOUD_PROJECT=PROJECT_ID LOCATION=CLOUD_REGION WORKFLOW=WORKFLOW_NAME mvn compile exec:java -Dexec.mainClass=com.example.workflows.WorkflowsQuickstart

    Node.js

    node . PROJECT_ID CLOUD_REGION WORKFLOW_NAME

    Python

    GOOGLE_CLOUD_PROJECT=PROJECT_ID LOCATION=CLOUD_REGION WORKFLOW=WORKFLOW_NAME python3 main.py

    次のように置き換えます。

    • PROJECT_ID: (必須)Google Cloud プロジェクトのプロジェクト ID
    • CLOUD_REGION: ワークフローのロケーション(デフォルト: us-central1
    • WORKFLOW_NAME: ワークフローの ID(デフォルト: myFirstWorkflow

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

    Execution finished with state: SUCCEEDED
    ["Sunday","Sunday in the Park with George","Sunday shopping","Sunday Bloody Sunday","Sunday Times Golden Globe Race","Sunday All Stars","Sunday Night (South Korean TV series)","Sunday Silence","Sunday Without God","Sunday Independent (Ireland)"]
    

クリーンアップ

このページで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。

  1. Cloud Console の [ワークフロー] ページに移動します。
    ワークフロー

  2. ワークフローのリストからワークフローをクリックして、[ワークフローの詳細] ページに移動します。

  3. [削除] をクリックします。

  4. ワークフローの名前を入力し、[確認] をクリックします。

次のステップ