本教學課程示範如何使用 Cloud Run、Cloud Vision API 和 ImageMagick,偵測上傳至 Cloud Storage 值區的令人反感圖片,並進行模糊處理。本教學課程以「搭配使用 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.
-
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 主題、安全推送訂閱項目和初始 Cloud Run 服務,以處理訊息
-
Cloud Build 編輯器 (
roles/cloudbuild.builds.editor
) -
Cloud Run Admin (
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
(斯德哥爾摩)二氧化碳排放量低2
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 改成要用於 Artifact Registry 存放區的 Google Cloud 地區。
設定 Cloud Storage bucket
gcloud
建立 Cloud Storage bucket 以上傳圖片,其中 INPUT_BUCKET_NAME 是全域不重複的 bucket 名稱:
gcloud storage buckets create gs://INPUT_BUCKET_NAME
Cloud Run 服務只會從這個值區讀取資料。
建立第二個 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 值區:一個用於上傳原始圖片,另一個則供 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 輸入值區擷取參照圖片,使用 ImageMagick 轉換圖片並套用模糊效果,然後將結果上傳至輸出值區。
Node.js
Python
Go
Java
將圖片處理作業整合至 Pub/Sub 程式碼範例
如要修改現有服務,納入圖片處理程式碼,請按照下列步驟操作:
為服務新增依附元件,包括 Cloud Vision 和 Cloud Storage 用戶端程式庫:
Node.js
npm install 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。
如要推送程式碼:
建構容器並發布至 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 地區。
使用 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 改成要用於 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 預設值中設定的服務和地區 (Cloud Run)。取代:- 將 PROJECT_ID 替換為您的 Google Cloud 專案 ID
- 將 REPOSITORY 替換為 Artifact Registry 存放區的名稱。
- REGION 改成要用於 Artifact Registry 存放區的 Google Cloud 地區。
- 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 替換為您建立 bucket 時使用的名稱。
如要進一步瞭解儲存空間值區通知,請參閱物件變更通知。
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
清除所用資源
如果您是為了這個教學課程建立新專案,請刪除專案。如果您使用現有專案,並想保留專案,但不要在本教學課程中新增的變更,請刪除為本教學課程建立的資源。
刪除專案
如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。
如要刪除專案:
- 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 是您選擇的服務名稱。
您也可以從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 的參考架構、圖表和最佳做法。 歡迎瀏覽我們的雲端架構中心。