本教學課程示範如何使用 Cloud Run、Cloud Vision API 和 ImageMagick,偵測並模糊處理上傳至 Cloud Storage bucket 的令人反感圖片。本教學課程以「搭配使用 Pub/Sub 與 Cloud Run」教學課程為基礎。
本教學課程會逐步說明如何修改現有的範例應用程式。您也可以視需要下載完成的範例。
目標
- 撰寫、建構非同步資料處理服務,並部署至 Cloud Run。
- 上傳檔案至 Cloud Storage 或建立 Pub/Sub 訊息,即可叫用服務。
- 使用 Cloud Vision API 來偵測暴力或成人內容。
- 使用 ImageMagick 模糊處理令人反感的圖片。
- 上傳食人殭屍圖片,測試這項服務。
費用
在本文件中,您會使用下列 Google Cloud的計費元件:
您可以使用 Pricing Calculator,根據預測用量估算費用。
事前準備
- 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.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify 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.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify 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.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. - 安裝並初始化 gcloud CLI。
- 更新元件:
gcloud components update
- 按照「使用 Pub/Sub 教學課程」的說明,設定 Pub/Sub 主題、安全推送訂閱項目和初始 Cloud Run 服務,以便處理訊息
-
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) -
服務使用情形消費者 (
roles/serviceusage.serviceUsageConsumer) - 儲存空間管理員 (
roles/storage.admin)
必要的角色
如要取得完成本教學課程所需的權限,請要求管理員在專案中授予您下列 IAM 角色:
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
設定 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(大阪)asia-south1(印度孟買)europe-north1(芬蘭)二氧化碳排放量低
europe-north2(斯德哥爾摩)二氧化碳排放量低
europe-southwest1(馬德里)二氧化碳排放量低
europe-west1(比利時)二氧化碳排放量低
europe-west4(荷蘭)二氧化碳排放量低
europe-west8(米蘭)europe-west9(巴黎)二氧化碳排放量低
me-west1(特拉維夫)northamerica-south1(墨西哥)us-central1(愛荷華州)二氧化碳排放量低
us-east1(南卡羅來納州)us-east4(北維吉尼亞州)us-east5(哥倫布)us-south1(達拉斯)二氧化碳排放量低
us-west1(奧勒岡州)二氧化碳排放量低
採用級別 2 定價
africa-south1(約翰尼斯堡)asia-east2(香港)asia-northeast3(韓國首爾)asia-southeast1(新加坡)asia-southeast2(雅加達)asia-south2(印度德里)australia-southeast1(雪梨)australia-southeast2(墨爾本)europe-central2(波蘭華沙)europe-west10(柏林)europe-west12(杜林)europe-west2(英國倫敦)二氧化碳排放量低
europe-west3(德國法蘭克福)europe-west6(瑞士蘇黎世)二氧化碳排放量低
me-central1(杜哈)me-central2(達曼)northamerica-northeast1(蒙特婁)二氧化碳排放量低
northamerica-northeast2(多倫多)二氧化碳排放量低
southamerica-east1(巴西聖保羅)二氧化碳排放量低
southamerica-west1(智利聖地牙哥)二氧化碳排放量低
us-west2(洛杉磯)us-west3(鹽湖城)us-west4(拉斯維加斯)
如果您已建立 Cloud Run 服務,即可在 Google Cloud 控制台的 Cloud Run 資訊主頁中查看地區。
瞭解作業順序
本教學課程的資料流程如下:
- 使用者將圖片上傳至 Cloud Storage bucket。
- Cloud Storage 會將新檔案的相關訊息發布至 Pub/Sub。
- Pub/Sub 會將訊息推送至 Cloud Run 服務。
- Cloud Run 服務會擷取 Pub/Sub 訊息中參照的圖片檔案。
- Cloud Run 服務會使用 Cloud Vision API 分析圖片。
- 如果偵測到暴力或成人內容,Cloud Run 服務會使用 ImageMagick 模糊處理圖片。
- Cloud Run 服務會將模糊處理後的圖片上傳至另一個 Cloud Storage bucket,以供使用。
模糊處理後的圖片如何使用,就留給讀者自行練習。
建立 Artifact Registry 標準存放區
建立 Artifact Registry 標準存放區,用於儲存容器映像檔:
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=REGION
取代:
- REPOSITORY 替換為存放區的專屬名稱。
- REGION,並將 Google Cloud 替換為要用於 Artifact Registry 存放區的區域。
設定 Cloud Storage bucket
gcloud
建立用來上傳圖片的 Cloud Storage bucket,其中 INPUT_BUCKET_NAME 是全域不重複的 bucket 名稱:
gcloud storage buckets create gs://INPUT_BUCKET_NAME
Cloud Run 服務只會從這個 bucket 讀取資料。
建立第二個 Cloud Storage bucket,接收模糊處理的圖片,其中 BLURRED_BUCKET_NAME 是全域不重複的 bucket 名稱:
gcloud storage buckets create gs://BLURRED_BUCKET_NAME
Cloud Run 服務會將模糊處理的圖片上傳至這個 bucket。使用獨立值區可避免處理過的圖片重新觸發服務。
根據預設,Cloud Run 修訂版本會以 Compute Engine 預設服務帳戶的身分執行。
如果您使用的是使用者管理的服務帳戶,請務必指派必要的 IAM 角色,確保該帳戶具備從 INPUT_BUCKET_NAME 讀取的
storage.objects.get權限,以及上傳至 BLURRED_BUCKET_NAME 的storage.objects.create權限。
Terraform
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
建立兩個 Cloud Storage bucket:一個用於上傳原始圖片,另一個則供 Cloud Run 服務上傳模糊處理後的圖片。
如要建立兩個全域不重複的 Cloud Storage bucket,請在現有的 main.tf 檔案中新增下列內容:
根據預設,Cloud Run 修訂版本會以 Compute Engine 預設服務帳戶執行。
如果您使用的是使用者管理的服務帳戶,請務必指派必要的 IAM 角色,確保該帳戶具備從 storage.objects.get 讀取的 google_storage_bucket.imageproc_input 權限,以及上傳至 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 輸入 bucket 擷取參照圖片,使用 ImageMagick 轉換圖片並套用模糊效果,然後將結果上傳至輸出 bucket。
Node.js
Python
Go
Java
將圖片處理功能整合到 Pub/Sub 程式碼範例中
如要修改現有服務以納入圖片處理程式碼,請按照下列步驟操作:
為服務新增依附元件,包括 Cloud Vision 和 Cloud Storage 用戶端程式庫:
Node.js
npm install gm @google-cloud/storage @google-cloud/visionPython
新增必要的用戶端程式庫,讓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。
如要推送程式碼:
建構容器並發布至 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,並將 Google Cloud 替換為要用於 Artifact Registry 存放區的區域。
若成功執行,您會看到包含 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,並將 Google Cloud 替換為要用於 Artifact Registry 存放區的區域。
若成功執行,您會看到包含 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,並將 Google Cloud 替換為要用於 Artifact Registry 存放區的區域。
若成功執行,您會看到包含 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,並將 Google Cloud 替換為要用於 Artifact Registry 存放區的區域。
使用 gcloud 憑證輔助程式授權 Docker 推送至 Artifact Registry。
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,並將 Google Cloud 替換為要用於 Artifact Registry 存放區的區域。
執行下列指令來部署服務,使用與使用 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 預設值中設定的服務和地區 (Cloud Run)。取代:- 將 PROJECT_ID 替換為 Google Cloud 專案 ID
- 將 REPOSITORY 替換為 Artifact Registry 存放區的名稱。
- REGION,並將 Google Cloud 替換為要用於 Artifact Registry 存放區的區域。
- BLURRED_BUCKET_NAME,並將您先前建立的 Cloud Storage bucket 設為環境變數,以接收模糊處理的圖片。
--no-allow-unauthenticated旗標會限制未經驗證的服務存取權。不公開服務可讓您依靠 Cloud Run 的 Pub/Sub 自動整合來驗證要求。如要進一步瞭解如何進行設定,請參閱與 Pub/Sub 整合一節。如要進一步瞭解以 IAM 為基礎的驗證,請參閱「管理存取權」一文。請等待部署完成,這可能需要半分鐘的時間。 成功完成後,指令列會顯示服務網址。
開啟 Cloud Storage 通知
設定 Cloud Storage,在檔案 (稱為物件) 上傳或變更時,將訊息發布至 Pub/Sub 主題。將通知傳送至先前建立的主題,這樣每當有新檔案上傳,就會叫用服務。
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 bucket。
前往服務記錄:
找出
Blurred image: zombie.png訊息。您可以在先前建立的 BLURRED_BUCKET_NAME Cloud Storage bucket 中查看模糊處理的圖片:在 Google Cloud 控制台的「Cloud Storage」頁面中找到 bucket
清除所用資源
為避免系統向您的 Google Cloud 帳戶收取額外費用,請刪除您在本教學課程中部署的所有資源。
刪除專案
如果您是為了這個教學課程建立新專案,請刪除該專案。如果您使用現有專案,並想保留專案,但不要本教學課程新增的變更,請刪除為本教學課程建立的資源。
如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。
刪除專案的方法如下:
- 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 服務。Cloud Run 服務收到要求後才會開始計費。
如要刪除 Cloud Run 服務,請執行下列指令:
gcloud run services delete SERVICE-NAME
將 SERVICE-NAME 改為您的服務名稱。
您也可以從Google Cloud 控制台刪除 Cloud Run 服務。
移除您在教學課程設定期間新增的
gcloud預設區域設定:gcloud config unset run/region移除專案設定:
gcloud config unset project刪除在本教學課程中建立的其他 Google Cloud 資源:
後續步驟
- 進一步瞭解如何使用 Cloud Storage,透過 Cloud Run 持久儲存資料。
- 瞭解如何使用 Cloud Vision API 偵測煽情露骨內容以外的事物。
- 查看 Google Cloud 的參考架構、圖表和最佳做法。 歡迎瀏覽我們的 Cloud Architecture Center。