このチュートリアルでは、Workflows を使用して一連のサービスをリンクする方法について説明します。2 つのパブリック HTTP サービス(Cloud Run functions を使用)、外部 REST API、プライベート Cloud Run サービスを接続すると、柔軟でサーバーレスなアプリケーションを作成できます。
目標
このチュートリアルでは、Google Cloud CLI を使用して単一のワークフローを作成します。ここでは、一度に 1 つのサービスに接続します。
- 2 つの Cloud Run functions サービスをデプロイします。最初の関数で乱数を生成し、2 番目の関数で渡された数値を乗算します。
- Workflows を使用して 2 つの HTTP 関数を接続します。ワークフローを実行し、結果を返して外部 API に渡します。
- Workflows を使用して、指定された数値の
log
を返す外部 HTTP API を接続します。ワークフローを実行し、結果を返して Cloud Run サービスに渡します。 - 認証されたアクセスのみを許可する Cloud Run サービスをデプロイします。サービスは、指定された数値の
math.floor
を返します。 - Workflows を使用して Cloud Run サービスに接続し、ワークフロー全体を実行して最終結果を返します。
次の図は、プロセスの概要と、最終的なワークフローを可視化したものを示しています。
料金
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
組織で定義されているセキュリティの制約により、次の手順を完了できない場合があります。トラブルシューティング情報については、制約のある Google Cloud 環境でアプリケーションを開発するをご覧ください。
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run functions, Cloud Run, Cloud Storage, and Workflows APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com cloudfunctions.googleapis.com run.googleapis.com storage.googleapis.com workflows.googleapis.com - Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run functions, Cloud Run, Cloud Storage, and Workflows APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com cloudfunctions.googleapis.com run.googleapis.com storage.googleapis.com workflows.googleapis.com - Google Cloud CLI のコンポーネントを更新します。
gcloud components update
- Cloud Shell 内でコマンドを実行している場合は、gcloud CLI ですでに認証されています。それ以外の場合は、ご自分のアカウントでログインします。
gcloud auth login
- Workflows が使用するサービス アカウントを作成します。
export SERVICE_ACCOUNT=workflows-sa gcloud iam service-accounts create ${SERVICE_ACCOUNT}
- サービス アカウントが認証済みの Cloud Run サービスを呼び出すことができるようにするには、Workflows サービス アカウントに
run.invoker
ロールを付与します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/run.invoker"
PROJECT_ID
は、実際の Google Cloud プロジェクト ID に置き換えます。 - このチュートリアルで使用するデフォルトのロケーションを設定します。
gcloud config set project PROJECT_ID export REGION=REGION gcloud config set functions/region ${REGION} gcloud config set run/region ${REGION} gcloud config set workflows/location ${REGION}
REGION
は、サポートされている任意の Workflows のロケーションに置き換えます。
最初の 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 \ --runtime python37 \ --trigger-http \ --allow-unauthenticated
関数のデプロイには数分かかる場合があります。また、Google Cloud コンソールで Cloud Run functions のインターフェースを使用して関数をデプロイできます。
関数がデプロイされたら、
httpsTrigger.url
プロパティを確認できます。gcloud functions describe randomgen
次の curl コマンドを使用して、この関数を試すことができます。
curl $(gcloud functions describe randomgen --format='value(httpsTrigger.url)')
数値がランダムに生成され、返されます。
2 つ目の Cloud Run functions サービスをデプロイする
HTTP リクエストを受信すると、この HTTP 関数は JSON 本文から input
を抽出し、2 を乗算して、結果を JSON 形式で返します。
multiply
という名前のディレクトリを作成し、そのディレクトリに移動します。mkdir ~/multiply cd ~/multiply
次の Python コードを含むテキスト ファイルを
main.py
という名前で作成します。HTTP 処理用の Flask への依存関係をサポートするには、pip パッケージ マネージャー用のテキスト ファイルを作成します。ファイル名を
requirements.txt
にして、以下を追加します。HTTP トリガーを使用して関数をデプロイし、未認証アクセスを許可します。
gcloud functions deploy multiply \ --runtime python37 \ --trigger-http \ --allow-unauthenticated
関数のデプロイには数分かかる場合があります。また、Google Cloud コンソールで Cloud Run functions のインターフェースを使用して関数をデプロイできます。
関数がデプロイされたら、
httpsTrigger.url
プロパティを確認できます。gcloud functions describe multiply
次の curl コマンドを使用して、この関数を試すことができます。
curl $(gcloud functions describe multiply --format='value(httpsTrigger.url)') \ -X POST \ -H "content-type: application/json" \ -d '{"input": 5}'
数値 10 が返されます。
ワークフローで 2 つの Cloud Run functions サービスを接続する
ワークフローは、ワークフロー構文で記述された一連のステップで構成され、YAML 形式または JSON 形式のいずれでも記述できます。これがワークフローの定義です。詳細な説明については、構文リファレンスのページをご覧ください。
ホーム ディレクトリに戻ります。
cd ~
次の内容を含むテキスト ファイルを
workflow.yaml
という名前で作成します。- randomgen_function: call: http.get args: url: https://REGION-PROJECT_ID.cloudfunctions.net/randomgen result: randomgen_result - multiply_function: call: http.post args: url: https://REGION-PROJECT_ID.cloudfunctions.net/multiply body: input: ${randomgen_result.body.random} result: multiply_result - return_result: return: ${multiply_result}
これにより、2 つの HTTP 関数がリンクされ、最終結果が返されます。
ワークフローを作成したら、デプロイして実行の準備ができます。
gcloud workflows deploy WORKFLOW_NAME --source=workflow.yaml
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: https://REGION-PROJECT_ID.cloudfunctions.net/randomgen result: randomgen_result - multiply_function: call: http.post args: url: https://REGION-PROJECT_ID.cloudfunctions.net/multiply 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}
これにより、外部 REST サービスが Cloud Run functions サービスにリンクされ、最終結果が返されます。
変更されたワークフローをデプロイします。
gcloud workflows deploy WORKFLOW_NAME --source=workflow.yaml
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 \ --platform managed \ --no-allow-unauthenticated
サービス URL が表示されたら、デプロイは完了しています。ワークフロー定義を更新するときに、この URL を指定する必要があります。
ワークフローで Cloud Run サービスを接続する
既存のワークフローを更新して、Cloud Run サービスの URL を指定します。
ワークフローのソースファイルを編集し、次の内容で置き換えます。
- randomgen_function: call: http.get args: url: https://REGION-PROJECT_ID.cloudfunctions.net/randomgen result: randomgen_result - multiply_function: call: http.post args: url: https://REGION-PROJECT_ID.cloudfunctions.net/multiply 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}
CLOUD_RUN_SERVICE_URL
は、Cloud Run サービス URL に置き換えます。これにより、ワークフローで Cloud Run サービスが接続されます。
auth
キーを使用すると、Cloud Run サービスの呼び出しで認証トークンが渡されます。詳細については、ワークフローから認証済みリクエストを行うをご覧ください。変更されたワークフローをデプロイします。
gcloud workflows deploy WORKFLOW_NAME \ --source=workflow.yaml
最終ワークフローを実行します。
gcloud workflows run WORKFLOW_NAME
出力は次のようになります。
result: '{"Floor":{"body":"4","code":200 ... "Log":{"body":"4.02535169073515","code":200 ... "Multiply":{"body":{"multiplied":56},"code":200 ... "Random":{"body":{"random":28},"code":200 ... startTime: '2023-11-13T21:22:56.782669001Z' state: SUCCEEDED
これで完了です。一連のサービスを接続するワークフローのデプロイと実行が完了しました。
式、条件付きジャンプ、Base64 エンコード / デコード、サブワークフローなどを使用して複雑なワークフローを作成するには、Workflows 構文リファレンスと標準ライブラリの概要をご覧ください。
クリーンアップ
このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用し、このチュートリアルで変更を加えずに残す場合は、チュートリアル用に作成したリソースを削除します。
プロジェクトの削除
課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
チュートリアル リソースの削除
このチュートリアルでデプロイした Cloud Run サービスを削除します。
このチュートリアルで作成したワークフローを削除します。
Artifact Registry からコンテナ イメージを削除します。
チュートリアルを設定したときに追加した Google Cloud CLI のデフォルト構成を削除します。
gcloud config unset functions/region gcloud config unset run/region gcloud config unset workflows/location gcloud config unset project