このチュートリアルでは、Workflows を使用して一連のサービスをリンクする方法について説明します。2 つのパブリック HTTP サービス(Cloud Run functions を使用)、外部 REST API、プライベート Cloud Run サービスを接続すると、柔軟でサーバーレスなアプリケーションを作成できます。
最初の Cloud Run functions の関数をデプロイする
HTTP リクエストを受信すると、この HTTP 関数は 1~100 の間の乱数を生成し、その数値を JSON 形式で返します。
- randomgenという名前のディレクトリを作成し、そのディレクトリに移動します。- mkdir ~/randomgen cd ~/randomgen 
- 次の Python コードを含むテキスト ファイルを - main.pyというファイル名で作成します。
- HTTP 処理用の Flask への依存関係をサポートするには、pip パッケージ管理システムのテキスト ファイルを作成します。ファイル名を - requirements.txtにして、以下を追加します。
- HTTP トリガーを使用して関数をデプロイし、未認証アクセスを許可します。 - gcloud functions deploy randomgen-function \ --gen2 \ --runtime python310 \ --entry-point=randomgen \ --trigger-http \ --allow-unauthenticated - 関数のデプロイには数分かかることがあります。代替手段として、 Google Cloud コンソールで Cloud Run functions のインターフェースを使用して関数をデプロイすることもできます。 
- randomgen関数がデプロイされたら、- httpsTrigger.urlプロパティを確認できます。- gcloud functions describe randomgen-function \ --gen2 \ --format="value(serviceConfig.uri)" 
- URL を保存します。これは、後半の演習でワークフローのソースファイルに追加する必要があります。 
- 次の curl コマンドを使用して、この関数を試すことができます。 - curl $(gcloud functions describe randomgen-function \ --gen2 \ --format="value(serviceConfig.uri)") - 数値がランダムに生成され、返されます。 
2 つ目の Cloud Run functions の関数をデプロイする
HTTP リクエストを受信すると、この HTTP 関数は JSON 本文から input を抽出し、2 を乗算して、結果を JSON 形式で返します。
- ホーム ディレクトリに戻ります。 - cd ~ 
- multiplyという名前のディレクトリを作成し、そのディレクトリに移動します。- mkdir ~/multiply cd ~/multiply 
- 次の Python コードを含むテキスト ファイルを - main.pyというファイル名で作成します。
- HTTP 処理用の Flask への依存関係をサポートするには、pip パッケージ管理システムのテキスト ファイルを作成します。ファイル名を - requirements.txtにして、以下を追加します。
- HTTP トリガーを使用して関数をデプロイし、未認証アクセスを許可します。 - gcloud functions deploy multiply-function \ --gen2 \ --runtime python310 \ --entry-point=multiply \ --trigger-http \ --allow-unauthenticated - 関数のデプロイには数分かかることがあります。代替手段として、 Google Cloud コンソールで Cloud Run functions のインターフェースを使用して関数をデプロイすることもできます。 
- multiply関数がデプロイされたら、- httpsTrigger.urlプロパティを確認できます。- gcloud functions describe multiply-function \ --gen2\ --format="value(serviceConfig.uri)" 
- URL を保存します。これは、後半の演習でワークフローのソースファイルに追加する必要があります。 
- 次の curl コマンドを使用して、この関数を試すことができます。 - curl -X POST MULTIPLY_FUNCTION_URL \ -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ -H "Content-Type: application/json" \ -d '{"input": 5}' - 数値 10 が返されます。 
ワークフローで 2 つの Cloud Run functions の関数を接続する
ワークフローは、Workflows の構文で記述された一連のステップで構成され、YAML 形式または JSON 形式のいずれでも記述できます。これがワークフローの定義です。詳細な説明については、構文リファレンスのページをご覧ください。
- ホーム ディレクトリに戻ります。 - cd ~ 
- 次の内容を含むテキスト ファイルを - workflow.yamlという名前で作成します。- - randomgen_function: call: http.get args: url: RANDOMGEN_FUNCTION_URL result: randomgen_result - multiply_function: call: http.post args: url: MULTIPLY_FUNCTION_URL body: input: ${randomgen_result.body.random} result: multiply_result - return_result: return: ${multiply_result}- RANDOMGEN_FUNCTION_URLは、- randomgen関数の URL に置き換えます。
- MULTIPLY_FUNCTION_URLは、- multiply関数の URL に置き換えます。
 - このソースファイルにより、2 つの HTTP 関数がリンクされ、最終結果が返されます。 
