このチュートリアルでは、Cloud Run for Anthos、Cloud Vision API、ImageMagick を使用して、Cloud Storage バケットにアップロードされた不適切な画像を検出してぼかす方法を説明します。このチュートリアルは、チュートリアル・Cloud Run for Anthos で Pub/Sub を使用するに基づいています。
このチュートリアルでは、既存のサンプルアプリの変更について説明します。完成したサンプルをダウンロードすることもできます。
目標
- 非同期データ処理サービスを Cloud Run for Anthos に書き込み、ビルドし、デプロイする。
- Cloud Storage にファイルをアップロードしてサービスを起動し、Pub/Sub メッセージを作成する。
- Cloud Vision API を使用して、暴力的なコンテンツやアダルト コンテンツを検出する。
- ImageMagick を使用して、不適切な画像をぼかす。
- 人食いゾンビの画像をアップロードして、サービスをテストする。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
-
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 Cloud Run for Anthos and Cloud Vision APIs.
- gcloud CLI をインストールして初期化する。
kubectl
コンポーネントをインストールします。gcloud components install kubectl
- コンポーネントを更新します。
gcloud components update
- Cloud Run for Anthos を使用して、Cloud Run for Anthos の設定の手順に沿って新しいクラスタを作成します。
- Cloud Run for Anthos で Pub/Sub を使用するのチュートリアルに沿って、Pub/Sub トピック、安全な push サブスクリプション、メッセージを処理する最初の Cloud Run for Anthos サービスを設定します。
gcloud のデフォルトを設定する
gcloud に Cloud Run for Anthos サービス用のデフォルトを構成するには、次のようにします。
デフォルト プロジェクトを設定します。
gcloud config set project PROJECT_ID
PROJECT_ID は、このチュートリアルで使用するプロジェクトの名前に置き換えます。
クラスタに gcloud を構成します。
gcloud config set run/platform gke gcloud config set run/cluster CLUSTER-NAME gcloud config set run/cluster_location REGION
以下のように置き換えます。
- CLUSTER-NAME は、クラスタに対して使用した名前に置き換えます。
- REGION は、選択したサポート対象のクラスタの場所に置き換えます。
一連の操作を理解する
このチュートリアルでは次の流れで手順を説明します。
- ユーザーは、Cloud Storage バケットに画像をアップロードします。
- Cloud Storage が新しいファイルに関するメッセージを Pub/Sub に公開します。
- Pub/Sub が、メッセージを Cloud Run for Anthos サービスにプッシュします。
- Cloud Run for Anthos サービスが、Pub/Sub メッセージで参照されているイメージ ファイルを取得します。
- Cloud Run for Anthos サービスが Cloud Vision API を使用して画像を分析します。
- 暴力的なコンテンツやアダルト コンテンツが検出された場合、Cloud Run for Anthos サービスが ImageMagick を使用して画像をぼかします。
- Cloud Run for Anthos サービスは、ぼかした画像を別の Cloud Storage バケットにアップロードして使用します。
ぼかした画像は、読者のためのテスト用に後で使用できます。
Cloud Storage バケットを設定する
画像をアップロードする Cloud Storage バケットを作成します。INPUT_BUCKET_NAME は、グローバルに固有のバケット名です。
gsutil mb gs://INPUT_BUCKET_NAME
Cloud Run for Anthos サービスは、このバケットからのみ読み取りを行います。
ぼかし入りの画像を保存する 2 つ目の Cloud Storage バケットを作成します。BLURRED_BUCKET_NAME はグローバルに固有のバケット名です。
gsutil mb gs://BLURRED_BUCKET_NAME
Cloud Run for Anthos サービスは、ぼかし入りの画像をこのバケットにアップロードします。別のバケットを使用すると、処理された画像でサービスを再度トリガーできません。
次の手順で、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 for Anthos サービスでのシステム パッケージの操作について詳しくは、システム パッケージ・チュートリアルを使用するをご覧ください。
既存の関数呼び出し付きの 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 for Anthos のサンプルコードが含まれているディレクトリに移動します。
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 でコンテナ イメージをビルドする、Container Registry にコンテナ イメージをアップロードする、Cloud Run にコンテナ イメージをデプロイするという 3 ステップで構成されます。
コードを配布するには:
コンテナをビルドして、Container Registry に公開します。
Node.js
gcloud builds submit --tag gcr.io/PROJECT_ID/pubsub
ここで、PROJECT_ID は GCP プロジェクト ID、
pubsub
はサービスに付ける名前です。ビルドが成功すると、ID、作成時間、画像の名前を含む SUCCESS メッセージが表示されます。イメージが Container Registry に保存されます。このイメージは必要に応じて再利用できます。
Python
gcloud builds submit --tag gcr.io/PROJECT_ID/pubsub
ここで、PROJECT_ID は GCP プロジェクト ID、
pubsub
はサービスに付ける名前です。ビルドが成功すると、ID、作成時間、画像の名前を含む SUCCESS メッセージが表示されます。イメージが Container Registry に保存されます。このイメージは必要に応じて再利用できます。
Go
gcloud builds submit --tag gcr.io/PROJECT_ID/pubsub
ここで、PROJECT_ID は GCP プロジェクト ID、
pubsub
はサービスに付ける名前です。ビルドが成功すると、ID、作成時間、画像の名前を含む SUCCESS メッセージが表示されます。イメージが Container Registry に保存されます。このイメージは必要に応じて再利用できます。
Java
このサンプルでは、Jib を使用して一般的な Java ツールにより Docker イメージをビルドします。Jib は、Dockerfile や Docker をインストールせずにコンテナのビルドを最適化します。Jib を使用して Java コンテナを構築する方法の詳細を確認します。Dockerfile を使用して、インストールしたシステム パッケージでベースイメージの構成とビルドを行い、Jib のデフォルト ベースイメージを上書きします。
gcloud builds submit --tag gcr.io/PROJECT_ID/imagemagick
PROJECT_ID は、GCP のプロジェクト ID です。
Jib で最終的なコンテナを作成し、Container Registry で公開します。
mvn compile jib:build \ -Dimage=gcr.io/PROJECT_ID/pubsub \ -Djib.from.image=gcr.io/PROJECT_ID/imagemagick
PROJECT_ID は、GCP のプロジェクト ID です。
Pub/Sub チュートリアルで使用したサービス名を使用して、次のコマンドを実行し、サービスをデプロイします。
Node.js
gcloud run deploy pubsub-tutorial --image gcr.io/PROJECT_ID/pubsub --set-env-vars=BLURRED_BUCKET_NAME=BLURRED_BUCKET_NAME
Python
gcloud run deploy pubsub-tutorial --image gcr.io/PROJECT_ID/pubsub --set-env-vars=BLURRED_BUCKET_NAME=BLURRED_BUCKET_NAME
Go
gcloud run deploy pubsub-tutorial --image gcr.io/PROJECT_ID/pubsub --set-env-vars=BLURRED_BUCKET_NAME=BLURRED_BUCKET_NAME
Java
gcloud run deploy pubsub-tutorial --image gcr.io/PROJECT_ID/pubsub --set-env-vars=BLURRED_BUCKET_NAME=BLURRED_BUCKET_NAME --memory 512M
PROJECT_ID は実際の GCP プロジェクト ID に置き換えます。
pubsub
はコンテナ名、pubsub-tutorial
はサービスの名前です。コンテナ イメージは、gcloud のデフォルトの設定で構成したサービスとクラスタにデプロイされることに注意してください。BLURRED_BUCKET_NAME を先ほど作成した Cloud Storage バケットに置き換え、ぼかした画像を受け取って環境変数を設定します。
デプロイが完了するまで待ちます。30 秒ほどかかる場合があります。成功すると、コマンドラインにサービス URL が表示されます。
Cloud Storage からの通知を有効化する
ファイル(オブジェクトと呼ばれます)がアップロードまたは変更されるたびに、Pub/Sub トピックにメッセージを公開するよう Cloud Storage を構成します。以前に作成したトピックに通知を送信して、新しいファイルのアップロードでサービスが起動するようにします。
gsutil notification create -t myRunTopic -f json gs://INPUT_BUCKET_NAME
gsutil コマンドは、Google Cloud CLI の一部としてインストールされます。myRunTopic
は、前のチュートリアルで作成したトピックです。
INPUT_BUCKET_NAME は、バケットの作成時に使用した名前に置き換えます。
ストレージ バケット通知の詳細については、オブジェクトの変更通知をご覧ください。
試してみる
肉食ゾンビの画像など、不適切な画像をアップロードします。
gsutil cp zombie.jpg gs://INPUT_BUCKET_NAME
INPUT_BUCKET_NAME は、以前に画像アップロード用に作成した Cloud Storage バケットです。
サービスログに移動します。
Google Cloud コンソールで Cloud Run for Anthos ページに移動します。
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 for Anthos サービスを削除します。
gcloud run services delete SERVICE-NAME
SERVICE-NAME は、選択したサービス名です。
Google Cloud コンソールから Cloud Run for Anthos のサービスを削除することもできます。
チュートリアルを設定したときに追加した gcloud のデフォルト構成を削除します。
gcloud config unset run/platform gcloud config unset run/cluster gcloud config unset run/cluster_location
プロジェクト構成を削除します。
gcloud config unset project
このチュートリアルで作成した他の Google Cloud リソースを削除します。
- Pub/Sub トピック
myRunTopic
を削除します - Pub/Sub サブスクリプション
myRunSubscription
を削除します - Container Registry から
gcr.io/
PROJECT_ID/pubsub
という名前のコンテナ イメージを削除します - 呼び出し元のサービス アカウント
cloud-run-pubsub-invoker@PROJECT_ID.iam.gserviceaccount.com
を削除します - プレースホルダ
INPUT_BUCKET_NAME
とBLURRED_BUCKET_NAME
用に作成した Cloud Storage バケットを削除します - このチュートリアル用にクラスタを作成した場合は、クラスタを削除します
- Pub/Sub トピック
次のステップ
- Cloud Storage で、Cloud Run for Anthos を使用したデータの永続化の詳細を確認する。
- Cloud Vision API を使用して不適切なコンテンツ以外を検出する方法を学習する。
- Google Cloud に関するリファレンス アーキテクチャ、図、ベスト プラクティスを確認する。Cloud Architecture Center をご覧ください。