本教程演示了如何使用 Cloud Run for Anthos、Cloud Vision API 和 ImageMagick 检测上传到 Cloud Storage 存储桶的令人反感的图片并对其进行模糊处理。本教程是基于将 Pub/Sub 与 Cloud Run for Anthos 搭配使用教程撰写的。
本教程将介绍如何修改现有示例应用。如果需要,您还可以下载已完成的示例。
目标
- 编写、构建异步数据处理服务并将其部署到 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 中的说明创建新集群。
- 按照将 Pub/Sub 与 Cloud Run for Anthos 搭配使用教程中的说明,设置 Pub/Sub 主题、安全推送订阅和初始 Cloud Run for Anthos 服务来处理消息。
设置 gcloud 默认值
如需为您的 Cloud Run for Anthos 服务配置 gcloud 默认值,请执行以下操作:
设置默认项目:
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 服务仅从此存储桶读取内容。
创建另一个 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
import 语句中添加的新依赖项会通过下一个需要它们的命令自动下载。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 for Anthos。
要开发代码,请执行以下操作:
构建容器并将其发布到 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 映像。无需编写 Dockerfile 或安装 Docker,Jib 便可以优化容器构建。详细了解如何使用 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 存储分区,以设置环境变量。
等待部署完成,这可能需要半分钟左右的时间。 成功完成时,命令行会显示服务网址。
开启来自 Cloud Storage 的通知
配置 Cloud Storage,以便在上传或更改文件(称为对象)时将消息发布到 Pub/Sub 主题。将通知发送到之前创建的主题,以便上传任何新文件都会调用该服务。
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
- 删除 Cloud Storage 存储分区(为占位符
INPUT_BUCKET_NAME
和BLURRED_BUCKET_NAME
而创建) - 如果您为本教程创建了一个集群,请删除集群
- 删除 Pub/Sub 主题
后续步骤
- 详细了解如何通过 Cloud Storage 使用 Cloud Run for Anthos 保留数据
- 了解如何使用 Cloud Vision API 检测露骨内容之外的信息
- 探索有关 Google Cloud 的参考架构、图表、教程和最佳做法。查看我们的 Cloud Architecture Center。