このチュートリアルでは、Cloud Run、Cloud Vision API、ImageMagick を使用して、Cloud Storage バケットにアップロードされた不適切な画像を検出してぼかす方法を説明します。このチュートリアルは、Cloud Run で Pub/Sub を使用するに基づいています。
このチュートリアルでは、既存のサンプルアプリの変更について説明します。完成したサンプルをダウンロードすることもできます。
目標
- 非同期データ処理サービスを Cloud Run に書き込み、ビルドし、デプロイする。
- Cloud Storage にファイルをアップロードしてサービスを起動し、Pub/Sub メッセージを作成する。
- Cloud Vision API を使用して、暴力的なコンテンツやアダルト コンテンツを検出する。
- ImageMagick を使用して、不適切な画像をぼかす。
- 人食いゾンビの画像をアップロードして、サービスをテストする。
費用
このドキュメントでは、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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Pub/Sub, Cloud Run, Cloud Storage and Cloud Vision APIs.
- gcloud CLI をインストールして初期化します。
- コンポーネントを更新します。
gcloud components update
- Pub/Sub を使用するチュートリアルに従って、Pub/Sub トピック、安全な push サブスクリプション、メッセージを処理する最初の Cloud Run サービスを設定します。
必要なロール
チュートリアルを完了するために必要な権限を取得するには、プロジェクトに対して次の IAM ロールを付与するよう管理者に依頼してください。
-
Cloud Build 編集者(
roles/cloudbuild.builds.editor
) -
Cloud Run 管理者(
roles/run.admin
) -
ログ表示アクセス者(
roles/logging.viewAccessor
) -
プロジェクト IAM 管理者(
roles/resourcemanager.projectIamAdmin
) -
Pub/Sub 管理者(
roles/pubsub.admin
) -
サービス アカウント ユーザー(
roles/iam.serviceAccountUser
) -
Service Usage ユーザー(
roles/serviceusage.serviceUsageConsumer
) -
ストレージ管理者(
roles/storage.admin
)
ロールの付与の詳細については、アクセス権の管理をご覧ください。
gcloud のデフォルトを設定する
Cloud Run サービスを gcloud のデフォルトに構成するには:
デフォルト プロジェクトを設定します。
gcloud config set project PROJECT_ID
PROJECT_ID は、このチュートリアルで作成したプロジェクトの名前に置き換えます。
選択したリージョン向けに gcloud を構成します。
gcloud config set run/region REGION
REGION は、任意のサポートされている Cloud Run のリージョンに置き換えます。
Cloud Run のロケーション
Cloud Run はリージョナルです。つまり、Cloud Run サービスを実行するインフラストラクチャは特定のリージョンに配置され、そのリージョン内のすべてのゾーンで冗長的に利用できるように Google によって管理されます。
レイテンシ、可用性、耐久性の要件を満たしていることが、Cloud Run サービスを実行するリージョンを選択する際の主な判断材料になります。一般的には、ユーザーに最も近いリージョンを選択できますが、Cloud Run サービスで使用されている他の Google Cloud サービスのロケーションも考慮する必要があります。使用する Google Cloud サービスが複数のロケーションにまたがっていると、サービスの料金だけでなくレイテンシにも影響することがあります。
Cloud Run は、次のリージョンで利用できます。
ティア 1 料金を適用
asia-east1
(台湾)asia-northeast1
(東京)asia-northeast2
(大阪)europe-north1
(フィンランド) 低 CO2europe-southwest1
(マドリッド) 低 CO2europe-west1
(ベルギー) 低 CO2europe-west4
(オランダ) 低 CO2europe-west8
(ミラノ)europe-west9
(パリ) 低 CO2me-west1
(テルアビブ)us-central1
(アイオワ) 低 CO2us-east1
(サウスカロライナ)us-east4
(北バージニア)us-east5
(コロンバス)us-south1
(ダラス) 低 CO2us-west1
(オレゴン) 低 CO2
ティア 2 料金を適用
africa-south1
(ヨハネスブルグ)asia-east2
(香港)asia-northeast3
(ソウル、韓国)asia-southeast1
(シンガポール)asia-southeast2
(ジャカルタ)asia-south1
(ムンバイ、インド)asia-south2
(デリー、インド)australia-southeast1
(シドニー)australia-southeast2
(メルボルン)europe-central2
(ワルシャワ、ポーランド)europe-west10
(ベルリン) 低 CO2europe-west12
(トリノ)europe-west2
(ロンドン、イギリス) 低 CO2europe-west3
(フランクフルト、ドイツ) 低 CO2europe-west6
(チューリッヒ、スイス) 低 CO2me-central1
(ドーハ)me-central2
(ダンマーム)northamerica-northeast1
(モントリオール) 低 CO2northamerica-northeast2
(トロント) 低 CO2southamerica-east1
(サンパウロ、ブラジル) 低 CO2southamerica-west1
(サンティアゴ、チリ) 低 CO2us-west2
(ロサンゼルス)us-west3
(ソルトレイクシティ)us-west4
(ラスベガス)
Cloud Run サービスをすでに作成している場合は、Google Cloud コンソールの Cloud Run ダッシュボードにリージョンが表示されます。
一連の操作を理解する
このチュートリアルでは次の流れで手順を説明します。
- ユーザーは、Cloud Storage バケットに画像をアップロードします。
- Cloud Storage が新しいファイルに関するメッセージを Pub/Sub に公開します。
- Pub/Sub はメッセージを Cloud Run サービスにプッシュします。
- Cloud Run サービスが、Pub/Sub メッセージで参照されているイメージ ファイルを取得します。
- Cloud Run サービスが、Cloud Vision API を使用してイメージを分析します。
- 暴力的なコンテンツやアダルト コンテンツが見つかった場合、Cloud Run サービスが ImageMagick を使用して画像をぼかします。
- Cloud Run サービスは、ぼかした画像を別の Cloud Storage バケットにアップロードします。
ぼかした画像は、読者のためのテスト用に後で使用できます。
Artifact Registry 標準リポジトリを作成する
コンテナ イメージを保存する Artifact Registry 標準リポジトリを作成します。
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=REGION
次のように置き換えます。
- REPOSITORY は、リポジトリの一意の名前に置き換えます。
- REGION は、Artifact Registry リポジトリに使用する Google Cloud リージョンに置き換えます。
Cloud Storage バケットを設定する
gcloud
画像をアップロードする Cloud Storage バケットを作成します。INPUT_BUCKET_NAME は、グローバルに固有のバケット名です。
gcloud storage buckets create gs://INPUT_BUCKET_NAME
Cloud Run サービスは、このバケットからのみ読み取りを行います。
ぼかし入りの画像を保存する 2 つ目の Cloud Storage バケットを作成します。BLURRED_BUCKET_NAME はグローバルに固有のバケット名です。
gcloud storage buckets create gs://BLURRED_BUCKET_NAME
Cloud Run サービスは、ぼかし入りの画像をこのバケットにアップロードします。別のバケットを使用すると、処理された画像でサービスを再度トリガーできません。
デフォルトでは、Cloud Run のリビジョンは Compute Engine のデフォルトのサービス アカウントとして実行されます。
代わりにユーザー管理サービス アカウントを使用している場合、必要な IAM ロールを割り当て、INPUT_BUCKET_NAME からの
storage.objects.get
読み取り権限と BLURRED_BUCKET_NAME へのstorage.objects.create
アップロード権限を付与していることを確認します。
Terraform
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
2 つの Cloud Storage バケットを作成します。一つは元の画像をアップロードするためのもので、もう一つは Cloud Run サービスがぼかしを入れた画像をアップロードするためのものです。
両方の Cloud Storage バケットをグローバルに一意の名前で作成するには、既存の main.tf
ファイルに次の行を追加します。
デフォルトでは、Cloud Run のリビジョンは Compute Engine のデフォルトのサービス アカウントとして実行されます。
代わりにユーザー管理サービス アカウントを使用している場合、必要な IAM ロールを割り当て、google_storage_bucket.imageproc_input
からの storage.objects.get
読み取り権限と google_storage_bucket.imageproc_output
への storage.objects.create
アップロード権限を付与していることを確認します。
次の手順で、INPUT_BUCKET_NAME へのファイル アップロードの通知を処理するサービスを作成してデプロイします。新しいサービスの早期呼び出しを回避するため、通知配信はサービスのデプロイとテストをした後にオンにします。
Pub/Sub チュートリアル サンプルコードを変更する
このチュートリアルは、Pub/Sub を使用するチュートリアルで作成したコードを基にしています。まだチュートリアルを完了していない場合、すぐに完了してください。クリーンアップ手順をスキップし、ここに戻って画像処理動作を追加します。
画像処理コードを追加する
画像処理コードは、読みやすさとテストを容易にするためリクエスト処理から分離されています。画像処理コードを追加するには:
Pub/Sub チュートリアル サンプルコードのディレクトリに移動します。
Google Cloud サービス、ImageMagick、ファイル システムと統合するためのライブラリなど、画像処理の依存関係をインポートするコードを追加します。
Node.js
エディタで新しいimage.js
ファイルを開き、次のコードをコピーします。Python
エディタで新しいimage.py
ファイルを開き、次のコードをコピーします。Go
エディタで新しいimagemagick/imagemagick.go
ファイルを開き、次のコードをコピーします。Java
エディタで新しいsrc/main/java/com/example/cloudrun/ImageMagick.java
ファイルを開き、次のコードをコピーします。Pub/Sub メッセージをイベント オブジェクトとして受信し、画像処理を制御するコードを追加します。
このイベントには、最初にアップロードされた画像に関するデータが含まれます。このコードは、Cloud Vision による暴力的なコンテンツやアダルト コンテンツの分析結果を確認することで、画像をぼかす必要があるかどうかを判断します。
Node.js
Python
Go
Java
Cloud Storage 入力バケットから上述で作成した参照画像を取得し、ImageMagick を使って画像をぼかし効果で変換してから、結果を出力バケットにアップロードします。
Node.js
Python
Go
Java
Pub/Sub サンプルコードへ画像処理を統合する
画像処理コードを組み込むために既存のサービスを変更するには:
Cloud Vision や Cloud Storage のクライアント ライブラリなど、サービスの新しい依存関係を追加します。
Node.js
npm install --save gm @google-cloud/storage @google-cloud/vision
Python
必要なクライアント ライブラリを追加すると、requirements.txt
は次のようになります。Go
go サンプル アプリケーションは go モジュールを使用します。imagemagick/imagemagick.go
インポート ステートメントで追加された上記の新しい依存関係は、それを必要とする次のコマンドで自動的にダウンロードされます。Java
pom.xml
の<dependencyManagement>
に次の依存関係を追加します。pom.xml
の<dependencies>
に次の依存関係を追加します。FROM
ステートメントの下のDockerfile
を変更して、ImageMagick システム パッケージをコンテナに追加します。「マルチステージ」の Dockerfile を使用する場合は、これを最終ステージに配置します。Debian / Ubuntu Alpine Cloud Run サービスでのシステム パッケージの操作について詳しくは、システム パッケージ・チュートリアルを使用するをご覧ください。
既存の関数呼び出し付きの Pub/Sub メッセージ処理コードを新しいぼかしロジックに置き換えます。
Node.js
app.js
ファイルは Express.js アプリを定義し、受信 Pub/Sub メッセージを使用できるよう準備します。次のように変更します。- 新しい
image.js
ファイルをインポートするコードを追加します。 - ルートから既存の「Hello World」コードを削除します。
- Pub/Sub メッセージをさらに検証するコードを追加します。
新しい画像処理関数を呼び出すコードを追加します。
終了すると、コードは次のようになります。
Python
main.py
ファイルは、Flask アプリを定義し、受信した Pub/Sub メッセージを使用できるように準備します。次のように変更します。- 新しい
image.py
ファイルをインポートするコードを追加します。 - ルートから既存の「Hello World」コードを削除します。
- Pub/Sub メッセージをさらに検証するコードを追加します。
新しい画像処理関数を呼び出すコードを追加します。
終了すると、コードは次のようになります。
Go
main.go
ファイルは、HTTP サービスを定義し、受信 Pub/Sub メッセージを使用できるように準備します。次のように変更します。- 新しい
imagemagick.go
ファイルをインポートするコードを追加します。 - ハンドラから既存の「Hello World」コードを削除します。
- Pub/Sub メッセージをさらに検証するコードを追加します。
- 新しい画像処理関数を呼び出すコードを追加します。
Java
PubSubController.java
ファイルは、HTTP リクエストを処理し、受信した Pub/Sub メッセージを使用できるように準備するコントローラを定義します。次のように変更します。- 新しいインポートを追加します。
- コントローラから既存の「Hello World」コードを削除します。
- Pub/Sub メッセージをさらに検証するコードを追加します。
- 新しい画像処理関数を呼び出すコードを追加します。
- 新しい
サンプル全体をダウンロードする
使用する完全な画像処理のコードサンプルを取得するには:
ローカルマシンにサンプルアプリのリポジトリのクローンを作成します。
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
または、zip 形式のサンプルをダウンロードしてファイルを抽出してもかまいません。
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
または、zip 形式のサンプルをダウンロードしてファイルを抽出してもかまいません。
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
または、zip 形式のサンプルをダウンロードしてファイルを抽出してもかまいません。
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
または、zip 形式のサンプルをダウンロードし、ファイルを抽出してもかまいません。
Cloud Run のサンプルコードが含まれているディレクトリに移動します。
Node.js
cd nodejs-docs-samples/run/image-processing/
Python
cd python-docs-samples/run/image-processing/
Go
cd golang-samples/run/image-processing/
Java
cd java-docs-samples/run/image-processing/
コードを配布する
コードの配布は、Cloud Build でコンテナ イメージをビルドする、Artifact Registry にコンテナ イメージをアップロードする、Cloud Run にコンテナ イメージをデプロイするという 3 つのステップで構成されます。
コードを配布するには:
コンテナをビルドして、Artifact Registry に公開します。
Node.js
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub
ここで、
pubsub
はサービスの名前です。次のように置き換えます。
- PROJECT_ID は、Google Cloud プロジェクト ID に置き換えます。
- REPOSITORY は、Artifact Registry リポジトリの名前に置き換えます。
- REGION は、Artifact Registry リポジトリに使用する Google Cloud リージョンに置き換えます。
ビルドが成功すると、ID、作成時間、画像の名前を含む SUCCESS メッセージが表示されます。イメージが Artifact Registry に保存されます。このイメージは必要に応じて再利用できます。
Python
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub
ここで、
pubsub
はサービスの名前です。次のように置き換えます。
- PROJECT_ID は、Google Cloud プロジェクト ID に置き換えます。
- REPOSITORY は、Artifact Registry リポジトリの名前に置き換えます。
- REGION は、Artifact Registry リポジトリに使用する Google Cloud リージョンに置き換えます。
ビルドが成功すると、ID、作成時間、画像の名前を含む SUCCESS メッセージが表示されます。イメージが Artifact Registry に保存されます。このイメージは必要に応じて再利用できます。
Go
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub
ここで、
pubsub
はサービスの名前です。次のように置き換えます。
- PROJECT_ID は、Google Cloud プロジェクト ID に置き換えます。
- REPOSITORY は、Artifact Registry リポジトリの名前に置き換えます。
- REGION は、Artifact Registry リポジトリに使用する Google Cloud リージョンに置き換えます。
ビルドが成功すると、ID、作成時間、画像の名前を含む SUCCESS メッセージが表示されます。イメージが Artifact Registry に保存されます。このイメージは必要に応じて再利用できます。
Java
このサンプルでは、Jib を使用して一般的な Java ツールにより Docker イメージをビルドします。Jib は、Dockerfile や Docker をインストールせずにコンテナのビルドを最適化します。Jib を使用して Java コンテナを構築する方法の詳細を確認します。Dockerfile を使用して、インストールしたシステム パッケージでベースイメージの構成とビルドを行い、Jib のデフォルト ベースイメージを上書きします。
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/imagemagick
次のように置き換えます。
- PROJECT_ID は、Google Cloud プロジェクト ID に置き換えます。
- REPOSITORY は、Artifact Registry リポジトリの名前に置き換えます。
- REGION は、Artifact Registry リポジトリに使用する Google Cloud リージョンに置き換えます。
Docker を承認して Artifact Registry に push するには、gcloud 認証ヘルパーを使用します。
gcloud auth configure-docker
Jib で最終的なコンテナを作成し、Artifact Registry で公開します。
mvn compile jib:build \ -Dimage=REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub \ -Djib.from.image=REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/imagemagick
次のように置き換えます。
- PROJECT_ID は、Google Cloud プロジェクト ID に置き換えます。
- REPOSITORY は、Artifact Registry リポジトリの名前に置き換えます。
- REGION は、Artifact Registry リポジトリに使用する Google Cloud リージョンに置き換えます。
Pub/Sub を使用するチュートリアルで使用したサービス名を使用して、次のコマンドを実行し、サービスをデプロイします。
Node.js
gcloud run deploy pubsub-tutorial --image REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub --set-env-vars=BLURRED_BUCKET_NAME=BLURRED_BUCKET_NAME --no-allow-unauthenticated
Python
gcloud run deploy pubsub-tutorial --image REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub --set-env-vars=BLURRED_BUCKET_NAME=BLURRED_BUCKET_NAME --no-allow-unauthenticated
Go
gcloud run deploy pubsub-tutorial --image REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub --set-env-vars=BLURRED_BUCKET_NAME=BLURRED_BUCKET_NAME --no-allow-unauthenticated
Java
gcloud run deploy pubsub-tutorial --image REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub --set-env-vars=BLURRED_BUCKET_NAME=BLURRED_BUCKET_NAME --memory 512M --no-allow-unauthenticated
ここで、
pubsub
はコンテナ名、pubsub-tutorial
はサービスの名前です。コンテナ イメージは、gcloud defaults の設定で構成したサービスとリージョン(Cloud Run)にデプロイされることに注意してください。次のように置き換えます。- PROJECT_ID は、Google Cloud プロジェクト ID に置き換えます。
- REPOSITORY は、Artifact Registry リポジトリの名前に置き換えます。
- REGION は、Artifact Registry リポジトリに使用する Google Cloud リージョンに置き換えます。
- BLURRED_BUCKET_NAME は、先ほど作成した Cloud Storage バケットに置き換え、ぼかした画像を受け取って環境変数を設定します。
--no-allow-unauthenticated
フラグは、サービスへの未認証アクセスを制限します。サービスを非公開にすることで、Cloud Run と Pub/Sub の自動統合でリクエストの認証を行うことができます。構成方法の詳細については、Pub/Sub との統合をご覧ください。IAM ベースの認証の詳細については、アクセスの管理をご覧ください。デプロイが完了するまで待ちます。30 秒ほどかかる場合があります。成功すると、コマンドラインにサービス URL が表示されます。
Cloud Storage からの通知をオンにする
ファイル(オブジェクトと呼ばれます)がアップロードまたは変更されるたびに、Pub/Sub トピックにメッセージを公開するよう Cloud Storage を構成します。以前に作成したトピックに通知を送信して、新しいファイルのアップロードでサービスが起動するようにします。
gcloud
gcloud storage service-agent --project=PROJECT_ID gcloud storage buckets notifications create gs://INPUT_BUCKET_NAME --topic=myRunTopic --payload-format=json
myRunTopic
は、前のチュートリアルで作成したトピックです。
INPUT_BUCKET_NAME は、バケットの作成時に使用した名前に置き換えます。
ストレージ バケット通知の詳細については、オブジェクトの変更通知をご覧ください。
Terraform
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
通知を有効にするには、プロジェクトに固有の Cloud Storage サービス アカウントが存在し、Pub/Sub トピックに対する IAM 権限 pubsub.publisher
が付与されている必要があります。この権限を付与して Cloud Storage 通知を作成するには、既存の main.tf
ファイルに次の行を追加します。
試してみる
肉食ゾンビの画像など、不適切な画像をアップロードします。
curl -o zombie.jpg https://cdn.pixabay.com/photo/2015/09/21/14/24/zombie-949916_960_720.jpg gcloud storage cp zombie.jpg gs://INPUT_BUCKET_NAME
INPUT_BUCKET_NAME は、以前に画像アップロード用に作成した Cloud Storage バケットです。
サービスログに移動します。
- Google Cloud Console の [Cloud Run] ページに移動します。
pubsub-tutorial
サービスをクリックします。- [ログ] タブを選択します。ログが表示されるまで少し時間がかかることがあります。すぐに表示されない場合は、しばらくしてからもう一度確認してください。
Blurred image: zombie.png
メッセージを探します。先に作成した BLURRED_BUCKET_NAME Cloud Storage バケット内のぼかし画像を表示できます。バケットは Google Cloud Console の [Cloud Storage] ページにあります。
クリーンアップ
このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用し、このチュートリアルで変更を加えずに残す場合は、チュートリアル用に作成したリソースを削除します。
プロジェクトを削除する
課金されないようにする最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- 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 サービスを削除します。
gcloud run services delete SERVICE-NAME
SERVICE-NAME は、選択したサービス名です。
Cloud Run サービスは Google Cloud コンソールから削除することもできます。
チュートリアルの設定時に追加した gcloud のデフォルト リージョン構成を削除します。
gcloud config unset run/region
プロジェクト構成を削除します。
gcloud config unset project
このチュートリアルで作成した他の Google Cloud リソースを削除します。
- Pub/Sub トピック
myRunTopic
を削除します - Pub/Sub サブスクリプション
myRunSubscription
を削除します。 - Artifact Registry からコンテナ イメージを削除します。
- 呼び出し元のサービス アカウント
cloud-run-pubsub-invoker@PROJECT_ID.iam.gserviceaccount.com
を削除します - プレースホルダ
INPUT_BUCKET_NAME
とBLURRED_BUCKET_NAME
用に作成した Cloud Storage バケットを削除します
- Pub/Sub トピック
次のステップ
- Cloud Storage で、Cloud Run を使用したデータの永続化の詳細を確認する。
- Cloud Vision API を使用して露骨な表現を含むコンテンツ以外を検出する方法を確認する。
- Google Cloud に関するリファレンス アーキテクチャ、図、ベスト プラクティスを確認する。Cloud アーキテクチャ センターをご覧ください。