Kích hoạt tính năng Xử lý sự kiện từ Bộ nhớ trên đám mây bằng các hàm Eventarc và Cloud Run

1. Tổng quan

Trong lớp học lập trình này, bạn sẽ tìm hiểu cách sử dụng sự kiện bộ chứa Bộ nhớ trên đám mâyEventarc để 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 API Vision của Google và lưu hình ảnh thu được vào bộ chứa Cloud Storage.

424779013ac38648.png

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 bộ nhớ
  • Tạo hàm Cloud Run để đọc và ghi đối tượng trong Cloud Storage
  • Triển khai trình kích hoạt Eventarc
  • Tích hợp API Vision để 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

  • Lớp học 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 API Vision trước đây sẽ rất hữu ích nhưng không bắt buộc.

2. Cách thiết lập và các yêu cầu

Thiết lập dự án trên Cloud

  1. Đă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.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Tên dự án là tên hiển thị cho người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google sử dụng. Bạn luôn có thể cập nhật thông tin này.
  • Mã dự án là duy nhất trên tất cả các dự án Google Cloud và không thể thay đổi (không thể thay đổi 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ã được tạo, bạn có thể tạo một mã ngẫu nhiên khác. Ngoài ra, bạn có thể thử dùng email của riêng mình để xem có thể sử dụng hay không. Bạn không thể thay đổi thông tin này sau bước này và thông tin này sẽ được giữ nguyên trong suốt thời gian diễn ra dự án.
  • Xin lưu ý rằng có một giá trị thứ ba là Mã dự án mà một số API sử dụng. Tìm hiểu thêm về cả ba giá trị này trong tài liệu.
  1. 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 tham gia lớp học lập trình này sẽ không tốn kém nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh bị tính phí sau khi hoàn tất 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í 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.

b02c63d9c7632ef8.png

Thiết lập môi trường

  1. Tạo dự án và các biến môi trường liên quan đến tài nguyên bằng cách chạy các lệnh bên dưới trong dòng lệnh 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)")
  1. Bật các API cần thiết cho lớp học này
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
  1. 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 bộ chứa bộ nhớ

Tạo các bộ chứa tải lên và hình thu nhỏ trong Cloud Storage cho quy trình xử lý hình ảnh.

Sử dụng lệnh gsutil mb và một tên riêng biệt để tạo hai bộ chứa:

  1. Thùng tải lên nơi hình ảnh sẽ được tải lên trước
  2. Bộ chứa hình thu nhỏ để lưu trữ hình ảnh thu nhỏ được tạo

Tạo một bộ chứa để tải hình ảnh mới lên:

gsutil mb -p $PROJECT_ID -l $REGION $UPLOAD_BUCKET

Kết quả điểm dữ liệu:

Creating gs://menu-item-uploads-cymbal-eats-8399-3119/...

Tạo một bộ chứa để lưu trữ hình thu nhỏ đã tạo:

gsutil mb -p $PROJECT_ID -l $REGION $BUCKET_THUMBNAILS

Kết quả điểm dữ liệu:

Creating gs://menu-item-thumbnails-cymbal-eats-8399-3119/...

Cập nhật quyền đối với bộ chứa

Cập nhật quyền đối với bộ nhớ để cấp quyền đọc cho người dùng.

Sử dụng lệnh gsutil iam ch để cấp quyền đọc và ghi đối tượng trong bộ chứa:

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 Hàm trên đám mây để 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ừ Cấu phần phần mềm:

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. Điều này sẽ cho phép tài khoản dịch vụ phát hành sự kiện khi hình ảnh được tải lên bộ chứa.

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ề hàm 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 và tải hình ảnh đó lên lại Cloud Storage. Hàm này sẽ gọi API Vision để gán nhãn mô tả cho hình ảnh. Hàm này sẽ kiểm tra nhãn mô tả. Nếu nhãn xác định hình ảnh là "Đồ ăn", 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.

4c3c3b758dba6a9f.png

Kích hoạ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 lớp học 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

Sự kiện hoàn tất đối tượng sẽ kích hoạt khi quá trình "ghi" một Đối tượng bộ nhớ trên đám mây hoàn tất thành công. Cụ thể, việc 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. Điều kiện kích hoạt này sẽ bỏ qua các thao tác lưu trữ và cập nhật siêu dữ liệu.

6. Tích hợp Bộ nhớ trên đám mây

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 các vùng chứa có tên là bộ chứa. Tất cả các bộ chứa đề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 trong một tổ chức. Thư viện ứng dụngAPI giúp tích hợp với Cloud Storage

