Xây dựng sự điều phối dựa trên sự kiện bằng Eventarc và Workflows

1. Giới thiệu

cb762f29e9183a3f.png 1c05e3d0c2bd2b45.pngS a03f943ca09ac4c.png

Eventarc giúp bạn dễ dàng kết nối các dịch vụ Cloud Run với các sự kiện từ nhiều nguồn. API này cho phép bạn xây dựng các kiến trúc dựa trên sự kiện, trong đó các dịch vụ vi mô được kết nối và phân phối lỏng lẻo. Dịch vụ này đảm nhận việc nhập, phân phối, bảo mật, uỷ quyền và xử lý lỗi sự kiện cho bạn.

Quy trình công việc là một nền tảng điều phối được quản lý hoàn toàn, thực thi các dịch vụ theo thứ tự mà bạn xác định: một quy trình làm việc. Những quy trình công việc này có thể kết hợp các dịch vụ được lưu trữ trên Cloud Run hoặc Cloud Functions, các dịch vụ của Google Cloud như Cloud Vision AI và BigQuery, cũng như mọi API dựa trên HTTP.

Trong lớp học lập trình này, bạn sẽ xây dựng một cách sắp xếp các vi dịch vụ dựa trên sự kiện để xử lý hình ảnh. Bạn sẽ sử dụng Workflows để sắp xếp thứ tự, dữ liệu đầu vào và đầu ra của 4 quá trình xử lý hình ảnh Cloud Functions. Sau đó, bạn sẽ bật tính năng điều phối để phản hồi các sự kiện của Cloud Storage theo cách kết nối lỏng lẻo với Eventarc.

Cuối cùng, bạn sẽ có một kiến trúc linh hoạt nhưng có cấu trúc không máy chủ để xử lý hình ảnh.

e372ceed8c26c5fb.png

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

  • Tổng quan về Eventarc và Workflows
  • Cách triển khai dịch vụ Cloud Functions
  • Cách điều phối các dịch vụ bằng Workflows
  • Cách dùng Eventarc để Quy trình công việc phản hồi các sự kiện trên Cloud Storage

2. Thiết lập và yêu cầu

Thiết lập môi trường theo tiến độ riêng

  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.

Khởi động Cloud Shell

Mặc dù bạn có thể vận hành Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, bạn sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trong Đám mây.

Trong Google Cloud Console, hãy nhấp vào biểu tượng Cloud Shell ở thanh công cụ trên cùng bên phải:

55efc1aaa7a4d3ad.pngS

Sẽ chỉ mất một chút thời gian để cấp phép và kết nối với môi trường. Sau khi hoàn tất, bạn sẽ thấy như sau:

7ffe5cbb04455448.pngS

Máy ảo này chứa tất cả các công cụ phát triển mà bạn cần. Phiên bản này cung cấp thư mục gốc có dung lượng ổn định 5 GB và chạy trên Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Bạn có thể thực hiện mọi công việc trong lớp học lập trình này trong trình duyệt. Bạn không cần cài đặt gì cả.

Thiết lập gcloud

Trong Cloud Shell, hãy đặt mã dự án và khu vực mà bạn muốn triển khai ứng dụng. Hãy lưu các biến này dưới dạng biến PROJECT_IDREGION. Xem các vị trí của Cloud Functions để biết những khu vực có tính năng này.

PROJECT_ID=your-project-id
gcloud config set project $PROJECT_ID

Lấy mã nguồn

Mã nguồn của ứng dụng này nằm trong thư mục processing-pipelines của kho lưu trữ eventarc-samples.

Sao chép kho lưu trữ:

git clone https://github.com/GoogleCloudPlatform/eventarc-samples.git

Chuyển đến thư mục eventarc-samples/processing-pipelines:

cd eventarc-samples/processing-pipelines

3. Tổng quan về cấu trúc

Cấu trúc của ứng dụng như sau:

6aa6fbc7721dd6b6.png.

  1. Hình ảnh được lưu vào bộ chứa đầu vào tạo ra sự kiện tạo trên Cloud Storage.
  2. Sự kiện tạo Cloud Storage được Eventarc đọc thông qua một điều kiện kích hoạt Cloud Storage và được chuyển đến Workflows dưới dạng CloudEvent.
  3. Trong bước đầu tiên của quy trình làm việc, Filter (Bộ lọc – một dịch vụ Hàm đám mây) sử dụng Vision API để xác định xem hình ảnh có an toàn hay không. Nếu hình ảnh an toàn, Quy trình công việc sẽ tiếp tục thực hiện các bước tiếp theo.
  4. Trong bước thứ hai của quy trình làm việc, Labeler (Trình gắn nhãn) (một dịch vụ chức năng đám mây) trích xuất các nhãn của hình ảnh bằng Vision API và lưu nhãn vào bộ chứa đầu ra.
  5. Trong bước thứ ba, Resizer (một dịch vụ khác của Cloud Function) sẽ đổi kích thước hình ảnh bằng ImageSharp và lưu hình ảnh đã đổi kích thước vào bộ chứa đầu ra.
  6. Trong bước cuối cùng, Watermarker (một dịch vụ khác của Chức năng đám mây) thêm hình mờ của nhãn từ Công cụ gắn nhãn vào hình ảnh đã đổi kích thước bằng ImageSharp và lưu hình ảnh vào bộ chứa đầu ra.

