1. Tổng quan
Trong phòng thí nghiệm này, bạn sẽ tìm hiểu cách sử dụng các sự kiện của vùng chứa Cloud Storage và Eventarc để kích hoạt quá trình xử lý sự kiện. Bạn sẽ sử dụng các hàm Cloud Run để phân tích dữ liệu và xử lý hình ảnh. Hàm này sẽ sử dụng Vision API của Google và lưu hình ảnh kết quả trở lại bộ chứa Cloud Storage.

Kiến thức bạn sẽ học được
Cách tạo quy trình xử lý hình ảnh.
- Định cấu hình bộ chứa lưu trữ
- Tạo một hàm Cloud Run để đọc và ghi các đối tượng trong Cloud Storage
- Triển khai trình kích hoạt Eventarc
- Tích hợp Vision API để phát hiện hình ảnh thực phẩm
- Kiểm thử và xác thực giải pháp toàn diện
Điều kiện tiên quyết
- Phòng thí nghiệm này giả định rằng bạn đã quen thuộc với Cloud Console và môi trường shell.
- Kinh nghiệm sử dụng Cloud Storage, các hàm Cloud Run hoặc Vision API trước đây là hữu ích nhưng không bắt buộc.
2. Thiết lập và yêu cầu
Thiết lập dự án trên đám mây
- Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.



- Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự mà các API của Google không sử dụng. Bạn luôn có thể cập nhật thông tin này.
- Mã dự án là giá trị duy nhất trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là
PROJECT_ID). Nếu không thích mã nhận dạng được tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Hoặc bạn có thể thử tên người dùng của riêng mình để xem tên đó có được chấp nhận hay không. Bạn không thể thay đổi tên này sau bước này và tên này sẽ tồn tại trong suốt thời gian của dự án. - Để bạn nắm được thông tin, có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
- Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên Cloud. Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh bị tính phí ngoài phạm vi hướng dẫn này, bạn có thể xoá các tài nguyên đã tạo hoặc xoá dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí trị giá 300 USD.
Kích hoạt Cloud Shell
Kích hoạt Cloud Shell bằng cách nhấp vào biểu tượng ở bên phải thanh tìm kiếm.