Trong lớp học lập trình này, bạn sẽ sử dụng thư viện ứng dụng để đọc và ghi đố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ề cách triển khai phụ thuộc nhiều vào ngôn ngữ lập trình. Để sử dụng thư viện ứng dụng trong ứng dụng, 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 lớp học 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ý lệnh gọi lại CloudEvent bằng Khung chức năng. Lệnh gọi lại này sẽ được Bộ nhớ trên đám mây kích hoạt khi hình ảnh mới được tải lên bộ chứa.

index.js

functions.cloudEvent('process-thumbnails', async (cloudEvent) => {
    console.log(`Event ID: ${cloudEvent.id}`);
    console.log(`Event Type: ${cloudEvent.type}`);
    ...

Tạo đố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 bộ 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 đối tượng trên 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 Bộ nhớ trên đám mây theo 3 cách: yêu cầu tải lên một lần, tải lên tiếp nối hoặc tải lên nhiều phần bằng API XML. Đối với các tệp tải lên có kích thước lớn hơn hoặc tải lên 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 tập hợp 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 tính năng tải lên theo yêu cầu đơn.

Mã bên dưới sẽ tải hình ảnh lên bộ nhớ trên đám mây bằng cách tải lên theo yêu cầu đơn.

index.js

const thumbnailImage = await thumbBucket.upload(thumbFile);

7. Tích hợp API Vision

Cloud Vision giúp nhà phát triển dễ dàng tích hợp các tính năng phát hiện hình ả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 ứng dụng Image Annotator

Để truy cập vào các API của Google bằng SDK ứng dụng chính thức, bạn 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 cần tìm nạp thông tin này từ dịch vụ khám phá của API Vision bằng thông tin xác thực của mình.

index.js

const client = new vision.ImageAnnotatorClient();

Tạo yêu cầu API Vision

Vision API có thể thực hiện tính năng phát hiện đối tượng trên 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 chuỗi được mã hoá base64 trong phần nội dung của yêu cầu.

Để tạo một yêu cầu bằng cách sử dụng tài nguyên hình ảnh để chú thích hình ảnh. Yêu cầu gửi đến API này có dạng một đối tượng với danh sách yêu cầu. Mỗi mục trong danh sách này chứa hai bit thông tin:

  • Dữ liệu hình ảnh được mã hoá base64
  • Danh sách các đặc điểm mà 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. Quá trình cài đặt đầy đủ kết hợp một giao diện người dùng để tải hình ảnh lên và một yêu cầu hạ nguồn để lưu trữ siêu dữ liệu thu được. Các chức năng đó không được cài đặt trong lớp học 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 cloudshell, hãy chạy lệnh bên dưới để triển khai các hàm Cloud Run có bộ chứa điều kiện kích hoạt trên menu-item-uploads-$PROJECT_ID:

Để triển khai trực tiếp hàm Cloud Run trên Cloud Run, trước tiên, bạn sẽ triển khai hàm đó rồi tạo điều kiện kích hoạt cho hàm đó.

Triển khai các hàm chạy trên đám mây:

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

Kết quả điểm dữ liệu:

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"

Kết quả điểm dữ liệu:

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 việc 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 từ bước trước đó được truyền tải. Thường mất 1-2 phút, sau đó hãy thử triển khai lại.

Ví dụ về kết quả lỗi:

...If you recently started to use Eventarc, it may take a few minutes before all necessary permissions are propagated to the Service Agent...
[...] 

Trong Cloud Console, hãy xem lại dịch vụ Cloud Run được tạo cho hàm:

546c5c951cf0f2f.png

Trong Cloud Console, hãy xem lại điều kiện kích hoạt Eventarc đã được tạo cho hàm:

dec11309016b09ac.png

Trong bảng điều khiển trên đám mây, hãy xem lại Chủ đềGói thuê bao Pub/Sub đã tạo cho điều kiện kích hoạt Eventarc:

affe089c39ae1465.png

a4c41ede2af300db.png

9. Kiểm thử và xác thực giải pháp toàn diện

Tải ảnh mới lên Bộ nhớ trên đám mây và theo dõi tiến trình của quy trình khi 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 theo dõi nhật ký hàm trên đám mây.

Tải hình ảnh lên

ab7b43f876f9c3a9.jpeg

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

fca8e4bafbdf135d.png

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

1b6dee72a1fde681.png

Tải hình ảnh không phải thực phẩm lên

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

c76dd525765f66a6.jpeg

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

18b1e30ee78d3955.png

10. Xin chúc mừng!

Xin chúc mừng, bạn đã hoàn thành lớp học lập trình!

Bước tiếp theo:

Khám phá các lớp học lập trình khác về Cymbal Eats:

Dọn dẹp

Để tránh bị tính phí cho tài khoản Google Cloud của bạn đối với các tài nguyên được sử 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 và xoá từng tài nguyên.

Xoá dự án

Cách dễ nhất để loại bỏ tính năng thanh toán là xoá dự án mà bạn đã tạo cho hướng dẫn này.