Ứng dụng được kích hoạt bởi một sự kiện trên Cloud Storage, do đó ứng dụng được kích hoạt theo sự kiện. Việc xử lý hình ảnh diễn ra trong một quy trình, do đó đó là sự phối hợp. Cuối cùng, đó là một sự điều phối theo sự kiện nhằm tạo ra một kiến trúc linh hoạt nhưng có cấu trúc không máy chủ để xử lý hình ảnh.

4. Tạo bộ chứa

Tạo một bộ chứa đầu vào để người dùng tải hình ảnh lên và một bộ chứa đầu ra cho quy trình xử lý hình ảnh nhằm lưu hình ảnh đã xử lý.

Chạy lệnh sau trong Cloud Shell:

REGION=us-central1
BUCKET1=$PROJECT_ID-images-input
BUCKET2=$PROJECT_ID-images-output

gsutil mb -l $REGION gs://$BUCKET1
gsutil mb -l $REGION gs://$BUCKET2

5. Triển khai dịch vụ lọc

Hãy bắt đầu bằng cách triển khai dịch vụ đầu tiên. Dịch vụ Cloud Functions này nhận thông tin về nhóm và tệp, xác định xem hình ảnh có an toàn bằng Vision API hay không và trả về kết quả.

Trước tiên, hãy bật các dịch vụ bắt buộc cho Cloud Functions gen2 và Vision API:

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  cloudfunctions.googleapis.com \
  run.googleapis.com \
  vision.googleapis.com

Bên trong thư mục processing-pipelines cấp cao nhất, hãy triển khai dịch vụ:

SERVICE_NAME=filter

gcloud functions deploy $SERVICE_NAME \
  --gen2 \
  --allow-unauthenticated \
  --runtime dotnet3 \
  --trigger-http \
  --region=$REGION \
  --entry-point Filter.Function \
  --set-build-env-vars GOOGLE_BUILDABLE=image-v3/filter/csharp

Sau khi triển khai hàm, hãy đặt URL dịch vụ trong một biến, sau này chúng ta sẽ cần URL này:

FILTER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')

6. Triển khai dịch vụ gắn nhãn

Dịch vụ Cloud Functions thứ hai nhận thông tin về nhóm và tệp, trích xuất các nhãn của hình ảnh bằng Vision API và lưu các nhãn đó vào bộ chứa đầu ra.

Bên trong thư mục processing-pipelines cấp cao nhất, hãy triển khai dịch vụ:

SERVICE_NAME=labeler

gcloud functions deploy $SERVICE_NAME \
  --gen2 \
  --allow-unauthenticated \
  --runtime dotnet3 \
  --trigger-http \
  --region=$REGION \
  --set-env-vars BUCKET=$BUCKET2 \
  --entry-point Labeler.Function \
  --set-build-env-vars GOOGLE_BUILDABLE=image-v2/labeler/csharp

Sau khi triển khai hàm, hãy đặt URL dịch vụ trong một biến, sau này chúng ta sẽ cần URL này:

LABELER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')

7. Triển khai dịch vụ trình thay đổi kích thước

Dịch vụ Cloud Functions này nhận thông tin về nhóm và tệp, sau đó đổi kích thước hình ảnh bằng ImageSharp rồi lưu hình ảnh vào bộ chứa đầu ra.

Bên trong thư mục processing-pipelines cấp cao nhất, hãy triển khai dịch vụ:

SERVICE_NAME=resizer

gcloud functions deploy $SERVICE_NAME \
  --gen2 \
  --allow-unauthenticated \
  --runtime dotnet3 \
  --trigger-http \
  --region=$REGION \
  --set-env-vars BUCKET=$BUCKET2 \
  --entry-point Resizer.Function \
  --set-build-env-vars GOOGLE_BUILDABLE=image-v2/resizer/csharp \
  --timeout=120s

Lưu ý giá trị timeout là 2 phút để hàm thay đổi kích thước có thêm thời gian xử lý.

Sau khi triển khai hàm, hãy đặt URL dịch vụ trong một biến, sau này chúng ta sẽ cần URL này:

RESIZER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')

8. Triển khai dịch vụ hình mờ

