このチュートリアルでは、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 環境でアプリケーションを開発するをご覧ください。
- Google Cloud アカウントにログインします。 Google Cloudを初めて使用する場合は、 アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init -
Google Cloud プロジェクトを作成または選択します。
プロジェクトの選択または作成に必要なロール
- プロジェクトを選択する: プロジェクトの選択に特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトであれば、どのプロジェクトでも選択できます。
-
プロジェクトを作成する: プロジェクトを作成するには、
resourcemanager.projects.create権限を含むプロジェクト作成者ロール(roles/resourcemanager.projectCreator)が必要です。ロールを付与する方法を確認する。
-
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 Run、Cloud Run functions、Cloud Storage、Workflows API を有効にします。
API を有効にするために必要なロール
API を有効にするには、
serviceusage.services.enable権限を含む Service Usage 管理者 IAM ロール(roles/serviceusage.serviceUsageAdmin)が必要です。ロールを付与する方法を確認する。gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com run.googleapis.com cloudfunctions.googleapis.com storage.googleapis.com workflows.googleapis.com -
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init -
Google Cloud プロジェクトを作成または選択します。
プロジェクトの選択または作成に必要なロール
- プロジェクトを選択する: プロジェクトの選択に特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトであれば、どのプロジェクトでも選択できます。
-
プロジェクトを作成する: プロジェクトを作成するには、
resourcemanager.projects.create権限を含むプロジェクト作成者ロール(roles/resourcemanager.projectCreator)が必要です。ロールを付与する方法を確認する。
-
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 Run、Cloud Run functions、Cloud Storage、Workflows API を有効にします。
API を有効にするために必要なロール
API を有効にするには、
serviceusage.services.enable権限を含む Service Usage 管理者 IAM ロール(roles/serviceusage.serviceUsageAdmin)が必要です。ロールを付与する方法を確認する。gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com run.googleapis.com cloudfunctions.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 編集者(
- ワークフローをデプロイするときに、指定されたサービス アカウントに関連付けます。Workflows が使用するサービス アカウントを作成します。
export SERVICE_ACCOUNT=workflows-sa gcloud iam service-accounts create ${SERVICE_ACCOUNT}
- すべての Cloud Run サービスはデフォルトで非公開にデプロイされ、プロジェクト オーナー、プロジェクト編集者、Cloud Run 管理者、Cloud Run 起動元のみが呼び出すことができます。サービス アカウントが認証済みの 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"
最初の 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 構文リファレンスと標準ライブラリの概要をご覧ください。
クリーンアップ
このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用し、このチュートリアルでの変更を加えずに残す場合は、チュートリアル用に作成したリソースを削除します。
プロジェクトの削除
課金されないようにする最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- 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