概要
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 プロジェクトとリソースセットを一定時間無料で利用できます。
-
[ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。
左側の [ラボの詳細] パネルには、以下が表示されます。
- [Google Cloud コンソールを開く] ボタン
- 残り時間
- このラボで使用する必要がある一時的な認証情報
- このラボを行うために必要なその他の情報(ある場合)
-
[Google Cloud コンソールを開く] をクリックします(Chrome ブラウザを使用している場合は、右クリックして [シークレット ウィンドウで開く] を選択します)。
ラボでリソースが起動し、別のタブで [ログイン] ページが表示されます。
ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。
注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。
-
必要に応じて、下のユーザー名をコピーして、[ログイン] ダイアログに貼り付けます。
{{{user_0.username | "Username"}}}
[ラボの詳細] パネルでもユーザー名を確認できます。
-
[次へ] をクリックします。
-
以下のパスワードをコピーして、[ようこそ] ダイアログに貼り付けます。
{{{user_0.password | "Password"}}}
[ラボの詳細] パネルでもパスワードを確認できます。
-
[次へ] をクリックします。
重要: ラボで提供された認証情報を使用する必要があります。Google Cloud アカウントの認証情報は使用しないでください。
注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
-
その後次のように進みます。
- 利用規約に同意してください。
- 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
- 無料トライアルには登録しないでください。
その後、このタブで Google Cloud コンソールが開きます。
注: Google Cloud のプロダクトやサービスのリストを含むメニューを表示するには、左上のナビゲーション メニューをクリックするか、[検索] フィールドにサービス名またはプロダクト名を入力します。
Google Cloud Shell の有効化
Google Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。
Google Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。
-
Google Cloud コンソールで、右上のツールバーにある [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 を有効にする
-
次のコマンドを実行して、必要な 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:
Cloud Storage バケットを作成する
-
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 つ目の 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
-
Google Cloud コンソールのナビゲーション メニュー(
)で、[Cloud Storage] > [バケット] に移動します。
作成した 2 つのバケットが表示されます。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
Cloud Storage バケットを作成する
タスク 2. Firestore データベースを作成する
このタスクでは、画像のメタデータを保存する Firestore データベースを作成します。
データベースを作成する
-
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 つのクエリで複数のフィールドを参照する必要がある場合に使用します。
-
次のコマンドを実行して、複合インデックスを作成します。
gcloud firestore indexes composite create \
--collection-group=images \
--field-config field-path=thumbnail,order=descending \
--field-config field-path=created,order=descending \
--async
このインデックスを使用することで、コラージュ サービスはサムネイルがある最新画像を検出できるようになります。
--async パラメータは、オペレーションの完了を待機しないことを示します。
-
Google Cloud コンソールのタイトルバーで、[検索] フィールドに「Firestore」と入力して [検索] をクリックし、検索結果で [Firestore] をクリックします。
-
データベース ID (default)
をクリックし、左側のペインで [インデックス] をクリックします。
先ほど作成した、images コレクションのインデックスが表示されます。
注: 検索インデックスの作成には数分かかることがあるため、作成が終わる前にラボを進めてもかまいません。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
Firestore のデータベースと複合インデックスを作成する
タスク 3. サムネイル用のタスクキューを作成する
このタスクでは、サムネイル作成サービスによるサムネイルの作成をリクエストする Cloud Tasks キューを作成します。
-
Cloud Shell に次のコマンドを入力して、タスクキューを作成します。
export QUEUE_REGION={{{project_0.default_region|set at lab start}}}
gcloud tasks queues create thumbnail-task-queue \
--location=${QUEUE_REGION}
-
Google Cloud コンソールのタイトルバーで、[検索] フィールドに「Cloud Tasks」と入力して [検索] をクリックし、検索結果で [Cloud Tasks] をクリックします。
作成した thumbnail-task-queue キューが表示されます。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
Cloud Tasks キューを作成する
タスク 4. Cloud Run サービスをデプロイする
このタスクでは、画像アプリケーションで使用される Cloud Run サービスをビルドしてデプロイします。
ソースコード リポジトリのクローンを作成する
-
Cloud Shell で Git リポジトリのクローンを作成します。
git clone --depth=1 https://github.com/GoogleCloudPlatform/training-data-analyst
-
このラボのルート ディレクトリへのソフトリンク ショートカットを作成します。
ln -s ~/training-data-analyst/courses/orchestration-and-choreography/lab1 ~/code
Artifact Registry にリポジトリを作成する
Artifact Registry は次世代の Container Registry です。ビルド アーティファクトを Artifact Registry リポジトリ内に保存できます。
-
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 バケットに保存します。
-
Cloud Shell で [エディタを開く] をクリックします。
-
Cloud Shell エディタで ~/code/cloud-run/create-thumbnail
に移動し、create-thumbnail サービスのファイルを調べます。
このディレクトリには、次の 3 つのファイルがあります。
-
package.json: Node.js アプリケーションのビルドに関連するメタデータが含まれています。このファイルでアプリケーションを起動するコマンド(node index.js)を定義し、コードで使用されるパッケージのバージョンを指定します。
-
Dockerfile: このファイルで開始イメージ(node:16-slim)を指定します。開始イメージには、サービスをホストするコンテナ イメージをビルドするために実行されるコマンドのリストが格納されています。インストールには、アップロードされた画像からサムネイル画像を作成するために使用される Imagemagick のインストールが含まれます。
-
index.js: サービスのコードが格納されています。
-
[ターミナルを開く] をクリックします。
-
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 リポジトリに保存されます。
-
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 バケットに保存します。
-
Cloud Shell で [エディタを開く] をクリックします。
-
Cloud Shell エディタで ~/code/cloud-run/create-collage
に移動し、create-collage サービスのファイルを調べます。
このディレクトリには、package.json、index.js、Dockerfile の 3 つのファイルがあります。
-
[ターミナルを開く] をクリックします。
-
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 バケットからサムネイル画像を削除し、データベースから画像のメタデータを削除します。
-
Cloud Shell で [エディタを開く] をクリックします。
-
Cloud Shell エディタで ~/code/cloud-run/delete-image
に移動し、delete-image サービスのファイルを調べます。
このディレクトリには、package.json と index.js の 2 つのファイルのみが格納されています。Dockerfile はありません。
このラボでは、コンテナを手動でビルドして公開するのではなく、Google Cloud Buildpacks を使用して自動的にビルドします。
なお、このサービスはリクエストを CloudEvent として解析します。Eventarc が標準の CloudEvent 形式でイベントを送信します。
-
[ターミナルを開く] をクリックします。
-
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 リポジトリを作成する必要があるという警告が表示されます。
-
続行を確認するメッセージが表示されたら、「Y
」と入力します。
アーティファクトのリポジトリと Cloud Run サービスを調べる
-
Google Cloud コンソールのタイトルバーで、[検索] フィールドに「Artifact Registry」と入力して [検索] をクリックし、検索結果で [Artifact Registry] をクリックします。
作成したリポジトリ(image-app-repo)と Google Cloud Buildpacks で作成されたリポジトリ(cloud-run-source-deploy)が Artifact Registry に表示されます。
-
[image-app-repo] をクリックします。
image-app-repo には、create-collage サービスと create-thumbnail サービス用に先ほどビルドした Docker イメージが格納されています。
-
[Artifact Registry] > [リポジトリ] に戻り、[cloud-run-source-deploy] をクリックします。
このリポジトリには、Google Cloud Buildpacks で自動的に作成された、delete-image の Docker イメージが格納されています。
-
Google Cloud コンソールのナビゲーション メニュー(
)で、[Cloud Run] > [サービス] に移動します。
3 つのサービスがすべてデプロイされています。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
リポジトリを作成して Cloud Run サービスをデプロイする
タスク 5. Cloud Vision のレスポンスを解析する関数を作成する
このタスクでは、Cloud Vision API によって返される画像データを解析する Cloud Run functions の関数を作成します。
-
Cloud Shell で [エディタを開く] をクリックします。
-
Cloud エディタで ~/code/cloud-functions/extract-image-metadata
に移動し、extract-image-metadata 関数のファイルを調べます。
Node.js サービスには、index.js ファイルと package.json ファイルが含まれています。Cloud Run functions は自動的に Buildpack を使用してコンテナを作成するため、Dockerfile は必要ありません。
-
[ターミナルを開く] をクリックします。
-
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
注: デプロイでリポジトリのメタデータを取得できなかった場合は、関数のデプロイが成功するまで数回試行してください
-
Google Cloud コンソールのタイトルバーで、[検索] フィールドに「Cloud Run functions」と入力して [検索] をクリックし、検索結果で [Cloud Run functions] をクリックします。
extract-image-metadata 関数がデプロイされています。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
Cloud Vision のレスポンスを解析する関数を作成する
タスク 6. ワークフローを作成する
このタスクでは、サービスと API 呼び出しをオーケストレートするワークフローを作成します。
-
Cloud Shell で [エディタを開く] をクリックします。
-
Cloud Shell エディタで ~/code/workflows
に移動し、image-add-workflow.yaml という YAML ファイルを調べます。
このワークフローでは、ワークフローが開始されたときに実行する一連のステップを指定します。ログに記録されないステップは以下のとおりです。
-
init: ワークフローで使用される変数を代入します。bucket と filename には、ワークフローの呼び出し時に 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: ワークフローを終了し、ワークフロー実行の識別子を返します。
-
[ターミナルを開く] をクリックします。
-
次のコマンドを実行し、ワークフロー 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 を使用してリクエストを送信できます。
-
次のコマンドを実行して、関数と 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 によってサービス アカウントが使用されます。
-
次のコマンドを実行して、ワークフローをデプロイします。
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 サービス エージェントが存在しないためにコマンドが失敗した場合は、ワークフローを再デプロイしてください。
-
Google Cloud コンソールのタイトルバーで、[検索] フィールドに「Workflows」と入力して [検索] をクリックし、検索結果で [ワークフロー] をクリックします。
-
[ワークフロー] の横にある固定アイコンをクリックします。
-
[image-add-workflow] をクリックし、[ソース] タブをクリックします。
左側のペインにワークフローのコードが表示され、右側のペインにワークフローのステップのビジュアル フローが表示されます。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
ワークフローを作成する
タスク 7. ワークフローを開始する Eventarc トリガーを作成する
このタスクでは、uploaded-images バケットにファイルが追加されたときにワークフローを実行する Eventarc トリガーを作成します。
-
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 というサービス アカウントを作成し、イベントを受信してワークフローを呼び出すためのロールを追加します。
-
次のコマンドを実行して、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 イベントをパブリッシュする権限を追加します。
-
次のコマンドを実行してトリガーを作成します。
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 バケットに画像が追加されたときに実行されるステップをテストします。
-
次のコマンドを実行して、画像を 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 がそのアップロードを検出してワークフローを開始します。
-
Google Cloud コンソールのナビゲーション メニュー(
)で、[ワークフロー] > [ワークフロー] に移動します。
-
[image-add-workflow] をクリックし、[実行] タブをクリックします。
ワークフローが実行されたことがすぐに表示されます。
注: 実行が開始されるまで 1~2 分かかることがあります。
-
実行 ID をクリックして、[実行の詳細] ページを開きます。
このページには、ワークフローの実行に関する詳細が表示されます。
[入力] ペインには、Eventarc トリガーによって送信された Cloud Storage イベントの内容が表示されます。
[出力] ペインには、ワークフローの最後に返された値が表示されます。
[ログ] ペインには、ワークフローによって作成されたログエントリが表示されます。
-
Google Cloud コンソールのタイトルバーで、[検索] フィールドに「Cloud Run functions」と入力して [検索] をクリックし、検索結果で [Cloud Run functions] をクリックします。
-
[extract-image-metadata] をクリックします。
このダッシュボードには、Cloud Vision のレスポンスから情報を抽出するために使用された関数の詳細が表示されます。
-
[ログ] タブをクリックします。
ログに記録された関数実行のデータが表示されます。画像のラベルとテキストがログに記録されています。
-
Google Cloud コンソールのタイトルバーで、[検索] フィールドに「Firestore」と入力して [検索] をクリックし、検索結果で [Firestore] をクリックします。
-
[(default)] をクリックします。
images コレクションに、ワークフローによって書き込まれた neon.jpg というドキュメントが表示されます。画像に付与されたラベルと、画像内に見つかったテキストが表示されます。
-
Google Cloud コンソールのナビゲーション メニュー(
)で、[Cloud Run] > [サービス] に移動し、[create-thumbnail] をクリックします。
このダッシュボードには、create-thumbnail サービスに関する情報が表示されます。
-
[ログ] タブをクリックします。
ログに記録されたサービス実行のデータが表示されます。
-
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 ジョブを作成します。
画像をアップロードする
-
次のコマンドを実行して、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}
画像ごとにワークフローが実行され、各画像のサムネイルが作成されます。
-
次のコマンドを実行して、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"
-
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 はスケジュールされたジョブの作成時に必要になります。
-
Google Cloud コンソールのタイトルバーで、[検索] フィールドに「Cloud Scheduler」と入力して [検索] をクリックし、検索結果で [Cloud Scheduler] をクリックします。
-
[+ ジョブを作成] をクリックします。
-
スケジュール設定を次のように指定します。
プロパティ |
値 |
名前 |
collage-schedule |
リージョン |
[] を選択 |
頻度 |
* * * * * |
タイムゾーン |
「UTC」を検索し、[協定世界時(UTC)] を選択 |
頻度には、unix-cron 形式でスケジュールを指定します。「* * * * *」は、1 分ごとにジョブを実行することを示します。
テストを簡単にするために、ここでは 1 分ごとの頻度を選択します。
-
[続行] をクリックし、[ターゲット タイプ] で [HTTP] を選択します。
-
実行設定を次のように指定します。
プロパティ |
値 |
URL |
create-collage サービスの URL を貼り付ける
|
HTTP メソッド |
[POST] を選択 |
Auth ヘッダー |
[OIDC トークンを追加] を選択 |
サービス アカウント |
[collage-schedule-sa] を選択 |
対象 |
create-collage サービスの URL を貼り付ける
|
-
[続行] をクリックしてから [作成] をクリックします。
collage-schedule ジョブが Cloud Scheduler の [ジョブ] ページに表示されます。
ジョブは 1 分以内に実行されるはずです。
-
成功を示すチェックマークが collage-schedule ジョブに表示されるまで、[更新] をクリックします。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
スケジュールされたジョブを追加してコラージュを作成する
-
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 トリガーを作成します。
サービス アカウントを作成してロールを管理する
-
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 サービスを呼び出すための権限を追加します。
-
Google Cloud コンソールのナビゲーション メニュー(
)で [Cloud Run] に移動し、[delete-image] をクリックします。
-
[サービスの詳細] ページで、[トリガー] タブをクリックします。
-
[+ トリガーを追加] をクリックし、[Cloud Storage トリガー] を選択します。
-
トリガー設定を次のように指定します。
プロパティ |
値 |
トリガーの名前 |
image-delete-trigger |
イベント タイプ |
[google.cloud.storage.object.v1.deleted] を選択 |
バケット |
[参照] をクリックし、uploaded-images バケットを選択して、[選択] をクリック |
サービス アカウント |
delete-image-trigger-sa サービス アカウントを選択 |
サービス URL パス |
/ |
-
Pub/Sub にロールを付与する必要があるというメッセージが表示されたら、[付与] をクリックします。
-
[トリガーを保存] をクリックします。
このトリガーは、uploaded-images バケットからファイルが削除されるたびに delete-image サービスを呼び出します。
注: リージョンがトリガー リソースの制約に違反していることを示すエラー メッセージが表示された場合は、誤った Cloud Storage バケットを選択した可能性があります。作成プロセスをもう一度試して、uploaded-images バケットが選択されていることを確認してください。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
画像ファイルとメタデータを削除するサービスをトリガーする
画像の削除をテストする
-
次のコマンドを実行して、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 の詳細が表示されます。次に、その画像を削除します。
-
次のコマンドを実行して、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 ドキュメントが削除されます。
-
先ほどと同じコマンドを実行して、サムネイルと 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}"
アイテムは削除されています。
-
Google Cloud コンソールのナビゲーション メニュー(
)で、[Cloud Run] > [サービス] に移動し、[delete-image] をクリックします。
-
[ログ] をクリックします。
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 の商標です。その他すべての社名および製品名は、それぞれ該当する企業の商標である可能性があります。