Dịch vụ Cloud Functions này nhận thông tin về bộ chứa, tệp và nhãn, đọc tệp rồi thêm nhãn ở dạng hình mờ vào hình ảnh bằng ImageSharp và lưu hình ảnh vào bộ chứa đầu ra.

Bên trong thư mục processing-pipelines cấp cao nhất, hãy triển khai dịch vụ:

SERVICE_NAME=watermarker

gcloud functions deploy $SERVICE_NAME \
  --gen2 \
  --allow-unauthenticated \
  --runtime dotnet3 \
  --trigger-http \
  --region=$REGION \
  --set-env-vars BUCKET=$BUCKET2 \
  --entry-point Watermarker.Function \
  --set-build-env-vars GOOGLE_BUILDABLE=image-v2/watermarker/csharp

Sau khi triển khai hàm, hãy đặt URL dịch vụ trong một biến, sau này chúng ta sẽ cần URL này:

WATERMARKER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')

Tại thời điểm này, tất cả 4 Chức năng đám mây đều cần được triển khai và chạy:

76a218568982c90c.png.

9. Xác định và triển khai quy trình công việc

Sử dụng Luồng công việc để kết hợp các dịch vụ bộ lọc, gắn nhãn, trình thay đổi kích thước và hình mờ vào một quy trình làm việc. Quy trình công việc sẽ phối hợp gọi các dịch vụ này theo thứ tự và với các tham số mà chúng tôi xác định.

Trước tiên, hãy bật các dịch vụ bắt buộc cho Quy trình công việc:

gcloud services enable \
  workflows.googleapis.com \
  workflowexecutions.googleapis.com

Định nghĩa

Quy trình công việc nhận CloudEvent dưới dạng thông số. Mã này sẽ đến từ Eventarc sau khi chúng ta tạo điều kiện kích hoạt. Trong hai bước đầu tiên, Workflows ghi lại sự kiện và trích xuất thông tin nhóm và tệp từ sự kiện:

main:
  params: [event]
  steps:
  - log_event:
      call: sys.log
      args:
          text: ${event}
          severity: INFO
  - extract_bucket_and_file:
      assign:
      - bucket: ${event.data.bucket}
      - file: ${event.data.name}

Trong bước filter, Workflows thực hiện lệnh gọi đến dịch vụ lọc mà chúng ta đã triển khai trước đó. Sau đó, ứng dụng này sẽ ghi nhật ký và kiểm tra mức độ an toàn của tệp:

  - filter:
      call: http.post
      args:
        url: FILTER_URL # TODO: Replace
        auth:
          type: OIDC
        body:
            bucket: ${bucket}
            file: ${file}
      result: filterResponse
  - log_safety:
      call: sys.log
      args:
          text: ${filterResponse.body.safe}
          severity: INFO
  - check_safety:
      switch:
        - condition: ${filterResponse.body.safe == true}
          next: label
      next: end

Trong bước label, Workflows thực hiện lệnh gọi đến dịch vụ gắn nhãn và ghi lại phản hồi (3 nhãn hàng đầu):

  - label:
      call: http.post
      args:
        url: LABELER_URL # TODO: Replace
        auth:
          type: OIDC
        body:
            bucket: ${bucket}
            file: ${file}
      result: labelResponse

Trong bước resize, Workflows thực hiện lệnh gọi đến dịch vụ thay đổi kích thước và nhận được phản hồi (bộ chứa và tệp của hình ảnh đã đổi kích thước):

  - resize:
      call: http.post
      args:
        url: RESIZER_URL # TODO: Replace
        auth:
          type: OIDC
        body:
            bucket: ${bucket}
            file: ${file}
      result: resizeResponse

Trong bước watermark, Workflows gọi dịch vụ hình mờ cùng với hình ảnh và nhãn đã đổi kích thước, sau đó ghi lại kết quả (hình ảnh đã đổi kích thước và có hình mờ):

  - watermark:
      call: http.post
      args:
        url: WATERMARKER_URL # TODO: Replace
        auth:
          type: OIDC
        body:
            bucket: ${resizeResponse.body.bucket}
            file: ${resizeResponse.body.file}
            labels: ${labelResponse.body.labels}
      result: watermarkResponse

Trong bước final, Quy trình công việc sẽ trả về mã trạng thái HTTP từ các dịch vụ gắn nhãn, thay đổi kích thước và hình mờ:

  - final:
      return:
        label: ${labelResponse.code}
        resize: ${resizeResponse.code}
        watermark: ${watermarkResponse.code}

Triển khai

Trước khi triển khai quy trình công việc, hãy nhớ thay thế URL dịch vụ bằng URL của các hàm được triển khai theo cách thủ công hoặc sử dụng sed:

Bên trong thư mục processing-pipelines cấp cao nhất, hãy chuyển đến thư mục image-v3 chứa tệp workflows.yaml:

cd image-v3/

Chạy sed để thay thế URL phần giữ chỗ bằng URL thực tế của các dịch vụ đã triển khai:

