arrow_back

Google Cloud でのイベント ドリブン型オーケストレーションの構築

ログイン 参加
700 以上のラボとコースにアクセス

Google Cloud でのイベント ドリブン型オーケストレーションの構築

ラボ 1時間 30分 universal_currency_alt クレジット: 5 show_chart 中級
info このラボでは、学習をサポートする AI ツールが組み込まれている場合があります。
700 以上のラボとコースにアクセス

概要

Google Cloud のサーバーレス コンピューティングでは、フルマネージドのサーバーレス プラットフォーム上でスケーラビリティの高いアプリケーションを開発してデプロイできます。サービスはトラフィックに応じて自動的にスケールアップ / スケールダウンされます。

サービスの統合により、非同期かつ疎結合の状態でサービスを簡単に統合し、迅速なイノベーションを実現できます。Eventarc を使用すると、インフラストラクチャを管理することなくイベント ドリブン アーキテクチャを構築できます。Workflows では、サービスと API をオーケストレートして信頼性の高いアプリケーションを簡単に構築できます。Cloud Scheduler は、ワークロードをスケジュールするためのフルマネージド cron ジョブサービスです。Cloud Tasks は、分散タスクキューを作成するためのフルマネージド サービスです。Eventarc、Workflows、Cloud Scheduler、Cloud Tasks を使用することで、オブザーバビリティ、信頼性、セキュリティを維持しながらサービスを統合できるようになります。

このラボでは、Workflows を使用して、受信画像からサムネイルを作成してメタデータを抽出するプロセスを管理するワークフローを作成します。画像が Cloud Storage バケットにアップロードされると、Eventarc がこれを検出してワークフローの実行を開始します。

ワークフローでは、Cloud Vision API を呼び出して、アップロードされた写真を分析します。Cloud Vision が画像が安全かどうかを判断し、画像内のテキストを検出して、画像コンテンツのラベルを提供します。ビジョンデータは、Cloud Run functions で作成されたカスタム関数を使用して抽出されます。抽出されたデータは、Google Cloud のフルマネージド サーバーレス ドキュメント データベースである Firestore に保存されます。また、ワークフローでは Cloud Tasks を使用して、サムネイルを作成するためのタスクをキューに追加します。

Cloud Build を使用して 3 つのサービスを構築し、Cloud Run にデプロイします。Cloud Run は、コンテナ化されたサービスを実行するためのサーバーレス プラットフォームです。これらのサービスの一つは、ワークフローで作成されたタスクに応答してサムネイルを作成します。

2 つ目のサービスは、最新画像の写真コラージュを作成します。コラージュ サービスは、Cloud Scheduler で作成されたスケジュールに従って実行されます。

3 つ目のサービスは、Cloud Storage バケットから画像が削除されたときに Eventarc によってトリガーされます。このサービスは、削除された画像のメタデータとサムネイル画像を削除します。

画像アプリのアーキテクチャ

学習内容

このラボでは、次の方法について学びます。

  • Eventarc を使用してサービスとワークフローを非同期的にトリガーする。
  • Workflows を使用してサービスと API をオーケストレートする。
  • Cloud Tasks を使用して分散タスクキューを管理する。
  • Cloud Scheduler を使用して、スケジュールに従ってサービスを実行する。

設定と要件