Thiết lập môi trường
- Tạo các biến môi trường liên quan đến dự án và tài nguyên bằng cách chạy các lệnh bên dưới trong thiết bị đầu cuối Cloud Shell.
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NAME=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export REGION=us-east1
export UPLOAD_BUCKET_NAME=menu-item-uploads-$PROJECT_ID
export UPLOAD_BUCKET=gs://menu-item-uploads-$PROJECT_ID
export BUCKET_THUMBNAILS=gs://menu-item-thumbnails-$PROJECT_ID
export MENU_SERVICE_NAME=menu-service
export USER_EMAIL=$(gcloud config list account --format "value(core.account)")
- Bật các API cần thiết cho phòng thí nghiệm
gcloud services enable \
vision.googleapis.com \
cloudfunctions.googleapis.com \
pubsub.googleapis.com \
cloudbuild.googleapis.com \
logging.googleapis.com \
eventarc.googleapis.com \
artifactregistry.googleapis.com \
run.googleapis.com \
--quiet
- Sao chép kho lưu trữ
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/cloud-functions
3. Định cấu hình bộ chứa Cloud Storage
Tạo vùng lưu trữ
Tạo bộ chứa Cloud Storage để tải lên và tạo hình thu nhỏ cho quy trình xử lý hình ảnh.
Dùng lệnh gsutil mb và một tên riêng biệt để tạo 2 bộ chứa:
- Thùng tải lên nơi hình ảnh sẽ được tải lên trước
- Thùng chứa hình thu nhỏ để lưu trữ hình ảnh thu nhỏ đã tạo
Tạo một vùng lưu trữ để tải hình ảnh mới lên:
gsutil mb -p $PROJECT_ID -l $REGION $UPLOAD_BUCKET
Ví dụ về đầu ra:
Creating gs://menu-item-uploads-cymbal-eats-8399-3119/...
Tạo một vùng lưu trữ để lưu trữ hình thu nhỏ đã tạo:
gsutil mb -p $PROJECT_ID -l $REGION $BUCKET_THUMBNAILS
Ví dụ về đầu ra:
Creating gs://menu-item-thumbnails-cymbal-eats-8399-3119/...
Cập nhật quyền đối với Nhóm
Cập nhật quyền đối với nhóm lưu trữ để cấp quyền đọc cho người dùng.
Dùng lệnh gsutil iam ch để cấp quyền đọc và ghi các đối tượng trong bộ chứa của bạn:
gsutil iam ch allUsers:objectViewer $UPLOAD_BUCKET
gsutil iam ch allUsers:objectViewer $BUCKET_THUMBNAILS
Kết quả ví dụ
Updated IAM policy for project [cymbal-eats-8399-3119]. [...]
4. Định cấu hình tài khoản dịch vụ
Tạo tài khoản dịch vụ tuỳ chỉnh cho Cloud Functions để xử lý hình thu nhỏ:
export CF_SERVICE_ACCOUNT=thumbnail-service-sa
gcloud iam service-accounts create ${CF_SERVICE_ACCOUNT}
Cấp vai trò artifactregistry.reader để cho phép các thao tác đọc từ Artifact Registry:
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member "serviceAccount:${CF_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
--role "roles/artifactregistry.reader"
Cấp vai trò storage.objectCreator để cho phép lưu trữ hình ảnh đã tạo trong bộ chứa hình thu nhỏ:
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member "serviceAccount:${CF_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
--role "roles/storage.objectCreator"
Cấp vai trò run.invoker để cho phép gọi dịch vụ Cloud Run:
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member "serviceAccount:${CF_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
--role "roles/run.invoker"
Cấp vai trò eventarc.eventReceiver để cho phép nhận sự kiện từ các nhà cung cấp:
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member "serviceAccount:${CF_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
--role "roles/eventarc.eventReceiver"
Cấp vai trò pubsub.publisher cho tài khoản dịch vụ Cloud Storage. Nhờ đó, tài khoản dịch vụ có thể xuất bản các sự kiện khi hình ảnh được tải lên nhóm.
GCS_SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p $PROJECT_NUMBER)
gcloud projects add-iam-policy-binding $PROJECT_NUMBER \
--member "serviceAccount:$GCS_SERVICE_ACCOUNT" \
--role "roles/pubsub.publisher"
5. Tổng quan về chức năng xử lý hình ảnh
Tạo một hàm để tải hình ảnh xuống từ Cloud Storage, đổi kích thước hình ảnh rồi tải hình ảnh đó trở lại Cloud Storage. Hàm này sẽ gọi Vision API để chỉ định nhãn mô tả cho hình ảnh. Hàm này sẽ kiểm tra nhãn nội dung mô tả. Nếu nhãn xác định hình ảnh là "Food" (Thực phẩm), thì một sự kiện sẽ được gửi đến dịch vụ trình đơn để cập nhật hình ảnh và hình thu nhỏ của mục trong trình đơn.