- ワークフローを作成したら、デプロイして実行の準備ができます。 - gcloud workflows deploy WORKFLOW_NAME \ --source=workflow.yaml \ --service-account=${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com - WORKFLOW_NAMEは、ワークフローの名前に置き換えます。
- ワークフローを実行します。 - gcloud workflows run WORKFLOW_NAME - 実行とは、ワークフローの定義に含まれるロジックを 1 回だけ実行することです。すべてのワークフローの実行は独立しており、Workflows の迅速なスケーリングにより、多数の同時実行が可能になります。 - ワークフローの実行後、出力は次のようになります。 - result: '{"body":{"multiplied":120},"code":200,"headers":{"Alt-Svc":"h3-29=\":443\"; ... startTime: '2021-05-05T14:17:39.135251700Z' state: SUCCEEDED ...
ワークフローでパブリック REST サービスを接続する
既存のワークフローを更新し、数式を評価できるパブリック REST API(math.js)を接続します。例: curl https://api.mathjs.org/v4/?'expr=log(56)'
ワークフローはデプロイしてあるため、 Google Cloud コンソールの [ワークフロー] ページから編集することもできます。
- ワークフローのソースファイルを編集し、次の内容で置き換えます。 - - randomgen_function: call: http.get args: url: RANDOMGEN_FUNCTION_URL result: randomgen_result - multiply_function: call: http.post args: url: MULTIPLY_FUNCTION_URL body: input: ${randomgen_result.body.random} result: multiply_result - log_function: call: http.get args: url: https://api.mathjs.org/v4/ query: expr: ${"log(" + string(multiply_result.body.multiplied) + ")"} result: log_result - return_result: return: ${log_result}- RANDOMGEN_FUNCTION_URLは、- randomgen関数の URL に置き換えます。
- MULTIPLY_FUNCTION_URLは、- multiply関数の URL に置き換えます。
 - これにより、外部 REST サービスが Cloud Run functions にリンクされ、最終結果が返されます。 
- 変更されたワークフローをデプロイします。 - gcloud workflows deploy WORKFLOW_NAME \ --source=workflow.yaml \ --service-account=${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com 
Cloud Run サービスをデプロイする
HTTP リクエストを受信後に JSON 本文から input を抽出してその math.floor を計算し、結果を返す Cloud Run サービスをデプロイします。
- floorという名前のディレクトリを作成し、そのディレクトリに移動します。- mkdir ~/floor cd ~/floor 
- 次の Python コードを含むテキスト ファイルを - app.pyというファイル名で作成します。
- 同じディレクトリに、次の内容の - Dockerfileを作成します。
- Docker コンテナ イメージを保存できる Artifact Registry 標準リポジトリを作成します。 - gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=${REGION} - REPOSITORYは、リポジトリの一意の名前に置き換えます。
- コンテナ イメージをビルドします。 - export SERVICE_NAME=floor gcloud builds submit --tag ${REGION}-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME} 
- コンテナ イメージを Cloud Run にデプロイし、認証された呼び出しのみが受け入れられるようにします。 - gcloud run deploy ${SERVICE_NAME} \ --image ${REGION}-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}:latest \ --no-allow-unauthenticated 
サービス URL が表示されたら、デプロイは完了しています。ワークフロー定義を更新するときに、この URL を指定する必要があります。
ワークフローで Cloud Run サービスを接続する
既存のワークフローを更新して、Cloud Run サービスの URL を指定します。
- ホーム ディレクトリに戻ります。 - cd ~ 
- ワークフローのソースファイルを編集し、次の内容で置き換えます。 - - randomgen_function: call: http.get args: url: RANDOMGEN_FUNCTION_URL result: randomgen_result - multiply_function: call: http.post args: url: MULTIPLY_FUNCTION_URL body: input: ${randomgen_result.body.random} result: multiply_result - log_function: call: http.get args: url: https://api.mathjs.org/v4/ query: expr: ${"log(" + string(multiply_result.body.multiplied) + ")"} result: log_result - floor_function: call: http.post args: url: CLOUD_RUN_SERVICE_URL auth: type: OIDC body: input: ${log_result.body} result: floor_result - create_output_map: assign: - outputMap: randomResult: ${randomgen_result} multiplyResult: ${multiply_result} logResult: ${log_result} floorResult: ${floor_result} - return_output: return: ${outputMap}- RANDOMGEN_FUNCTION_URLは、- randomgen関数の URL に置き換えます。
- MULTIPLY_FUNCTION_URLは、- multiply関数の URL に置き換えます。
- CLOUD_RUN_SERVICE_URLは、Cloud Run サービス URL に置き換えます。
 - これにより、ワークフローで Cloud Run サービスが接続されます。 - authキーを使用すると、Cloud Run サービスの呼び出しで認証トークンが渡されます。詳細については、ワークフローから認証済みリクエストを行うをご覧ください。
- 変更されたワークフローをデプロイします。 - gcloud workflows deploy WORKFLOW_NAME \ --source=workflow.yaml \ --service-account=${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com 
- 最終ワークフローを実行します。 - gcloud workflows run WORKFLOW_NAME - 出力は次のようになります。 - result: '{"floorResult":{"body":"4","code":200 ... "logResult":{"body":"4.02535169073515","code":200 ... "multiplyResult":{"body":{"multiplied":56},"code":200 ... "randomResult":{"body":{"random":28},"code":200 ... startTime: '2023-11-13T21:22:56.782669001Z' state: SUCCEEDED
これで完了です。一連のサービスを接続するワークフローのデプロイと実行が完了しました。
式、条件付きジャンプ、Base64 エンコードまたはデコード、サブワークフローなどを使用して複雑なワークフローを作成するには、Workflows 構文リファレンスと標準ライブラリの概要をご覧ください。