各ラボでは、新しい Google Cloud プロジェクトとリソースセットを一定時間無料で利用できます。

  1. [ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。 左側の [ラボの詳細] パネルには、以下が表示されます。

    • [Google Cloud コンソールを開く] ボタン
    • 残り時間
    • このラボで使用する必要がある一時的な認証情報
    • このラボを行うために必要なその他の情報(ある場合)
  2. [Google Cloud コンソールを開く] をクリックします(Chrome ブラウザを使用している場合は、右クリックして [シークレット ウィンドウで開く] を選択します)。

    ラボでリソースが起動し、別のタブで [ログイン] ページが表示されます。

    ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。

    注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。
  3. 必要に応じて、下のユーザー名をコピーして、[ログイン] ダイアログに貼り付けます。

    {{{user_0.username | "Username"}}}

    [ラボの詳細] パネルでもユーザー名を確認できます。

  4. [次へ] をクリックします。

  5. 以下のパスワードをコピーして、[ようこそ] ダイアログに貼り付けます。

    {{{user_0.password | "Password"}}}

    [ラボの詳細] パネルでもパスワードを確認できます。

  6. [次へ] をクリックします。

    重要: ラボで提供された認証情報を使用する必要があります。Google Cloud アカウントの認証情報は使用しないでください。 注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
  7. その後次のように進みます。

    • 利用規約に同意してください。
    • 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
    • 無料トライアルには登録しないでください。

その後、このタブで Google Cloud コンソールが開きます。

注: Google Cloud のプロダクトやサービスのリストを含むメニューを表示するには、左上のナビゲーション メニューをクリックするか、[検索] フィールドにサービス名またはプロダクト名を入力します。ナビゲーション メニュー アイコン

Google Cloud Shell の有効化

Google Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。

Google Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。

  1. Google Cloud コンソールで、右上のツールバーにある [Cloud Shell をアクティブにする] ボタンをクリックします。

    ハイライト表示された Cloud Shell アイコン

  2. [続行] をクリックします。

環境がプロビジョニングされ、接続されるまでしばらく待ちます。接続した時点で認証が完了しており、プロジェクトに各自のプロジェクト ID が設定されます。次に例を示します。

Cloud Shell ターミナルでハイライト表示されたプロジェクト ID

gcloud は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。

  • 次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
gcloud auth list

出力:

Credentialed accounts: - @.com (active)

出力例:

Credentialed accounts: - google1623327_student@qwiklabs.net
  • 次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
gcloud config list project

出力:

[core] project =

出力例:

[core] project = qwiklabs-gcp-44776a13dea667a6 注: gcloud ドキュメントの全文については、 gcloud CLI の概要ガイド をご覧ください。

タスク 1. API を有効にして Cloud Storage バケットを作成する

このタスクでは、必要な API を有効にします。また、Cloud Storage に 2 つのバケットを作成します。一つは画像をアップロードするためのバケットで、もう一つはアプリケーションで生成された画像を保存するためのバケットです。

API を有効にする

  1. 次のコマンドを実行して、必要な API を有効にします。

    gcloud services enable \ workflows.googleapis.com \ workflowexecutions.googleapis.com \ eventarc.googleapis.com \ tasks.googleapis.com \ cloudscheduler.googleapis.com \ storage.googleapis.com \ vision.googleapis.com \ run.googleapis.com \ cloudfunctions.googleapis.com \ firestore.googleapis.com \ appengine.googleapis.com \ cloudbuild.googleapis.com \ artifactregistry.googleapis.com

    このアプリケーションでは複数の Google Cloud サービスを使用するため、これらのサービスの API をそれぞれ有効にする必要があります。

    有効にする API:

    • Workflows API: ワークフローの定義を管理します。新しい画像がアップロードされると、ワークフローによってメインプロセスが実行されます。
    • Workflows Executions API: ワークフローの実行を管理します。
    • Eventarc API: Eventarc の構成を管理します。Eventarc を使用して、Cloud Storage バケットに追加された画像と Cloud Storage バケットから削除された画像が検出されます。
    • Cloud Tasks API: 分散タスクを作成して管理します。ワークフローによってタスクが作成され、それによってサムネイルが作成されます。
    • Cloud Scheduler API: スケジュールされた cron ジョブを作成して管理します。スケジュールされたジョブを使用して最新画像のコラージュが作成されます。
    • Cloud Storage API: Cloud Storage のバケットとオブジェクトを作成、管理します。
    • Cloud Vision API: Google の ML ビジョン機能にアクセスできるようにします。
    • Cloud Run API: Cloud Run サービスを作成して管理します。サムネイルの作成、画像の削除、コラージュの作成を行う Cloud Run サービスが提供されます。
    • Cloud Functions API: 関数を作成して管理します。関数を使用して Cloud Vision のレスポンスから情報が抽出されます。
    • Firestore API: Firestore データベースを作成して管理します。
    • App Engine API: App Engine アプリケーションを作成して管理します。Firestore を有効にするには、App Engine API が必要です。
    • Cloud Build API: アプリケーション ビルドを管理します。
    • Artifact Registry API: ビルド アーティファクトとレジストリを管理します。

Cloud Storage バケットを作成する

  1. Cloud Shell で、画像をアップロードする Cloud Storage バケットを作成します。

    export UPLOAD_BUCKET=uploaded-images-${GOOGLE_CLOUD_PROJECT} gcloud storage buckets create \ --location={{{project_0.default_region|set at lab start}}} gs://${UPLOAD_BUCKET} gcloud storage buckets update \ gs://${UPLOAD_BUCKET} --uniform-bucket-level-access gcloud storage buckets add-iam-policy-binding \ gs://${UPLOAD_BUCKET} \ --member=allUsers --role=roles/storage.objectViewer

    上記のコマンドによって、均一なアクセスが有効な公開リージョン バケットが作成されます。画像がバケットにコピーされるたびにワークフローが開始され、写真の分析とメタデータおよびサムネイル画像の保存が行われます。

  2. 画像アプリケーションで生成された画像を格納する、2 つ目の Cloud Storage バケットを作成します。

    export GENERATED_BUCKET=generated-images-${GOOGLE_CLOUD_PROJECT} gcloud storage buckets create \ --location={{{project_0.default_region|set at lab start}}} gs://${GENERATED_BUCKET} gcloud storage buckets update \ gs://${GENERATED_BUCKET} --uniform-bucket-level-access gcloud storage buckets add-iam-policy-binding \ gs://${GENERATED_BUCKET} \ --member=allUsers --role=roles/storage.objectViewer
  3. Google Cloud コンソールのナビゲーション メニューナビゲーション メニュー)で、[Cloud Storage] > [バケット] に移動します。

    作成した 2 つのバケットが表示されます。

    [進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 Cloud Storage バケットを作成する

タスク 2. Firestore データベースを作成する

このタスクでは、画像のメタデータを保存する Firestore データベースを作成します。

データベースを作成する

  1. Cloud Shell で次のコマンドを実行して、Firestore データベースを作成します。

    export FIRESTORE_LOCATION={{{project_0.default_region|set at lab start}}} gcloud firestore databases create \ --location=${FIRESTORE_LOCATION} \ --type=firestore-native

    画像のメタデータの保存には、images という Firestore コレクションが使用されます。コラージュ サービスは、このデータベースを検索してサムネイル付きの最新画像を見つけ、コラージュを作成します。

    データベースが作成されたら、この検索をサポートするインデックスを作成する必要があります。

Firestore の複合インデックスを作成する

Firestore の複合インデックスは、1 つのクエリで複数のフィールドを参照する必要がある場合に使用します。

  1. 次のコマンドを実行して、複合インデックスを作成します。

    gcloud firestore indexes composite create \ --collection-group=images \ --field-config field-path=thumbnail,order=descending \ --field-config field-path=created,order=descending \ --async

    このインデックスを使用することで、コラージュ サービスはサムネイルがある最新画像を検出できるようになります。

    --async パラメータは、オペレーションの完了を待機しないことを示します。

  2. Google Cloud コンソールのタイトルバーで、[検索] フィールドに「Firestore」と入力して [検索] をクリックし、検索結果で [Firestore] をクリックします。

  3. データベース ID (default) をクリックし、左側のペインで [インデックス] をクリックします。

    先ほど作成した、images コレクションのインデックスが表示されます。

    注: 検索インデックスの作成には数分かかることがあるため、作成が終わる前にラボを進めてもかまいません。

    [進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 Firestore のデータベースと複合インデックスを作成する

タスク 3. サムネイル用のタスクキューを作成する

このタスクでは、サムネイル作成サービスによるサムネイルの作成をリクエストする Cloud Tasks キューを作成します。

  1. Cloud Shell に次のコマンドを入力して、タスクキューを作成します。

    export QUEUE_REGION={{{project_0.default_region|set at lab start}}} gcloud tasks queues create thumbnail-task-queue \ --location=${QUEUE_REGION}
  2. Google Cloud コンソールのタイトルバーで、[検索] フィールドに「Cloud Tasks」と入力して [検索] をクリックし、検索結果で [Cloud Tasks] をクリックします。

    作成した thumbnail-task-queue キューが表示されます。

    [進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 Cloud Tasks キューを作成する

タスク 4. Cloud Run サービスをデプロイする

このタスクでは、画像アプリケーションで使用される Cloud Run サービスをビルドしてデプロイします。

ソースコード リポジトリのクローンを作成する

  1. Cloud Shell で Git リポジトリのクローンを作成します。

    git clone --depth=1 https://github.com/GoogleCloudPlatform/training-data-analyst
  2. このラボのルート ディレクトリへのソフトリンク ショートカットを作成します。

    ln -s ~/training-data-analyst/courses/orchestration-and-choreography/lab1 ~/code

Artifact Registry にリポジトリを作成する

Artifact Registry は次世代の Container Registry です。ビルド アーティファクトを Artifact Registry リポジトリ内に保存できます。

  1. Cloud Shell で次のコマンドを実行して、Docker イメージ用の Artifact Registry リポジトリを作成します。

    export REPO_NAME=image-app-repo export REPO_REGION={{{project_0.default_region|set at lab start}}} gcloud artifacts repositories create ${REPO_NAME} \ --location=${REPO_REGION} --repository-format=docker

サムネイル作成サービスをビルドしてデプロイする

サムネイル サービスは、アップロードされた画像のサムネイルを作成し、generated-images バケットに保存します。

  1. Cloud Shell で [エディタを開く] をクリックします。

  2. Cloud Shell エディタで ~/code/cloud-run/create-thumbnail に移動し、create-thumbnail サービスのファイルを調べます。

    このディレクトリには、次の 3 つのファイルがあります。

    • package.json: Node.js アプリケーションのビルドに関連するメタデータが含まれています。このファイルでアプリケーションを起動するコマンド(node index.js)を定義し、コードで使用されるパッケージのバージョンを指定します。
    • Dockerfile: このファイルで開始イメージ(node:16-slim)を指定します。開始イメージには、サービスをホストするコンテナ イメージをビルドするために実行されるコマンドのリストが格納されています。インストールには、アップロードされた画像からサムネイル画像を作成するために使用される Imagemagick のインストールが含まれます。
    • index.js: サービスのコードが格納されています。
  3. [ターミナルを開く] をクリックします。

  4. Cloud Shell で次のコマンドを実行し、Cloud Build を使用して create-thumbnail サービスの Docker イメージをビルドします。

    export REPO_NAME=image-app-repo export REPO_REGION={{{project_0.default_region|set at lab start}}} export THUMBNAIL_SERVICE_NAME=create-thumbnail cd ~/code/cloud-run/create-thumbnail gcloud builds submit \ . \ --tag ${REPO_REGION}-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/${REPO_NAME}/${THUMBNAIL_SERVICE_NAME}

    サービスがビルドされ、Artifact Registry リポジトリに保存されます。

  5. Cloud Shell で次のコマンドを実行し、Cloud Run を使用してサービスをデプロイします。

    export REPO_NAME=image-app-repo export REPO_REGION={{{project_0.default_region|set at lab start}}} export THUMBNAIL_SERVICE_REGION={{{project_0.default_region|set at lab start}}} export THUMBNAIL_SERVICE_NAME=create-thumbnail export GENERATED_IMAGES_BUCKET=generated-images-${GOOGLE_CLOUD_PROJECT} cd ~/code/cloud-run/create-thumbnail gcloud config set run/region ${THUMBNAIL_SERVICE_REGION} gcloud config set run/platform managed gcloud run deploy ${THUMBNAIL_SERVICE_NAME} \ --image ${REPO_REGION}-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/${REPO_NAME}/${THUMBNAIL_SERVICE_NAME} \ --no-allow-unauthenticated \ --memory=1Gi \ --max-instances=1 \ --update-env-vars GENERATED_IMAGES_BUCKET=${GENERATED_IMAGES_BUCKET}

    generated-images バケット名が、環境変数を使用してアプリケーションに渡されます。

コラージュ サービスをビルドしてデプロイする

コラージュ サービスは、最近アップロードされた画像をコラージュにまとめて、そのコラージュを generated-images バケットに保存します。

  1. Cloud Shell で [エディタを開く] をクリックします。

  2. Cloud Shell エディタで ~/code/cloud-run/create-collage に移動し、create-collage サービスのファイルを調べます。

    このディレクトリには、package.jsonindex.jsDockerfile の 3 つのファイルがあります。

  3. [ターミナルを開く] をクリックします。

  4. Cloud Shell で次のコマンドを実行し、create-collage サービスの Docker イメージをビルドしてデプロイします。

    export REPO_NAME=image-app-repo export REPO_REGION={{{project_0.default_region|set at lab start}}} export COLLAGE_SERVICE_REGION={{{project_0.default_region|set at lab start}}} export COLLAGE_SERVICE_NAME=create-collage export GENERATED_IMAGES_BUCKET=generated-images-${GOOGLE_CLOUD_PROJECT} cd ~/code/cloud-run/create-collage gcloud builds submit \ . \ --tag ${REPO_REGION}-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/${REPO_NAME}/${COLLAGE_SERVICE_NAME} gcloud config set run/region ${COLLAGE_SERVICE_REGION} gcloud config set run/platform managed gcloud run deploy ${COLLAGE_SERVICE_NAME} \ --image ${REPO_REGION}-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/${REPO_NAME}/${COLLAGE_SERVICE_NAME} \ --no-allow-unauthenticated \ --memory=1Gi \ --max-instances=1 \ --update-env-vars GENERATED_IMAGES_BUCKET=${GENERATED_IMAGES_BUCKET}

画像削除サービスをビルドしてデプロイする

画像削除サービスは、generated-images バケットからサムネイル画像を削除し、データベースから画像のメタデータを削除します。

  1. Cloud Shell で [エディタを開く] をクリックします。

  2. Cloud Shell エディタで ~/code/cloud-run/delete-image に移動し、delete-image サービスのファイルを調べます。

    このディレクトリには、package.jsonindex.js の 2 つのファイルのみが格納されています。Dockerfile はありません。

    このラボでは、コンテナを手動でビルドして公開するのではなく、Google Cloud Buildpacks を使用して自動的にビルドします。

    なお、このサービスはリクエストを CloudEvent として解析します。Eventarc が標準の CloudEvent 形式でイベントを送信します。

  3. [ターミナルを開く] をクリックします。

  4. Cloud Shell で次のコマンドを実行し、Google Cloud Buildpacks を使用して delete-image サービスをビルドし、Cloud Run にデプロイします。

    export DELETE_SERVICE_REGION={{{project_0.default_region|set at lab start}}} export DELETE_SERVICE_NAME=delete-image export GENERATED_IMAGES_BUCKET=generated-images-${GOOGLE_CLOUD_PROJECT} cd ~/code/cloud-run/delete-image npm install gcloud config set run/region ${DELETE_SERVICE_REGION} gcloud config set run/platform managed gcloud run deploy ${DELETE_SERVICE_NAME} \ --source . \ --no-allow-unauthenticated \ --max-instances=1 \ --update-env-vars GENERATED_IMAGES_BUCKET=${GENERATED_IMAGES_BUCKET}

    gcloud run deploy により、Google Cloud Buildpacks で作成されるイメージ用に Artifact Registry Docker リポジトリを作成する必要があるという警告が表示されます。

  5. 続行を確認するメッセージが表示されたら、「Y」と入力します。

アーティファクトのリポジトリと Cloud Run サービスを調べる

  1. Google Cloud コンソールのタイトルバーで、[検索] フィールドに「Artifact Registry」と入力して [検索] をクリックし、検索結果で [Artifact Registry] をクリックします。

    作成したリポジトリ(image-app-repo)と Google Cloud Buildpacks で作成されたリポジトリ(cloud-run-source-deploy)が Artifact Registry に表示されます。

  2. [image-app-repo] をクリックします。

    image-app-repo には、create-collage サービスと create-thumbnail サービス用に先ほどビルドした Docker イメージが格納されています。

  3. [Artifact Registry] > [リポジトリ] に戻り、[cloud-run-source-deploy] をクリックします。

    このリポジトリには、Google Cloud Buildpacks で自動的に作成された、delete-image の Docker イメージが格納されています。

  4. Google Cloud コンソールのナビゲーション メニューナビゲーション メニュー)で、[Cloud Run] > [サービス] に移動します。

    3 つのサービスがすべてデプロイされています。

    [進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 リポジトリを作成して Cloud Run サービスをデプロイする

タスク 5. Cloud Vision のレスポンスを解析する関数を作成する

このタスクでは、Cloud Vision API によって返される画像データを解析する Cloud Run functions の関数を作成します。

  1. Cloud Shell で [エディタを開く] をクリックします。

  2. Cloud エディタで ~/code/cloud-functions/extract-image-metadata に移動し、extract-image-metadata 関数のファイルを調べます。

    Node.js サービスには、index.js ファイルと package.json ファイルが含まれています。Cloud Run functions は自動的に Buildpack を使用してコンテナを作成するため、Dockerfile は必要ありません。

  3. [ターミナルを開く] をクリックします。

  4. Cloud Shell で次のコマンドを実行して、関数をデプロイします。

    export EXTRACT_FUNCTION_REGION={{{project_0.default_region|set at lab start}}} export EXTRACT_FUNCTION_NAME=extract-image-metadata cd ~/code/cloud-functions/${EXTRACT_FUNCTION_NAME} gcloud config set functions/region ${EXTRACT_FUNCTION_REGION} gcloud functions deploy ${EXTRACT_FUNCTION_NAME} \ --gen2 \ --source . \ --runtime=nodejs20 \ --entry-point=extract_image_metadata \ --trigger-http \ --no-allow-unauthenticated 注: デプロイでリポジトリのメタデータを取得できなかった場合は、関数のデプロイが成功するまで数回試行してください
  5. Google Cloud コンソールのタイトルバーで、[検索] フィールドに「Cloud Run functions」と入力して [検索] をクリックし、検索結果で [Cloud Run functions] をクリックします。

    extract-image-metadata 関数がデプロイされています。

    [進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 Cloud Vision のレスポンスを解析する関数を作成する

タスク 6. ワークフローを作成する

このタスクでは、サービスと API 呼び出しをオーケストレートするワークフローを作成します。

  1. Cloud Shell で [エディタを開く] をクリックします。

  2. Cloud Shell エディタで ~/code/workflows に移動し、image-add-workflow.yaml という YAML ファイルを調べます。

    このワークフローでは、ワークフローが開始されたときに実行する一連のステップを指定します。ログに記録されないステップは以下のとおりです。

    • init: ワークフローで使用される変数を代入します。bucketfilename には、ワークフローの呼び出し時に Eventarc から渡される値が入力されます。projectId は、ワークフロー用に自動的に入力される環境変数からプロジェクト ID 値を取得します。
    • imageAnalysisCall: アップロードされた画像を分析するために Cloud Vision API を呼び出します。
    • extractImageMetadata: Cloud Vision API 呼び出しのレスポンスから重要な情報を抽出するために、Cloud Run functions の関数を呼び出します。
    • checkSafety: Cloud Vision API が画像が安全でないと判断した場合にワークフローを終了します。
    • storeMetadata: 画像のメタデータを保存するために Firestore API を呼び出します。
    • getThumbnailService: Cloud Run の create-thumbnail サービスの URL を取得するために、Cloud Run コネクタを呼び出します。
    • queueThumbnail: Cloud Tasks コネクタを使用してタスクを作成し、サムネイル サービスを非同期的に呼び出します。
    • completed: ワークフローを終了し、ワークフロー実行の識別子を返します。
  3. [ターミナルを開く] をクリックします。

  4. 次のコマンドを実行し、ワークフロー ID 用のサービス アカウントを作成して基本的な権限を追加します。

    export WORKFLOWS_SA=workflows-sa gcloud iam service-accounts create ${WORKFLOWS_SA} gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member="serviceAccount:${WORKFLOWS_SA}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/datastore.user" gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member="serviceAccount:${WORKFLOWS_SA}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/cloudtasks.enqueuer" gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member="serviceAccount:${WORKFLOWS_SA}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/logging.logWriter" gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member="serviceAccount:${WORKFLOWS_SA}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/iam.serviceAccountUser"

    以下のロールによって次の機能が許可されます。

    • roles/datastore.user: ワークフローで Firestore にドキュメントを書き込むことができます。
    • roles/cloudtasks.enqueuer: ワークフローで Cloud Tasks のタスクを作成できます。
    • roles/logging.logWriter: ワークフローで Cloud Logging に変数を記録できます。
    • roles/iam.serviceAccountUser: サービス アカウントが別のサービス アカウントの権限を借用できます。そのため、Cloud Tasks はワークフローのサービス アカウント ID を使用してリクエストを送信できます。
  5. 次のコマンドを実行して、関数と Cloud Run サービスの呼び出し権限を追加します。

    export WORKFLOWS_SA=workflows-sa export THUMBNAIL_SERVICE_NAME=create-thumbnail export THUMBNAIL_SERVICE_REGION={{{project_0.default_region|set at lab start}}} export EXTRACT_FUNCTION_NAME=extract-image-metadata gcloud functions add-iam-policy-binding ${EXTRACT_FUNCTION_NAME} \ --member="serviceAccount:${WORKFLOWS_SA}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/cloudfunctions.invoker" gcloud run services add-iam-policy-binding ${THUMBNAIL_SERVICE_NAME} \ --region=${THUMBNAIL_SERVICE_REGION} \ --member="serviceAccount:${WORKFLOWS_SA}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/run.viewer" gcloud run services add-iam-policy-binding ${THUMBNAIL_SERVICE_NAME} \ --region=${THUMBNAIL_SERVICE_REGION} \ --member="serviceAccount:${WORKFLOWS_SA}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/run.invoker"

    「Would you like to run this command and additionally grant permission to invoke function [extract-image-metadata] (Y/n)?」と尋ねられたら、「Y」と入力します。

    以下の追加ロールによって次の機能が許可されます。

    • roles/cloudfunctions.invoker: ワークフローで、Cloud Vision のレスポンスからメタデータを抽出する関数を呼び出すことができます。
    • roles/run.viewer: ワークフローでサムネイル サービスの詳細をクエリできます。
    • roles/run.invoker: ワークフローのサービス アカウントからサムネイル サービスを呼び出すことができます。サービスの呼び出し時に、Cloud Tasks によってサービス アカウントが使用されます。
  6. 次のコマンドを実行して、ワークフローをデプロイします。

    export WORKFLOW_NAME=image-add-workflow export WORKFLOW_REGION={{{project_0.default_region|set at lab start}}} export WORKFLOWS_SA=workflows-sa cd ~/code/workflows gcloud workflows deploy ${WORKFLOW_NAME} \ --source=${WORKFLOW_NAME}.yaml \ --location=${WORKFLOW_REGION} \ --service-account="${WORKFLOWS_SA}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" 注: Workflows サービス エージェントが存在しないためにコマンドが失敗した場合は、ワークフローを再デプロイしてください。
  7. Google Cloud コンソールのタイトルバーで、[検索] フィールドに「Workflows」と入力して [検索] をクリックし、検索結果で [ワークフロー] をクリックします。

  8. [ワークフロー] の横にある固定アイコンをクリックします。

  9. [image-add-workflow] をクリックし、[ソース] タブをクリックします。

    左側のペインにワークフローのコードが表示され、右側のペインにワークフローのステップのビジュアル フローが表示されます。

    [進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 ワークフローを作成する

タスク 7. ワークフローを開始する Eventarc トリガーを作成する

このタスクでは、uploaded-images バケットにファイルが追加されたときにワークフローを実行する Eventarc トリガーを作成します。

  1. Cloud Shell で次のコマンドを実行し、ワークフロー トリガー用のサービス アカウントを作成して必要な権限を付与します。

    export WORKFLOW_TRIGGER_SA=workflow-trigger-sa gcloud iam service-accounts create ${WORKFLOW_TRIGGER_SA} gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member="serviceAccount:${WORKFLOW_TRIGGER_SA}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/workflows.invoker" gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member "serviceAccount:${WORKFLOW_TRIGGER_SA}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/eventarc.eventReceiver"

    上記のコマンドでは、workflow-trigger-sa というサービス アカウントを作成し、イベントを受信してワークフローを呼び出すためのロールを追加します。

  2. 次のコマンドを実行して、Cloud Storage サービス アカウントにイベントの作成権限を付与します。

    export CLOUD_STORAGE_SA="$(gcloud storage service-agent)" gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member="serviceAccount:${CLOUD_STORAGE_SA}" \ --role="roles/pubsub.publisher"

    上記のコマンドでは、Cloud Storage サービス アカウントを取得し、Pub/Sub イベントをパブリッシュする権限を追加します。

  3. 次のコマンドを実行してトリガーを作成します。

    export WORKFLOW_TRIGGER_REGION={{{project_0.default_region|set at lab start}}} export WORKFLOW_NAME=image-add-workflow export WORKFLOW_REGION={{{project_0.default_region|set at lab start}}} export UPLOAD_BUCKET=uploaded-images-${GOOGLE_CLOUD_PROJECT} export WORKFLOW_TRIGGER_SA=workflow-trigger-sa gcloud eventarc triggers create image-add-trigger \ --location=${WORKFLOW_TRIGGER_REGION} \ --destination-workflow=${WORKFLOW_NAME} \ --destination-workflow-location=${WORKFLOW_REGION} \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=${UPLOAD_BUCKET}" \ --service-account="${WORKFLOW_TRIGGER_SA}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com"

    このトリガーは、uploaded-images バケットにファイルが書き込まれるたびにワークフローを呼び出します。

    注: トリガーの作成時に権限の伝播エラーが表示された場合は、権限が Eventarc にまだ伝播されていない可能性があります。トリガーの作成を 1~2 回再試行するとエラーは解消されます。

    [進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 ワークフローを開始する Eventarc トリガーを作成する

タスク 8. 画像追加ワークフローをテストする

このタスクでは、uploaded-images バケットに画像が追加されたときに実行されるステップをテストします。

  1. 次のコマンドを実行して、画像を uploaded-images バケットにアップロードします。

    export UPLOAD_BUCKET=uploaded-images-${GOOGLE_CLOUD_PROJECT} export IMAGE_NAME=neon.jpg gcloud storage cp ~/code/images/${IMAGE_NAME} gs://${UPLOAD_BUCKET}

    アップロードが完了すると、Eventarc がそのアップロードを検出してワークフローを開始します。

  2. Google Cloud コンソールのナビゲーション メニューナビゲーション メニュー)で、[ワークフロー] > [ワークフロー] に移動します。

  3. [image-add-workflow] をクリックし、[実行] タブをクリックします。

    ワークフローが実行されたことがすぐに表示されます。

    注: 実行が開始されるまで 1~2 分かかることがあります。
  4. 実行 ID をクリックして、[実行の詳細] ページを開きます。

    このページには、ワークフローの実行に関する詳細が表示されます。

    [入力] ペインには、Eventarc トリガーによって送信された Cloud Storage イベントの内容が表示されます。

    [出力] ペインには、ワークフローの最後に返された値が表示されます。

    [ログ] ペインには、ワークフローによって作成されたログエントリが表示されます。

  5. Google Cloud コンソールのタイトルバーで、[検索] フィールドに「Cloud Run functions」と入力して [検索] をクリックし、検索結果で [Cloud Run functions] をクリックします。

  6. [extract-image-metadata] をクリックします。

    このダッシュボードには、Cloud Vision のレスポンスから情報を抽出するために使用された関数の詳細が表示されます。

  7. [ログ] タブをクリックします。

    ログに記録された関数実行のデータが表示されます。画像のラベルとテキストがログに記録されています。

  8. Google Cloud コンソールのタイトルバーで、[検索] フィールドに「Firestore」と入力して [検索] をクリックし、検索結果で [Firestore] をクリックします。

  9. [(default)] をクリックします。

    images コレクションに、ワークフローによって書き込まれた neon.jpg というドキュメントが表示されます。画像に付与されたラベルと、画像内に見つかったテキストが表示されます。

  10. Google Cloud コンソールのナビゲーション メニューナビゲーション メニュー)で、[Cloud Run] > [サービス] に移動し、[create-thumbnail] をクリックします。

    このダッシュボードには、create-thumbnail サービスに関する情報が表示されます。

  11. [ログ] タブをクリックします。

    ログに記録されたサービス実行のデータが表示されます。

  12. Cloud Shell で、次のコマンドを実行します。

    export UPLOAD_BUCKET=uploaded-images-${GOOGLE_CLOUD_PROJECT} export GENERATED_BUCKET=generated-images-${GOOGLE_CLOUD_PROJECT} export IMAGE_NAME=neon.jpg echo "uploaded image: https://storage.googleapis.com/${UPLOAD_BUCKET}/${IMAGE_NAME}" echo "generated image: https://storage.googleapis.com/${GENERATED_BUCKET}/${IMAGE_NAME}" echo "Listing of generated-images bucket:" gcloud storage ls gs://${GENERATED_BUCKET}

    generated-images バケットには、create-thumbnail サービスによって作成されたサムネイルが含まれています。Cloud Shell 内のリンクをクリックすると、新しいタブが開き、アップロードされた画像と生成された画像が表示されます。

    注: 生成された画像がバケットとリストに表示されるまで、少し時間がかかることがあります。

    [進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 画像追加ワークフローをテストする

タスク 9. スケジュールされたジョブを追加してコラージュを作成する

このタスクでは、最近アップロードされた写真のコラージュを定期的に作成する Cloud Scheduler ジョブを作成します。

画像をアップロードする

  1. 次のコマンドを実行して、uploaded-images バケットにさらに画像をアップロードします。

    export UPLOAD_BUCKET=uploaded-images-${GOOGLE_CLOUD_PROJECT} gcloud storage cp ~/code/images/alley.jpg \ gs://${UPLOAD_BUCKET} gcloud storage cp ~/code/images/desktop.jpg \ gs://${UPLOAD_BUCKET} gcloud storage cp ~/code/images/rainbow.jpg \ gs://${UPLOAD_BUCKET} gcloud storage cp ~/code/images/vegas.jpg \ gs://${UPLOAD_BUCKET}

    画像ごとにワークフローが実行され、各画像のサムネイルが作成されます。

  2. 次のコマンドを実行して、create-collage サービスを呼び出すためのサービス アカウントを作成します。

    export COLLAGE_SCHED_SA=collage-schedule-sa export COLLAGE_SERVICE=create-collage export COLLAGE_SERVICE_REGION={{{project_0.default_region|set at lab start}}} gcloud iam service-accounts create ${COLLAGE_SCHED_SA} gcloud run services add-iam-policy-binding ${COLLAGE_SERVICE} \ --region=${COLLAGE_SERVICE_REGION} \ --member="serviceAccount:${COLLAGE_SCHED_SA}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/run.invoker"
  3. Cloud Shell で次のコマンドを実行して、create-collage サービスのサービス URL を取得します。

    export SERVICE_REGION={{{project_0.default_region|set at lab start}}} export SERVICE_NAME=create-collage gcloud run services describe ${SERVICE_NAME} \ --platform managed \ --region ${SERVICE_REGION} \ --format 'value(status.url)'

    取得した URL をクリップボードにコピーします。この URL はスケジュールされたジョブの作成時に必要になります。

  4. Google Cloud コンソールのタイトルバーで、[検索] フィールドに「Cloud Scheduler」と入力して [検索] をクリックし、検索結果で [Cloud Scheduler] をクリックします。

  5. [+ ジョブを作成] をクリックします。

  6. スケジュール設定を次のように指定します。

    プロパティ
    名前 collage-schedule
    リージョン [] を選択
    頻度 * * * * *
    タイムゾーン UTC」を検索し、[協定世界時(UTC)] を選択

    頻度には、unix-cron 形式でスケジュールを指定します。「* * * * *」は、1 分ごとにジョブを実行することを示します。

    テストを簡単にするために、ここでは 1 分ごとの頻度を選択します。
  7. [続行] をクリックし、[ターゲット タイプ] で [HTTP] を選択します。

  8. 実行設定を次のように指定します。

    プロパティ
    URL create-collage サービスの URL を貼り付ける
    HTTP メソッド [POST] を選択
    Auth ヘッダー [OIDC トークンを追加] を選択
    サービス アカウント [collage-schedule-sa] を選択
    対象 create-collage サービスの URL を貼り付ける
  9. [続行] をクリックしてから [作成] をクリックします。

    collage-schedule ジョブが Cloud Scheduler の [ジョブ] ページに表示されます。

    ジョブは 1 分以内に実行されるはずです。

  10. 成功を示すチェックマークが collage-schedule ジョブに表示されるまで、[更新] をクリックします。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 スケジュールされたジョブを追加してコラージュを作成する

  1. Cloud Shell で、次のコマンドを実行します。

    export GENERATED_BUCKET=generated-images-${GOOGLE_CLOUD_PROJECT} export IMAGE_NAME=collage.png echo "generated collage: https://storage.googleapis.com/${GENERATED_BUCKET}/${IMAGE_NAME}" echo "Listing of generated-images bucket:" gcloud storage ls gs://${GENERATED_BUCKET}

    これで、generated-images バケットに collage.png ファイルが追加されました。Cloud Shell 内の「generated collage」リンクをクリックすると、新しいタブが開き、コラージュが表示されます。

    Cloud Storage にコピーされたファイルは、ファイルのアップロード プロセスが完了するとすぐに利用可能になるため、リンクはスケジュールされたジョブの完了後すぐに機能するはずです。バケットの内容を一覧表示しても、少し時間が経過するまでファイルが表示されないことがあります。

タスク 10. 画像ファイルとメタデータを削除するサービスをトリガーする

このタスクでは、uploaded-images バケットから画像が削除されたときに、関連するサムネイル画像と Firestore ドキュメントを削除する Eventarc トリガーを作成します。

サービス アカウントを作成してロールを管理する

  1. Cloud Shell で次のコマンドを実行し、delete-image トリガー用のサービス アカウントを作成して必要な権限を付与します。

    export DELETE_TRIGGER_SA=delete-image-trigger-sa export DELETE_SERVICE_REGION={{{project_0.default_region|set at lab start}}} export DELETE_SERVICE=delete-image gcloud iam service-accounts create ${DELETE_TRIGGER_SA} gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member "serviceAccount:${DELETE_TRIGGER_SA}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/eventarc.eventReceiver" gcloud run services add-iam-policy-binding ${DELETE_SERVICE} \ --region=${DELETE_SERVICE_REGION} \ --member="serviceAccount:${DELETE_TRIGGER_SA}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/run.invoker"

    上記のコマンドでは、delete-image-trigger-sa というサービス アカウントを作成し、イベントを受信して delete-image サービスを呼び出すための権限を追加します。

  2. Google Cloud コンソールのナビゲーション メニューナビゲーション メニュー)で [Cloud Run] に移動し、[delete-image] をクリックします。

  3. [サービスの詳細] ページで、[トリガー] タブをクリックします。

  4. [+ トリガーを追加] をクリックし、[Cloud Storage トリガー] を選択します。

  5. トリガー設定を次のように指定します。

    プロパティ
    トリガーの名前 image-delete-trigger
    イベント タイプ [google.cloud.storage.object.v1.deleted] を選択
    バケット [参照] をクリックし、uploaded-images バケットを選択して、[選択] をクリック
    サービス アカウント delete-image-trigger-sa サービス アカウントを選択
    サービス URL パス /
  6. Pub/Sub にロールを付与する必要があるというメッセージが表示されたら、[付与] をクリックします。

  7. [トリガーを保存] をクリックします。

    このトリガーは、uploaded-images バケットからファイルが削除されるたびに delete-image サービスを呼び出します。

    注: リージョンがトリガー リソースの制約に違反していることを示すエラー メッセージが表示された場合は、誤った Cloud Storage バケットを選択した可能性があります。作成プロセスをもう一度試して、uploaded-images バケットが選択されていることを確認してください。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 画像ファイルとメタデータを削除するサービスをトリガーする

画像の削除をテストする

  1. 次のコマンドを実行して、Cloud Storage バケット内の画像と Firestore 内の対応するドキュメントを一覧表示します。

    export UPLOAD_BUCKET=uploaded-images-${GOOGLE_CLOUD_PROJECT} export GENERATED_BUCKET=generated-images-${GOOGLE_CLOUD_PROJECT} export IMAGE_NAME=vegas.jpg echo "Listing of image in uploaded-images bucket:" gcloud storage ls gs://${UPLOAD_BUCKET}/${IMAGE_NAME} echo "Listing of image in generated-images bucket:" gcloud storage ls gs://${GENERATED_BUCKET}/${IMAGE_NAME} echo "Image document in Firestore:" curl -q -s -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -X GET "https://firestore.googleapis.com/v1/projects/${GOOGLE_CLOUD_PROJECT}/databases/(default)/documents/images/${IMAGE_NAME}"

    上記のコマンドによって、1 つの画像の Cloud Storage と Firestore の詳細が表示されます。次に、その画像を削除します。

  2. 次のコマンドを実行して、uploaded-images バケット内の画像を削除します。

    export UPLOAD_BUCKET=uploaded-images-${GOOGLE_CLOUD_PROJECT} export IMAGE_NAME=vegas.jpg gcloud storage rm gs://${UPLOAD_BUCKET}/${IMAGE_NAME}

    ファイルが削除されたことを Eventarc が検出し、image-delete サービスを呼び出します。これによってサムネイルと Firestore ドキュメントが削除されます。

  3. 先ほどと同じコマンドを実行して、サムネイルと Firestore ドキュメントが削除されたかどうかを確認します。

    export UPLOAD_BUCKET=uploaded-images-${GOOGLE_CLOUD_PROJECT} export GENERATED_BUCKET=generated-images-${GOOGLE_CLOUD_PROJECT} export IMAGE_NAME=vegas.jpg echo "Listing of image in uploaded-images bucket:" gcloud storage ls gs://${UPLOAD_BUCKET}/${IMAGE_NAME} echo "Listing of image in generated-images bucket:" gcloud storage ls gs://${GENERATED_BUCKET}/${IMAGE_NAME} echo "Image document in Firestore:" curl -q -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://firestore.googleapis.com/v1/projects/${GOOGLE_CLOUD_PROJECT}/databases/(default)/documents/images/${IMAGE_NAME}"

    アイテムは削除されています。

  4. Google Cloud コンソールのナビゲーション メニューナビゲーション メニュー)で、[Cloud Run] > [サービス] に移動し、[delete-image] をクリックします。

  5. [ログ] をクリックします。

    delete-image サービスのログに、サムネイルが generated-images バケットから削除され、Firestore ドキュメントがデータベースから削除されたことが示されます。

お疲れさまでした

このラボでは、Eventarc を使用してサービスとワークフローをトリガーしました。また、Workflows を使用してサービスと API をオーケストレートしました。Cloud Tasks を使用して分散タスクキューを作成し、使用しました。最後に、サービスを実行するジョブを Cloud Scheduler で作成しました。

次のステップと詳細情報

ラボを終了する

ラボが完了したら、[ラボを終了] をクリックします。ラボで使用したリソースが Google Cloud Skills Boost から削除され、アカウントの情報も消去されます。

ラボの評価を求めるダイアログが表示されたら、星の数を選択してコメントを入力し、[送信] をクリックします。

星の数は、それぞれ次の評価を表します。

  • 星 1 つ = 非常に不満
  • 星 2 つ = 不満
  • 星 3 つ = どちらともいえない
  • 星 4 つ = 満足
  • 星 5 つ = 非常に満足

フィードバックを送信しない場合は、ダイアログ ボックスを閉じてください。

フィードバックやご提案の送信、修正が必要な箇所をご報告いただく際は、[サポート] タブをご利用ください。

Copyright 2024 Google LLC All rights reserved. Google および Google のロゴは、Google LLC の商標です。その他すべての社名および製品名は、それぞれ該当する企業の商標である可能性があります。

始める前に

  1. ラボでは、Google Cloud プロジェクトとリソースを一定の時間利用します
  2. ラボには時間制限があり、一時停止機能はありません。ラボを終了した場合は、最初からやり直す必要があります。
  3. 画面左上の [ラボを開始] をクリックして開始します

シークレット ブラウジングを使用する

  1. ラボで使用するユーザー名パスワードをコピーします
  2. プライベート モードで [コンソールを開く] をクリックします

コンソールにログインする

    ラボの認証情報を使用して
  1. ログインします。他の認証情報を使用すると、エラーが発生したり、料金が発生したりする可能性があります。
  2. 利用規約に同意し、再設定用のリソースページをスキップします
  3. ラボを終了する場合や最初からやり直す場合を除き、[ラボを終了] はクリックしないでください。クリックすると、作業内容がクリアされ、プロジェクトが削除されます

このコンテンツは現在ご利用いただけません

利用可能になりましたら、メールでお知らせいたします

ありがとうございます。

利用可能になりましたら、メールでご連絡いたします

1 回に 1 つのラボ

既存のラボをすべて終了して、このラボを開始することを確認してください

シークレット ブラウジングを使用してラボを実行する

このラボの実行には、シークレット モードまたはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウントの競合を防ぎ、個人アカウントに追加料金が発生することを防ぎます。