Kích hoạt một hàm
Các hàm Cloud Storage dựa trên thông báo Pub/Sub từ Cloud Storage và hỗ trợ các loại sự kiện tương tự:
Trong phòng thí nghiệm này, bạn sẽ triển khai và kích hoạt một hàm khi một đối tượng được hoàn tất trong Cloud Storage.
Hoàn tất đối tượng
Các sự kiện hoàn tất đối tượng sẽ kích hoạt khi một thao tác "ghi" Đối tượng Cloud Storage được hoàn tất thành công. Cụ thể, điều này có nghĩa là việc tạo một đối tượng mới hoặc ghi đè một đối tượng hiện có sẽ kích hoạt sự kiện này. Thao tác lưu trữ và cập nhật siêu dữ liệu sẽ bị trình kích hoạt này bỏ qua.
6. Tích hợp Cloud Storage
Cloud Storage là một dịch vụ để lưu trữ các đối tượng của bạn trong Google Cloud. Đối tượng là một phần dữ liệu không thể thay đổi, bao gồm một tệp ở định dạng bất kỳ. Bạn lưu trữ các đối tượng trong những vùng chứa gọi là nhóm. Tất cả các vùng lưu trữ đều được liên kết với một dự án và bạn có thể nhóm các dự án của mình vào một tổ chức. Thư viện ứng dụng và API giúp tích hợp với Cloud Storage
Trong phòng thí nghiệm này, bạn sẽ sử dụng thư viện ứng dụng để đọc và ghi các đối tượng vào Cloud Storage.
Cài đặt thư viện ứng dụng
Thư viện ứng dụng đám mây có sẵn bằng nhiều ngôn ngữ lập trình phổ biến. Để bắt đầu sử dụng các thư viện này, bạn phải cài đặt thư viện ứng dụng.
Sử dụng thư viện ứng dụng
Thông tin chi tiết về việc triển khai trên diện rộng phụ thuộc vào ngôn ngữ lập trình. Để sử dụng thư viện ứng dụng trong ứng dụng của bạn, bước đầu tiên là nhập các phần phụ thuộc Cloud Storage. Ví dụ: trong dự án Node.js, các lệnh nhập được thêm vào tệp package.json. Đoạn mã dưới đây cho thấy thông báo về tệp package.json của phòng thí nghiệm này.
package.json
{
"name": "thumbnail-service",
"version": "0.1.0",
"dependencies": {
"@google-cloud/functions-framework": "^3.0.0",
"@google-cloud/storage": "^5.18.2",
"@google-cloud/vision": "^2.4.2",
...
}
}
Đăng ký lệnh gọi lại CloudEvent
Đăng ký một lệnh gọi lại CloudEvent bằng Functions Framework. Lệnh gọi lại này sẽ được Cloud Storage kích hoạt khi một hình ảnh mới được tải lên vùng chứa.
index.js
functions.cloudEvent('process-thumbnails', async (cloudEvent) => {
console.log(`Event ID: ${cloudEvent.id}`);
console.log(`Event Type: ${cloudEvent.type}`);
...
Tạo một đối tượng tham chiếu bộ nhớ
Sau khi nhập thư viện ứng dụng, bạn cần tạo một ứng dụng lưu trữ mới và các vùng chứa mà ứng dụng của bạn sẽ tương tác.
index.js
const storage = new Storage(); const bucket = storage.bucket(file.bucket); const thumbBucket = storage.bucket(process.env.BUCKET_THUMBNAILS);
Tải các đối tượng trong Cloud Storage xuống
index.js
await bucket.file(file.name).download({
destination: originalFile
});
Tải đối tượng lên Cloud Storage
Bạn có thể gửi yêu cầu tải lên đến Cloud Storage theo 3 cách: yêu cầu đơn, có thể tiếp tục hoặc tải lên nhiều phần bằng XML API. Đối với các tệp tải lên có kích thước lớn hơn hoặc các tệp tải lên phát trực tuyến, hãy sử dụng tính năng tải lên tiếp nối. Với API XML, các tệp được tải lên theo từng phần và được hợp nhất thành một đối tượng duy nhất. Đối với các đối tượng nhỏ hơn, hãy sử dụng phương thức tải lên bằng một yêu cầu.
Đoạn mã bên dưới tải một hình ảnh lên bộ nhớ trên đám mây bằng cách sử dụng phương thức tải lên bằng một yêu cầu.
index.js
const thumbnailImage = await thumbBucket.upload(thumbFile);
7. Tích hợp Vision API
Cloud Vision giúp nhà phát triển dễ dàng tích hợp các tính năng sử dụng thị giác máy tính trong ứng dụng, bao gồm gắn nhãn hình ảnh, phát hiện khuôn mặt và điểm mốc, nhận dạng ký tự quang học (OCR) và gắn thẻ nội dung phản cảm.
Cài đặt thư viện ứng dụng
Thư viện ứng dụng đám mây có sẵn bằng nhiều ngôn ngữ lập trình phổ biến. Để bắt đầu sử dụng các thư viện này, bạn phải cài đặt thư viện ứng dụng.
Tạo một ứng dụng chú thích hình ảnh
Để truy cập vào các API của Google bằng SDK ứng dụng chính thức, bạn sẽ tạo một đối tượng dịch vụ dựa trên tài liệu khám phá của API. Tài liệu này mô tả API cho SDK. Bạn sẽ cần tìm nạp khoá này từ dịch vụ khám phá của Vision API bằng thông tin đăng nhập của mình.
index.js
const client = new vision.ImageAnnotatorClient();
Tạo yêu cầu Vision API
Vision API có thể thực hiện tính năng phát hiện trên một tệp hình ảnh bằng cách gửi nội dung của tệp hình ảnh dưới dạng một chuỗi được mã hoá base64 trong nội dung yêu cầu của bạn.
Để tạo yêu cầu bằng cách sử dụng tài nguyên hình ảnh để chú thích hình ảnh của bạn. Yêu cầu gửi đến API này có dạng một đối tượng có danh sách yêu cầu. Mỗi mục trong danh sách này chứa 2 thông tin:
- Dữ liệu hình ảnh được mã hoá base64
- Danh sách các đối tượng bạn muốn chú thích về hình ảnh đó.
index.js
const client = new vision.ImageAnnotatorClient();
const visionRequest = {
image: { source: { imageUri: `gs://${file.bucket}/${file.name}` } },
features: [
{ type: 'LABEL_DETECTION' },
]
};
const visionPromise = client.annotateImage(visionRequest);
8. Triển khai các hàm Cloud Run
Dịch vụ đổi kích thước hình ảnh này là một phần của hệ thống Cymbal Eats lớn hơn. Trong phần này, bạn sẽ chỉ triển khai các thành phần liên quan đến tính năng xử lý hình ảnh. Quy trình cài đặt đầy đủ bao gồm một giao diện người dùng để tải hình ảnh lên và một yêu cầu hạ lưu để lưu trữ siêu dữ liệu thu được. Những chức năng đó không được cài đặt trong phòng thí nghiệm này.
Các thành phần sau đây sẽ được tạo trong quá trình triển khai hàm:
- Hàm Cloud Run
- Trình kích hoạt Eventarc
- Chủ đề và gói thuê bao Pub/Sub
Trong cửa sổ dòng lệnh Cloud Shell, hãy chạy lệnh bên dưới để triển khai các hàm Cloud Run có một nhóm kích hoạt trên menu-item-uploads-$PROJECT_ID:
Để triển khai một hàm Cloud Run trực tiếp lên Cloud Run, trước tiên, bạn sẽ triển khai hàm đó rồi tạo một trình kích hoạt cho hàm.
Triển khai các hàm Cloud Run:
gcloud beta run deploy process-thumbnails \
--source=thumbnail \
--function process-thumbnails \
--region $REGION \
--base-image google-22-full/nodejs20 \
--no-allow-unauthenticated \
--project=$PROJECT_ID \
--service-account="${CF_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
--set-env-vars=BUCKET_THUMBNAILS=$BUCKET_THUMBNAILS,MENU_SERVICE_URL=$MENU_SERVICE_URL \
--max-instances=1 \
--quiet
Ví dụ về đầu ra:
Done. Service [process-thumbnails] revision [process-thumbnails-00001-abc] has been deployed and is serving 100 percent of traffic. Service URL: https://process-thumbnails-000000000.us-east1.run.app
Tạo điều kiện kích hoạt:
gcloud eventarc triggers create process-thumbnails-trigger \
--location=$REGION \
--destination-run-service=process-thumbnails \
--destination-run-region=$REGION \
--event-filters="type=google.cloud.storage.object.v1.finalized" \
--event-filters="bucket=$UPLOAD_BUCKET_NAME" \
--service-account="${CF_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com"
Ví dụ về đầu ra:
Creating trigger [process-thumbnails-trigger] in project [qwiklabs-gcp-02-53f8532696e1], location [us-east1]...done. WARNING: It may take up to 2 minutes for the new trigger to become active.
Nếu quá trình triển khai điều kiện kích hoạt không thành công do vấn đề về quyền, vui lòng đợi các thay đổi về IAM ở bước trước được truyền tải. Thường mất 1-2 phút, sau đó thử triển khai lại.
Ví dụ về lỗi đầu ra:
...If you recently started to use Eventarc, it may take a few minutes before all necessary permissions are propagated to the Service Agent... [...]
Trong bảng điều khiển Cloud, hãy xem xét dịch vụ Cloud Run đã được tạo cho hàm:

Trong bảng điều khiển Cloud, hãy xem xét điều kiện kích hoạt Eventarc đã được tạo cho hàm:

Trong bảng điều khiển Cloud, hãy xem xét Chủ đề và Gói thuê bao Pub/Sub được tạo cho trình kích hoạt Eventarc:


9. Kiểm thử và xác thực giải pháp toàn diện
Tải ảnh mới lên Cloud Storage và theo dõi tiến trình của quy trình khi các hình ảnh được phân tích. Bạn sẽ kiểm thử giải pháp toàn diện bằng cách giám sát nhật ký Cloud Functions.
Tải hình ảnh lên

- Lưu hình ảnh này vào máy cục bộ
- Đổi tên tệp 1.jpg
- Mở bảng điều khiển Cloud Storage
- Nhấp vào nhóm menu-item-uploads-...
- Nhấp vào TẢI TỆP LÊN
- Tải 1.jpg lên vùng lưu trữ
- Trong Cloud Console, hãy chuyển đến Cloud Run
- Nhấp vào process-thumbails
- Nhấp vào thẻ LOGS (NHẬT KÝ)

- Chuyển đến bộ chứa menu-item-thumbnails-$PROJECT_ID Cloud Storage
- Xác minh rằng hình thu nhỏ đã được tạo trong nhóm hình thu nhỏ

Tải hình ảnh không phải thực phẩm lên
Để xác minh rằng hàm hoạt động đúng cách, bạn sẽ tải lên một hình ảnh không chứa đối tượng nào được phân loại là "Thực phẩm".

- Lưu hình ảnh này vào máy cục bộ
- Đổi tên tệp 2.jpg
- Mở bảng điều khiển Cloud Storage
- Nhấp vào nhóm menu-item-uploads-...
- Nhấp vào TẢI LÊN TỆP
- Tải 2.jpg lên bộ chứa lưu trữ
- Trong Cloud Console, hãy chuyển đến Cloud Run
- Nhấp vào process-thumbails
- Nhấp vào thẻ LOGS (NHẬT KÝ)

10. Xin chúc mừng!
Xin chúc mừng, bạn đã hoàn thành bài thực hành!
Bước tiếp theo:
Khám phá các lớp học lập trình khác của Cymbal Eats:
- Kích hoạt quy trình công việc trên đám mây bằng Eventarc
- Kết nối với CloudSQL riêng tư từ Cloud Run
- Kết nối với cơ sở dữ liệu được quản lý toàn diện từ Cloud Run
- Bảo mật ứng dụng phi máy chủ bằng Identity Aware Proxy (IAP)
- Kích hoạt các công việc trên Cloud Run bằng Cloud Scheduler
- Triển khai an toàn lên Cloud Run
- Bảo mật lưu lượng truy cập vào Cloud Run
- Kết nối với AlloyDB riêng tư từ chế độ Tự vận hành của GKE
Dọn dẹp
Để tránh bị tính phí vào tài khoản Google Cloud của bạn cho các tài nguyên được dùng trong hướng dẫn này, hãy xoá dự án chứa các tài nguyên đó hoặc giữ lại dự án rồi xoá từng tài nguyên.
Xoá dự án
Cách dễ nhất để không bị tính phí là xoá dự án mà bạn đã tạo cho hướng dẫn này.