Kích hoạt quá trình xử lý sự kiện từ Cloud Storage bằng Eventarc và Cloud Functions (thế hệ thứ 2)

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 trong nhóm Cloud StorageEventarc để kích hoạt quá trình xử lý sự kiện. Bạn sẽ sử dụng Cloud Functions (thế hệ thứ 2) để 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.

4756e4c218d84e26.pngS

Kiến thức bạn sẽ học được

Cách xây dựng 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 đám mây để đọc và ghi đối tượng trong Cloud Storage
  • Tích hợp Vision API để phát hiện hình ảnh món ăn
  • Triển khai một hàm đám mây
  • Triển khai trình kích hoạt Eventarc
  • Thử nghiệm 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 Bảng điều khiển Cloud và các môi trường shell.
  • Trải nghiệm trước đây về Cloud Storage, Cloud Functions hoặc Vision API rất 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 Cloud

  1. Đăng nhập vào Google Cloud Console rồi tạo dự án mới hoặc sử dụng lại 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.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 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ự không được API của Google sử dụng. Bạn có thể cập nhật thông tin này bất cứ lúc nào.
  • Mã dự án là duy nhất trong 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 bạn không quan tâm đến sản phẩm đó là gì. 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 (mã này thường được xác định là PROJECT_ID). Nếu không thích mã đã tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Ngoài ra, bạn có thể thử phương pháp của riêng mình và xem có được cung cấp hay không. Bạn không thể thay đổi thông tin này sau bước này và thông báo đó sẽ vẫn tồn tại trong thời gian của dự án.
  • Đối với thông tin của bạn, có giá trị thứ ba, Project Number (Số 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 này.
  1. Tiếp theo, bạn sẽ phải bật tính năng thanh toán trong Cloud Console để sử dụng API/tài nguyên trên đám mây. Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Để tắt các tài nguyên nhằm tránh bị tính phí ngoài hướng dẫn này, bạn có thể xoá các tài nguyên bạn đã tạo hoặc xoá toàn bộ 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.

8613854df02635a3.pngS

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

  1. Tạo một 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 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=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 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
  1. Bật các API cần thiết cho phòng thí nghiệm này. (bước cụ thể của Qwiklabs)
gcloud services disable cloudfunctions.googleapis.com
gcloud services enable cloudfunctions.googleapis.com
  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 trong Cloud Storage

Tạo bộ chứa lưu trữ

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

Sử dụng lệnh Googlebot mb và một tên duy nhất để tạo hai nhóm:

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

Tạo 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ỏ được 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 liên quan đến Bộ chứa

Hãy cập nhật quyền về bộ chứa lưu trữ để cấp quyền đọc cho người dùng.

Sử dụng lệnh YT 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 một tài khoản dịch vụ tuỳ chỉnh cho Cloud Function để 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ác thao tá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ừ 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. Việc này sẽ cho phép tài khoản dịch vụ xuất bản các 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ề 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 và tải hình ảnh trở lại Cloud Storage. Hàm này sẽ gọi Vision API để gán nhãn mô tả cho hình ảnh. Hàm sẽ kiểm tra nhãn mô tả. Nếu nhãn nhận dạng hình ảnh là "Đồ ăn" một sự kiện sẽ được gửi đến dịch vụ cung cấp thực đơn để cập nhật hình ảnh và hình thu nhỏ của mục trong thực đơn.

4c3c3b758dba6a9f.png.

Kích hoạt một hàm

Các chức năng của 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 thiện trong Cloud Storage.

Hoàn tất đối tượng

Đối tượng hoàn tất sự kiện sẽ kích hoạt khi lệnh "ghi" của Đối tượng Cloud Storage đã hoàn tất. 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. Trình kích hoạt này bỏ qua các hoạt động lưu trữ và cập nhật siêu dữ liệu.

6. Tích hợp Cloud Storage

Cloud Storage là dịch vụ lưu trữ đối tượng của bạn trong Google Cloud. Đối tượng là một phần dữ liệu bất biến bao gồm một tệp ở định dạng bất kỳ. Bạn lưu trữ các đối tượng trong vùng chứa được gọi 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 tích hợp với Cloud Storage

Trong phòng thí nghiệm này, bạn 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 máy khách trên đám mây được cung cấp bằng nhiều ngôn ngữ lập trình phổ biến. Để bắt đầu sử dụng thư viện, bạn phải cài đặt thư viện ứng dụng.

Sử dụng thư viện ứng dụng

Chi tiết triển khai nói chung 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 của Cloud Storage. Ví dụ: trong dự án Node.js, các mục nhập được thêm vào tệp package.json. Đoạn mã dưới đây hiển thị 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ý lệnh gọi lại CloudEvent bằng Khung chức năng mà Cloud Storage sẽ kích hoạt khi tải một hình ảnh mớ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 các đối tượng 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: tải lên nhiều phần bằng một yêu cầu, có thể tiếp tục 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 kích thước lớn hơn hoặc theo luồng, hãy sử dụng tính năng tải lên tiếp nối. Với XML API, tệp được tải lên theo nhiều phần và tập hợp lại dưới dạng 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 duy nhất.

Đoạn mã dưới đây tải hình ảnh lên bộ nhớ trên đám mây bằng cách sử dụng tính năng tải lên bằng một yêu cầu duy nhất.

index.js

const thumbnailImage = await thumbBucket.upload(thumbFile);

7. Tích hợp Vision API

Cloud Vision giúp các nhà phát triển dễ dàng tích hợp các tính năng phát hiện thị giác vào các ứng dụng, chẳng hạn như gắn nhãn hình ảnh, phát hiện khuôn mặt và mốc, nhận dạng ký tự quang học (OCR) và gắn thẻ cho nội dung phản cảm.

Cài đặt thư viện ứng dụng

Thư viện máy khách trên đám mây được cung cấp bằng nhiều ngôn ngữ lập trình phổ biến. Để bắt đầu sử dụng thư viện, bạn phải cài đặt thư viện ứng dụng.

Tạo ứng dụng chú thích hình ảnh

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

chỉ mục.js

const client = new vision.ImageAnnotatorClient();

Tạo yêu cầu Vision API

Vision API có thể phát hiện tính nă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 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 cho hình ảnh của bạn. Yêu cầu đối với 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 hai bit thông tin:

  • Dữ liệu hình ảnh được mã hoá base64
  • Danh sách các đặc điểm bạn muốn chú thích cho 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 chức năng đám mây

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à yêu cầu truyền xuống để lưu trữ siêu dữ liệu kết quả. Những chức năng đó chưa đượ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:

  • Chức năng đám mây
  • Dịch vụ Cloud Run
  • Trình kích hoạt Eventarc
  • Chủ đề và gói thuê bao Pub/Sub

Trong thiết bị đầu cuối Cloudshell, hãy chạy lệnh bên dưới để triển khai Cloud Function bằng một bộ chứa kích hoạt trên menu-item-uploads-$PROJECT_ID:

gcloud functions deploy process-thumbnails \
  --gen2 \
  --runtime=nodejs16 \
  --source=thumbnail \
  --region=$REGION \
  --project=$PROJECT_ID \
  --entry-point=process-thumbnails \
  --trigger-bucket=$UPLOAD_BUCKET \
  --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

Nếu quá trình triển khai không thành công do vấn đề về quyền đối với bộ chứa lưu trữ tải lên, vui lòng đợi các thay đổi IAM ở bước trước có hiệu lực. Thường sẽ mất 1-2 phút, sau đó thử triển khai lại.

Kết quả ví dụ

Deploying function (may take a while - up to 2 minutes)...done.
[...] 

Trong bảng điều khiển Cloud, hãy xem tài liệu Chức năng đám mây đã tạo:

8148dd29e6757603.pngS

Trong bảng điều khiển Cloud, hãy xem dịch vụ Cloud Run được tạo cho hàm này:

42e970cdd48cae76.png.

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

9441995a5cc62e38.pngs

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

affe089c39ae1465.png

a4c41ede2af300db.png

9. Thử nghiệm 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 phân tích hình ảnh. Bạn sẽ kiểm thử giải pháp toàn diện bằng cách theo dõi nhật ký các chức năng của đám mây.

Tải hình ảnh phù hợp lên

2fdd13b63d6148f4.jpeg

  1. Lưu hình ảnh này vào máy cục bộ của bạn
  2. Đổi tên tệp 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 tệp 1.jpg lên bộ chứa lưu trữ
  7. Trong Cloud Console, hãy chuyển đến phần Cloud Functions
  8. Nhấp vào process-thumbails
  9. Nhấp vào thẻ Nhật ký

7ab4e783e474c90d.png.

  1. Chuyển đến nhóm menu-item-thumbnails-$PROJECT_ID Cloud Storage
  2. Kiểm tra để đảm bảo hình thu nhỏ đã được tạo trong bộ chứa hình thu nhỏ

84d8023782eb3e0c.png.

Tải hình ảnh không phải thức ăn lên

Để xác minh rằng hàm này hoạt động bình thường, bạn sẽ tải lên một hình ảnh không chứa đối tượng sẽ được phân loại là "Đồ ăn" mục.

3226a24251084b28.jpeg

  1. Lưu hình ảnh này vào máy cục bộ của bạn
  2. Đổi tên tệp 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 TỆP LÊN
  6. Tải tệp 2.jpg lên bộ chứa lưu trữ
  7. Trong Cloud Console, hãy chuyển đến phần Cloud Functions
  8. Nhấp vào process-thumbails
  9. Nhấp vào thẻ Nhật ký

421c36c342fceea8.pngS

10. Xin chúc mừng!

Xin chúc mừng, bạn đã hoàn thành phòng thí nghiệm!

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 làm phát sinh chi phí cho các tài nguyên được sử dụng trong hướng dẫn này trong tài khoản Google Cloud của bạn, 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 riêng lẻ.

Xoá dự án

Cách dễ nhất để loại bỏ việc thanh toán là xoá dự án bạn đã tạo cho phần hướng dẫn.