sed -i -e "s|FILTER_URL|${FILTER_URL}|" workflow.yaml
sed -i -e "s|LABELER_URL|${LABELER_URL}|" workflow.yaml
sed -i -e "s|RESIZER_URL|${RESIZER_URL}|" workflow.yaml
sed -i -e "s|WATERMARKER_URL|${WATERMARKER_URL}|" workflow.yaml

Triển khai quy trình công việc:

WORKFLOW_NAME=image-processing

gcloud workflows deploy $WORKFLOW_NAME \
    --source=workflow.yaml \
    --location=$REGION

Sau vài giây, bạn sẽ thấy quy trình công việc được triển khai trong bảng điều khiển:

92cf4e758bdc3dde.png.

10. Tạo điều kiện kích hoạt

Hiện tại, quy trình đã được triển khai, bước cuối cùng là kết nối quy trình với các sự kiện Cloud Storage bằng trình kích hoạt Eventarc.

Thiết lập một lần

Trước tiên, hãy bật các dịch vụ bắt buộc cho Eventarc:

gcloud services enable \
 eventarc.googleapis.com

Tạo một tài khoản dịch vụ mà bạn sẽ sử dụng trong trình kích hoạt Eventarc.

SERVICE_ACCOUNT=eventarc-trigger-imageproc-sa

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Eventarc trigger image processing service account"

Cấp vai trò workflows.invoker để bạn có thể sử dụng tài khoản dịch vụ nhằm gọi Quy trình công việc từ Eventarc:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --role roles/workflows.invoker \
  --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

Hãy cấp vai trò eventarc.eventReceiver, để người dùng có thể sử dụng tài khoản dịch vụ trong một

Điều kiện kích hoạt Cloud Storage:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --role roles/eventarc.eventReceiver \
  --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

Cấp vai trò pubsub.publisher cho tài khoản dịch vụ Cloud Storage. Điều này là cần thiết cho trình kích hoạt Cloud Storage của Eventarc:

STORAGE_SERVICE_ACCOUNT="$(gsutil kms serviceaccount -p $PROJECT_ID)"

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member serviceAccount:$STORAGE_SERVICE_ACCOUNT \
    --role roles/pubsub.publisher

Tạo

Chạy lệnh sau đây để tạo một điều kiện kích hoạt. Điều kiện kích hoạt này sẽ lọc các sự kiện tạo tệp mới từ bộ chứa Cloud Storage đầu vào và chuyển các sự kiện đó vào quy trình làm việc mà chúng ta đã xác định trước đó:

TRIGGER_NAME=trigger-image-processing

gcloud eventarc triggers create $TRIGGER_NAME \
  --location=$REGION \
  --destination-workflow=$WORKFLOW_NAME \
  --destination-workflow-location=$REGION \
  --event-filters="type=google.cloud.storage.object.v1.finalized" \
  --event-filters="bucket=$BUCKET1" \
  --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

Bạn có thể thấy trình kích hoạt đã được tạo và sẵn sàng trong phần Eventarc của Cloud Console:

14330c4fa2451bc0.png.

11. Kiểm thử quy trình

Quy trình xử lý hình ảnh đã sẵn sàng tiếp nhận các sự kiện từ Cloud Storage. Để kiểm thử quy trình, hãy tải hình ảnh lên bộ chứa đầu vào:

gsutil cp beach.jpg gs://$BUCKET1

Ngay sau khi tải hình ảnh lên, bạn sẽ thấy quá trình thực thi Workflows ở trạng thái đang hoạt động:

36d07cb63c39e7d9.pngS

Sau khoảng 1 phút, bạn sẽ thấy quá trình thực thi thành công. Bạn cũng có thể xem dữ liệu đầu vào và đầu ra của quy trình này:

229200c79d989c25.pngS

Nếu liệt kê nội dung của bộ chứa đầu ra, bạn sẽ thấy hình ảnh được đổi kích thước, hình ảnh đã đổi kích thước và có hình mờ cũng như nhãn của hình ảnh:

gsutil ls gs://$BUCKET2

gs://$PROJECT_ID-images-output/beach-400x400-watermark.jpeg
gs://$PROJECT_ID-images-output/beach-400x400.png
gs://$PROJECT_ID-images-output/beach-labels.txt

Để kiểm tra kỹ, bạn có thể mở hình ảnh đã đổi kích thước và có hình mờ để xem kết quả:

75f3c0019ca842ce.jpeg

12. Xin chúc mừng

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

Nội dung đã đề cập

  • Tổng quan về Eventarc và Workflows
  • Cách triển khai dịch vụ Cloud Functions
  • Cách điều phối các dịch vụ bằng Workflows
  • Cách dùng Eventarc để Quy trình công việc phản hồi các sự kiện trên Cloud Storage