このチュートリアルでは、Workflows を使用して一連のサービスをリンクする方法について説明します。Cloud Functions(第 2 世代)、外部 REST API、プライベート Cloud Run サービスを使用して 2 つのパブリック HTTP サービスを接続すると、柔軟でサーバーレスなアプリケーションを作成できます。
目標
このチュートリアルでは、Google Cloud CLI を使用して単一のワークフローを作成します。ここでは、一度に 1 つのサービスに接続します。
- 2 つの Cloud Functions サービスをデプロイします。最初の関数で乱数を生成し、2 番目の関数で渡された数値を乗算します。
- Workflows を使用して 2 つの HTTP 関数を接続します。ワークフローを実行し、結果を返して外部 API に渡します。
- Workflows を使用して、指定された数値の
log
を返す外部 HTTP API を接続します。ワークフローを実行し、結果を返して Cloud Run サービスに渡します。 - 認証されたアクセスのみを許可する Cloud Run サービスをデプロイします。サービスは、指定された数値の
math.floor
を返します。 - Workflows を使用して Cloud Run サービスに接続し、ワークフロー全体を実行して最終結果を返します。
次の図は、プロセスの概要と、最終的なワークフローを可視化したものを示しています。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
組織で定義されているセキュリティの制約により、次の手順を完了できない場合があります。トラブルシューティング情報については、制約のある Google Cloud 環境でアプリケーションを開発するをご覧ください。
- Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
- Google Cloud CLI をインストールします。
-
gcloud CLI を初期化するには:
gcloud init
-
Google Cloud プロジェクトを作成または選択します。
-
Google Cloud プロジェクトを作成します。
gcloud projects create PROJECT_ID
PROJECT_ID
は、作成する Google Cloud プロジェクトの名前に置き換えます。 -
作成した Google Cloud プロジェクトを選択します。
gcloud config set project PROJECT_ID
PROJECT_ID
は、実際の Google Cloud プロジェクト名に置き換えます。
-
-
Artifact Registry, Cloud Build, Cloud Functions, Cloud Run, Cloud Storage, and Workflows API を有効にします。
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 CLI を初期化するには:
gcloud init
-
Google Cloud プロジェクトを作成または選択します。
-
Google Cloud プロジェクトを作成します。
gcloud projects create PROJECT_ID
PROJECT_ID
は、作成する Google Cloud プロジェクトの名前に置き換えます。 -
作成した Google Cloud プロジェクトを選択します。
gcloud config set project PROJECT_ID
PROJECT_ID
は、実際の Google Cloud プロジェクト名に置き換えます。
-
-
Artifact Registry, Cloud Build, Cloud Functions, Cloud Run, Cloud Storage, and Workflows API を有効にします。
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
- このチュートリアルで使用するデフォルトのロケーションを設定します。
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 のロケーションに置き換えます。 -
プロジェクト作成者には、オーナーロール(
roles/owner
)が付与されます。デフォルトでは、この Identity and Access Management(IAM)ロールには、ほとんどの Google Cloud リソースへの完全アクセス権に必要な権限が含まれており、この手順は省略できます。プロジェクト作成者でない場合は、プロジェクトで適切なプリンシパルに必要な権限を付与する必要があります。プリンシパルは Google アカウント(エンドユーザーの場合)やサービス アカウント(アプリケーションとコンピューティング ワークロードの場合)になることもあります。詳細については、イベントの宛先のロールと権限のページをご覧ください。
必要な権限
チュートリアルを完了するために必要な権限を取得するには、プロジェクトに対して次の IAM ロールを付与するよう管理者に依頼してください。
- Cloud Build 編集者(
roles/cloudbuild.builds.editor
) -
Cloud Functions デベロッパー(
roles/cloudfunctions.developer
) - Cloud Run 管理者(
roles/run.admin
) - サービス アカウントの作成(
roles/iam.serviceAccountCreator
) - プロジェクト IAM 管理者(
roles/resourcemanager.projectIamAdmin
) - サービス アカウント ユーザー(
roles/iam.serviceAccountUser
) -
Service Usage ユーザー(
roles/serviceusage.serviceUsageConsumer
) - ストレージ管理者(
roles/storage.admin
) - ワークフロー編集者(
roles/workflows.editor
)
ロールの付与の詳細については、アクセスの管理をご覧ください。
- Cloud Build 編集者(
最初の Cloud Functions サービスをデプロイする
HTTP リクエストを受信すると、この HTTP 関数は 1~100 の間の乱数を生成し、その数値を JSON 形式で返します。
randomgen
という名前のディレクトリを作成し、そのディレクトリに移動します。mkdir ~/randomgen cd ~/randomgen
次の Python コードを含むテキスト ファイルを
main.py
という名前で作成します。HTTP 処理用の Flask への依存関係をサポートするには、pip パッケージ マネージャー用のテキスト ファイルを作成します。ファイル名を
requirements.txt
にして、以下を追加します。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"
HTTP トリガーを使用して関数をデプロイし、未認証アクセスを許可します。
gcloud functions deploy randomgen-function \ --gen2 \ --runtime python310 \ --entry-point=randomgen \ --trigger-http \ --allow-unauthenticated
関数のデプロイには数分かかる場合があります。また、Google Cloud コンソールで Cloud 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 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 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 Functions サービスを接続する
ワークフローは、ワークフロー構文で記述された一連のステップで構成され、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
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 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: 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
最終ワークフローを実行します。
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 構文リファレンスと標準ライブラリの概要をご覧ください。
クリーンアップ
このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用し、このチュートリアルで変更を加えずに残す場合は、チュートリアル用に作成したリソースを削除します。
プロジェクトの削除
課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- Google Cloud コンソールで、[リソースの管理] ページに移動します。
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
チュートリアル リソースの削除
このチュートリアルでデプロイした 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