1. Tổng quan
Trong các phòng thí nghiệm trước, bạn đã xây dựng một phiên bản dựa trên sự kiện của ứng dụng Pic-a-daily. Phiên bản này sử dụng Google Cloud Storage để kích hoạt Chức năng đám mây cho dịch vụ Phân tích hình ảnh. GCS đã kích hoạt vùng chứa Cloud Run thông qua Pub/Sub cho dịch vụ Hình thu nhỏ và Eventarc để kích hoạt dịch vụ Image Garbage Collector trên Cloud Run. Ngoài ra còn có dịch vụ Ảnh ghép được kích hoạt trên Cloud Scheduler:
Trong phòng thí nghiệm này, bạn sẽ tạo một phiên bản ứng dụng được sắp xếp. Thay vì nhiều loại sự kiện truyền qua hệ thống, bạn sẽ sử dụng Workflows để sắp xếp và gọi dịch vụ như sau:
Kiến thức bạn sẽ học được
- App Engine
- Cloud Firestore
- Cloud Functions
- Cloud Run
- Quy trình công việc
2. Thiết lập và yêu cầu
Thiết lập môi trường theo tiến độ riêng
- Đăng nhập vào 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.)
Xin lưu ý rằng mã dự án là một tên riêng biệt trong tất cả dự án Google Cloud (tên ở trên đã được sử dụng nên sẽ không phù hợp với bạn!). Lớp này sẽ được đề cập sau trong lớp học lập trình này là PROJECT_ID
.
- Tiếp theo, bạn sẽ cần bật tính năng thanh toán trong Cloud Console để sử dụng tài nguyên của Google Cloud.
Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Hãy nhớ làm theo mọi hướng dẫn trong phần "Dọn dẹp" sẽ tư vấn cho bạn cách tắt tài nguyên để bạn không phải chịu thanh toán ngoài hướng dẫn này. 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 Bảng điều khiển GCP, hãy nhấp vào biểu tượng Cloud Shell ở thanh công cụ trên cùng bên phải:
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:
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 tất cả công việc trong phòng thí nghiệm này chỉ bằng một trình duyệt.
3. Giới thiệu về Quy trình công việc
Bạn có thể sử dụng Quy trình công việc để tạo quy trình làm việc không máy chủ, giúp liên kết một loạt các tác vụ không máy chủ với nhau theo thứ tự do bạn xác định. Bạn có thể kết hợp sức mạnh của các API của Google Cloud, các sản phẩm không máy chủ như Cloud Functions và Cloud Run cũng như các lệnh gọi đến các API bên ngoài để tạo ra các ứng dụng linh hoạt không máy chủ.
Như bạn có thể mong đợi từ một trình điều phối, Luồng công việc cho phép bạn xác định luồng logic kinh doanh bằng một ngôn ngữ định nghĩa quy trình công việc dựa trên YAML/JSON và cung cấp API thực thi quy trình công việc và giao diện người dùng của Workflows để kích hoạt các luồng đó.
Trình điều phối này không chỉ là một trình dàn xếp đơn thuần với các tính năng được tích hợp sẵn và có thể định cấu hình:
- Thử lại và xử lý lỗi linh hoạt giữa các bước để thực thi các bước một cách đáng tin cậy.
- Phân tích cú pháp JSON và truyền biến giữa các bước để tránh mã keo.
- Công thức biểu thức cho các quyết định cho phép thực thi bước có điều kiện.
- Quy trình công việc phụ cho Quy trình công việc theo mô-đun và Quy trình công việc có thể sử dụng lại.
- Việc hỗ trợ các dịch vụ bên ngoài cho phép điều phối các dịch vụ bên ngoài Google Cloud.
- Hỗ trợ xác thực cho Google Cloud và các dịch vụ bên ngoài để thực thi bước bảo mật.
- Các trình kết nối với các dịch vụ của Google Cloud như Pub/Sub, Firestore, Tasks, Secret Manager để dễ dàng tích hợp hơn.
Chưa kể, Workflows là một sản phẩm không máy chủ được quản lý hoàn toàn. Không có máy chủ để định cấu hình hoặc mở rộng quy mô và bạn chỉ phải thanh toán cho những gì bạn sử dụng.
4. Bật API
Trong phòng thí nghiệm này, bạn sẽ kết nối các dịch vụ Cloud Functions và Cloud Run với Workflows. Bạn cũng sẽ dùng App Engine, Cloud Build, Vision API và các dịch vụ khác.
Trong Cloud Shell, hãy đảm bảo bạn đã bật tất cả các dịch vụ cần thiết:
gcloud services enable \ appengine.googleapis.com \ cloudbuild.googleapis.com \ cloudfunctions.googleapis.com \ compute.googleapis.com \ firestore.googleapis.com \ run.googleapis.com \ vision.googleapis.com \ workflows.googleapis.com \
Sau một thời gian, bạn sẽ thấy thao tác hoàn tất thành công:
Operation "operations/acf.5c5ef4f6-f734-455d-b2f0-ee70b5a17322" finished successfully.
5. Lấy mã
Nhận mã nếu bạn chưa truy cập vào các phòng thí nghiệm mã trước đó:
git clone https://github.com/GoogleCloudPlatform/serverless-photosharing-workshop
Bạn sẽ có cấu trúc thư mục sau đây phù hợp với phòng thí nghiệm này:
frontend | workflows | ├── functions ├── |── trigger-workflow ├── |── vision-data-transform ├── services ├── |── collage ├── |── thumbnails ├── workflows.yaml
Sau đây là các thư mục liên quan:
frontend
chứa giao diện người dùng của App Engine mà chúng ta sẽ sử dụng lại trong Phòng thí nghiệm 4.functions
chứa Cloud Functions được tạo cho Quy trình làm việc.services
chứa các dịch vụ Cloud Run đã được sửa đổi cho Quy trình công việc.workflows.yaml
là tệp định nghĩa Quy trình công việc.
6. Khám phá YAML của Workflows
workflows.yaml xác định Quy trình công việc theo một loạt các bước. Hãy xem qua để hiểu rõ hơn.
Ở đầu quy trình làm việc, có một số thông số được chuyển vào. Các hàm này sẽ được truyền vào bởi 2 Cloud Functions kích hoạt Luồng công việc. Chúng ta sẽ tìm hiểu về các hàm này sau nhưng đây là cách mà Quy trình công việc bắt đầu:
Trong YAML, bạn có thể thấy rằng các tham số này được gán cho các biến trong bước init
, chẳng hạn như tên tệp và bộ chứa kích hoạt sự kiện và URL của một số dịch vụ Cloud Functions và Cloud Run mà Workflows sẽ gọi:
main: params: [args] steps: - init: assign: - file: ${args.file} - bucket: ${args.bucket} - gsUri: ${"gs://" + bucket + "/" + file} - projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")} - urls: ${args.urls}
Tiếp theo, Quy trình công việc sẽ kiểm tra loại sự kiện. Có 2 loại sự kiện được hỗ trợ: object.finalize
(được phát khi tệp được lưu vào bộ chứa lưu trữ trên đám mây) và object.delete
(được phát khi tệp bị xoá). Mọi thao tác khác sẽ gây ra trường hợp ngoại lệ không được hỗ trợ đối với sự kiện không được hỗ trợ.
Sau đây là bước trong định nghĩa quy trình công việc YAML, trong đó chúng ta kiểm tra loại sự kiện lưu trữ tệp:
- eventTypeSwitch: switch: - condition: ${args.eventType == "google.storage.object.finalize"} next: imageAnalysisCall - condition: ${args.eventType == "google.storage.object.delete"} next: pictureGarbageCollectionGCS - eventTypeNotSupported: raise: ${"eventType " + args.eventType + " is not supported"} next: end
Hãy lưu ý cách Workflows hỗ trợ các câu lệnh chuyển đổi và xử lý ngoại lệ, với hướng dẫn chuyển đổi và các điều kiện khác nhau, cũng như hướng dẫn nêu trên để đưa ra lỗi khi hệ thống không nhận dạng được sự kiện.
Tiếp theo, hãy tìm hiểu imageAnalysisCall
. Đây là một loạt lệnh gọi từ Workflows để gọi Vision API nhằm phân tích hình ảnh, biến đổi dữ liệu phản hồi của Vision API để sắp xếp nhãn của những sự vật được nhận dạng trong hình, chọn màu sắc chủ đạo, kiểm tra xem hình ảnh có an toàn để hiển thị hay không, sau đó lưu siêu dữ liệu vào Cloud Firestore.
Lưu ý rằng mọi thứ đều được hoàn tất trong Quy trình công việc, ngoại trừ Chức năng chuyển đổi đám mây tầm nhìn (chúng tôi sẽ triển khai sau):
Các bước này sẽ có dạng như sau trong YAML:
- imageAnalysisCall: call: http.post args: url: https://vision.googleapis.com/v1/images:annotate headers: Content-Type: application/json auth: type: OAuth2 body: requests: - image: source: gcsImageUri: ${gsUri} features: - type: LABEL_DETECTION - type: SAFE_SEARCH_DETECTION - type: IMAGE_PROPERTIES result: imageAnalysisResponse - transformImageAnalysisData: call: http.post args: url: ${urls.VISION_DATA_TRANSFORM_URL} auth: type: OIDC body: ${imageAnalysisResponse.body} result: imageMetadata - checkSafety: switch: - condition: ${imageMetadata.body.safe == true} next: storeMetadata next: end - storeMetadata: call: http.request args: url: ${"https://firestore.googleapis.com/v1/projects/" + projectId + "/databases/(default)/documents/pictures/" + file + "?updateMask.fieldPaths=color&updateMask.fieldPaths=labels&updateMask.fieldPaths=created"} auth: type: OAuth2 method: PATCH body: name: ${"projects/" + projectId + "/databases/(default)/documents/pictures/" + file} fields: color: stringValue: ${imageMetadata.body.color} created: timestampValue: ${imageMetadata.body.created} labels: arrayValue: values: ${imageMetadata.body.labels} result: storeMetadataResponse
Sau khi hình ảnh được phân tích, hai bước tiếp theo là tạo hình thu nhỏ của hình ảnh và ảnh ghép các hình ảnh gần đây nhất. Việc này được thực hiện bằng cách triển khai 2 dịch vụ Cloud Run và gọi điện đến các dịch vụ đó từ các bước thumbnailCall
và collageCall
:
Các bước trong YAML:
- thumbnailCall: call: http.post args: url: ${urls.THUMBNAILS_URL} auth: type: OIDC body: gcsImageUri: ${gsUri} result: thumbnailResponse - collageCall: call: http.get args: url: ${urls.COLLAGE_URL} auth: type: OIDC result: collageResponse
Nhánh thực thi này kết thúc bằng cách trả về mã trạng thái từ mỗi dịch vụ trong finalizeCompleted
bước:
- finalizeCompleted: return: imageAnalysis: ${imageAnalysisResponse.code} storeMetadata: ${storeMetadataResponse.code} thumbnail: ${thumbnailResponse.code} collage: ${collageResponse.code}
Nhánh khác của quá trình thực thi là khi một tệp bị xoá khỏi bộ chứa lưu trữ chính, chứa các phiên bản hình ảnh có độ phân giải cao. Trong nhánh này, chúng ta muốn xoá hình thu nhỏ của hình ảnh đó trong bộ chứa chứa các hình thu nhỏ, đồng thời xoá siêu dữ liệu của hình ảnh đó khỏi Firestore. Cả hai đều được thực hiện với lệnh gọi HTTP từ Workflows:
Các bước trong YAML:
- pictureGarbageCollectionGCS: try: call: http.request args: url: ${"https://storage.googleapis.com/storage/v1/b/thumbnails-" + projectId + "/o/" + file} auth: type: OAuth2 method: DELETE result: gcsDeletionResult except: as: e steps: - dummyResultInOutVar: assign: - gcsDeletionResult: code: 200 body: "Workaround for empty body response" - pictureGarbageCollectionFirestore: call: http.request args: url: ${"https://firestore.googleapis.com/v1/projects/" + projectId + "/databases/(default)/documents/pictures/" + file} auth: type: OAuth2 method: DELETE result: firestoreDeletionResult
Nhánh xoá kết thúc bằng cách trả về kết quả / mã từ mỗi bước:
- deleteCompleted: return: gcsDeletion: ${gcsDeletionResult} firestoreDeletion: ${firestoreDeletionResult.code}
Trong các bước sau, chúng ta sẽ tạo tất cả các phần phụ thuộc bên ngoài của Quy trình công việc: nhóm, Hàm đám mây, dịch vụ Cloud Run và cơ sở dữ liệu Firestore.
7. Tạo bộ chứa
Bạn cần 2 nhóm cho hình ảnh: 1 để lưu hình ảnh gốc có độ phân giải cao và 1 để lưu hình thu nhỏ của hình ảnh.
Tạo bộ chứa công khai theo khu vực (trong trường hợp này là ở Châu Âu) với quyền truy cập đồng nhất cho người dùng để tải ảnh lên, bằng cách sử dụng công cụ gsutil
:
export BUCKET_PICTURES=uploaded-pictures-${GOOGLE_CLOUD_PROJECT} gsutil mb -l EU gs://${BUCKET_PICTURES} gsutil uniformbucketlevelaccess set on gs://${BUCKET_PICTURES} gsutil iam ch allUsers:objectViewer gs://${BUCKET_PICTURES}
Tạo một bộ chứa công khai khác theo khu vực cho hình thu nhỏ:
export BUCKET_THUMBNAILS=thumbnails-${GOOGLE_CLOUD_PROJECT} gsutil mb -l EU gs://${BUCKET_THUMBNAILS} gsutil uniformbucketlevelaccess set on gs://${BUCKET_THUMBNAILS} gsutil iam ch allUsers:objectViewer gs://${BUCKET_THUMBNAILS}
Bạn có thể kiểm tra kỹ để đảm bảo các bộ chứa đã được tạo và công khai bằng cách truy cập vào phần Cloud Storage của Cloud Console:
8. Chuyển đổi dữ liệu về tầm nhìn (Chức năng đám mây)
Workflows.yaml bắt đầu bằng init
, eventTypeSwitch
, eventTypeNotSupported
bước. Các công cụ này giúp đảm bảo sự kiện đến từ các bộ chứa được chuyển đến đúng bước.
Đối với sự kiện object.finalize
, bước imageAnalysisCall
thực hiện lệnh gọi đến Vision API để trích xuất siêu dữ liệu của hình ảnh đã tạo. Tất cả các bước sau đều được thực hiện trong Quy trình công việc:
Tiếp theo, chúng ta cần biến đổi dữ liệu được trả về từ Vision API trước khi có thể lưu dữ liệu đó vào Firestore. Cụ thể hơn, chúng tôi cần:
- Liệt kê các nhãn được trả về cho hình ảnh.
- Lấy màu chủ đạo của hình ảnh.
- Xác định xem ảnh có an toàn hay không.
Việc này được thực hiện trong mã của Cloud Function và Workflows chỉ cần gọi hàm này:
Khám phá mã
Hàm đám mây có tên là vision-data-transform
. Bạn có thể kiểm tra mã đầy đủ của tệp trong index.js. Như bạn có thể thấy, mục đích duy nhất của hàm này là thực hiện phép biến đổi JSON thành JSON, để lưu trữ siêu dữ liệu hình ảnh một cách thuận tiện trong Firestore.
Triển khai Cloud Functions
Chuyển đến thư mục:
cd workflows/functions/vision-data-transform/nodejs
Đặt khu vực mà bạn chọn:
export REGION=europe-west1 gcloud config set functions/region ${REGION}
Triển khai hàm bằng:
export SERVICE_NAME=vision-data-transform gcloud functions deploy ${SERVICE_NAME} \ --source=. \ --runtime nodejs10 \ --entry-point=vision_data_transform \ --trigger-http \ --allow-unauthenticated
Sau khi triển khai hàm này, bước transformImageAnalysisData
của Quy trình công việc sẽ có thể gọi hàm này để thực hiện quy trình chuyển đổi dữ liệu của Vision API.
9. Chuẩn bị cơ sở dữ liệu
Tiếp theo trong Quy trình công việc là kiểm tra tính an toàn của hình ảnh từ dữ liệu hình ảnh, sau đó lưu trữ thông tin về hình ảnh do Vision API trả về vào cơ sở dữ liệu Cloud Firestore, một cơ sở dữ liệu tài liệu NoSQL nhanh, được quản lý hoàn toàn, không máy chủ, dựa trên đám mây:
Cả hai đều được thực hiện trong Workflows nhưng bạn cần tạo cơ sở dữ liệu Firestore để tính năng lưu trữ siêu dữ liệu hoạt động.
Trước tiên, hãy tạo một ứng dụng App Engine trong khu vực mà bạn muốn cơ sở dữ liệu Firestore (một yêu cầu đối với Firestore):
export REGION_FIRESTORE=europe-west2 gcloud app create --region=${REGION_FIRESTORE}
Tiếp theo, hãy tạo cơ sở dữ liệu Firestore trong cùng một khu vực:
gcloud firestore databases create --region=${REGION_FIRESTORE}
Các tài liệu sẽ được tạo theo chương trình trong bộ sưu tập của chúng tôi và sẽ chứa 4 trường:
- name (chuỗi): tên tệp của ảnh đã tải lên, cũng là khoá của tài liệu
- nhãn (mảng chuỗi): nhãn của các mục được nhận dạng bằng Vision API
- color (chuỗi): mã màu thập lục phân của màu chủ đạo (ví dụ: #ab12ef)
- Đã tạo (ngày): dấu thời gian khi siêu dữ liệu của hình ảnh này được lưu trữ
- hình thu nhỏ (boolean): một trường tùy chọn sẽ hiển thị và đúng nếu đã được tạo một hình thu nhỏ cho ảnh này
Vì chúng ta sẽ tìm kiếm trong Firestore để tìm những bức ảnh có hình thu nhỏ và sắp xếp theo ngày tạo, chúng ta sẽ cần tạo một chỉ mục tìm kiếm. Bạn có thể tạo chỉ mục bằng lệnh sau:
gcloud firestore indexes composite create --collection-group=pictures \ --field-config field-path=thumbnail,order=descending \ --field-config field-path=created,order=descending
Lưu ý rằng việc tạo chỉ mục có thể mất tối đa 10 phút.
Sau khi tạo chỉ mục, bạn có thể xem chỉ mục đó trong Cloud Console:
Bước storeMetadata
trong quy trình công việc sẽ có thể lưu trữ siêu dữ liệu hình ảnh vào Firestore ngay bây giờ.
10. Dịch vụ hình thu nhỏ (Cloud Run)
Tiếp theo trong chuỗi là tạo hình thu nhỏ của một hình ảnh. Bạn có thể thực hiện việc này trong mã trong dịch vụ Cloud Run và Workflows gọi dịch vụ này ở bước thumbnailCall
:
Khám phá mã
Dịch vụ Cloud Run có tên là thumbnails
. Bạn có thể kiểm tra mã đầy đủ của tệp trong index.js.
Tạo và xuất bản hình ảnh vùng chứa
Cloud Run chạy các vùng chứa, nhưng trước tiên, bạn cần tạo hình ảnh vùng chứa (được xác định trong Dockerfile
). Google Cloud Build có thể được dùng để tạo hình ảnh vùng chứa rồi lưu trữ vào Google Container Registry.
Chuyển đến thư mục:
cd workflows/services/thumbnails/nodejs
Phiên bản:
export SERVICE_SRC=thumbnails export SERVICE_NAME=${SERVICE_SRC}-service gcloud builds submit \ . \ --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME}
Sau vài phút, quá trình tạo sẽ thành công và vùng chứa sẽ được triển khai cho Google Container Registry.
Triển khai lên Cloud Run
Thiết lập một số biến và cấu hình cần thiết:
export BUCKET_THUMBNAILS=thumbnails-${GOOGLE_CLOUD_PROJECT} export REGION=europe-west1 gcloud config set run/region ${REGION} gcloud config set run/platform managed
Triển khai bằng lệnh sau:
gcloud run deploy ${SERVICE_NAME} \ --image gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME} \ --no-allow-unauthenticated \ --memory=1Gi \ --update-env-vars BUCKET_THUMBNAILS=${BUCKET_THUMBNAILS}
Sau khi dịch vụ được triển khai, bước thumbnailCall
trong Quy trình công việc sẽ có thể gọi dịch vụ này.
11. Dịch vụ ảnh ghép (Cloud Run)
Tiếp theo trong chuỗi là tạo ảnh ghép từ các hình ảnh gần đây nhất. Bạn có thể thực hiện việc này trong mã trong dịch vụ Cloud Run và Workflows gọi dịch vụ này ở bước collageCall
:
Khám phá mã
Dịch vụ Cloud Run có tên là collage
. Bạn có thể kiểm tra mã đầy đủ của tệp trong index.js.
Tạo và xuất bản hình ảnh vùng chứa
Cloud Run chạy các vùng chứa, nhưng trước tiên, bạn cần tạo hình ảnh vùng chứa (được xác định trong Dockerfile
). Google Cloud Build có thể được dùng để tạo hình ảnh vùng chứa rồi lưu trữ vào Google Container Registry.
Chuyển đến thư mục:
cd services/collage/nodejs
Phiên bản:
export SERVICE_SRC=collage export SERVICE_NAME=${SERVICE_SRC}-service gcloud builds submit \ . \ --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME}
Sau vài phút, quá trình tạo sẽ thành công và vùng chứa sẽ được triển khai cho Google Container Registry.
Triển khai lên Cloud Run
Thiết lập một số biến và cấu hình cần thiết:
export BUCKET_THUMBNAILS=thumbnails-${GOOGLE_CLOUD_PROJECT} export REGION=europe-west1 gcloud config set run/region ${REGION} gcloud config set run/platform managed
Triển khai:
gcloud run deploy ${SERVICE_NAME} \ --image gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME} \ --no-allow-unauthenticated \ --memory=1Gi \ --update-env-vars BUCKET_THUMBNAILS=${BUCKET_THUMBNAILS}
Sau khi dịch vụ được triển khai, bạn có thể kiểm tra xem cả hai dịch vụ có đang chạy trong phần Cloud Run của Cloud Console hay không và bước collageCall
của Quy trình công việc có thể gọi dịch vụ này:
12. Triển khai quy trình công việc
Chúng tôi đã triển khai tất cả phần phụ thuộc bên ngoài của Workflows. Bạn có thể hoàn thành tất cả các bước còn lại (finalizeCompleted
, pictureGarbageCollectionGCS
, pictureGarbageCollectionFirestore
, deleteCompleted
) bằng chính Quy trình công việc.
Đã đến lúc triển khai Workflows!
Chuyển đến thư mục chứa tệp workflows.yaml
và triển khai tệp đó bằng:
export WORKFLOW_REGION=europe-west4 export WORKFLOW_NAME=picadaily-workflows gcloud workflows deploy ${WORKFLOW_NAME} \ --source=workflows.yaml \ --location=${WORKFLOW_REGION}
Trong vài giây, Quy trình công việc sẽ được triển khai và bạn có thể thấy quy trình này trong phần Quy trình công việc của Cloud Console:
Bạn có thể nhấp vào Quy trình công việc và chỉnh sửa nếu muốn. Trong khi chỉnh sửa, bạn sẽ nhận được bản trình bày trực quan đẹp mắt về Quy trình công việc:
Bạn cũng có thể thực thi Quy trình công việc trên Cloud Console theo cách thủ công bằng các tham số phù hợp. Thay vào đó, chúng ta sẽ tự động thực thi mã này để phản hồi các sự kiện của Cloud Storage trong bước tiếp theo.
13. Kích hoạt quy trình công việc (Chức năng đám mây)
Quy trình công việc đã được triển khai và sẵn sàng. Bây giờ, chúng ta cần kích hoạt Quy trình công việc khi một tệp được tạo hoặc bị xoá trong bộ chứa Cloud Storage. Đây lần lượt là các sự kiện storage.object.finalize
và storage.object.delete
.
Quy trình công việc có API và thư viện ứng dụng để tạo, quản lý và thực thi Quy trình công việc mà bạn có thể dùng. Trong trường hợp này, bạn sẽ sử dụng API Thực thi quy trình công việc và cụ thể hơn là thư viện ứng dụng Node.js để kích hoạt Quy trình công việc.
Bạn sẽ kích hoạt Workflows từ Cloud Function theo dõi các sự kiện Cloud Storage. Vì một Hàm đám mây chỉ có thể theo dõi một loại sự kiện, nên bạn sẽ triển khai hai Hàm đám mây để theo dõi cả các sự kiện tạo và xoá:
Khám phá mã
Hàm đám mây có tên là trigger-workflow
. Bạn có thể kiểm tra mã đầy đủ của tệp trong index.js.
Triển khai Cloud Functions
Chuyển đến thư mục:
cd workflows/functions/trigger-workflow/nodejs
Thiết lập một số biến và cấu hình cần thiết:
export BUCKET_PICTURES=uploaded-pictures-${GOOGLE_CLOUD_PROJECT} export REGION=europe-west1 export WORKFLOW_NAME=picadaily-workflows export WORKFLOW_REGION=europe-west4 export COLLAGE_URL=$(gcloud run services describe collage-service --format 'value(status.url)') export THUMBNAILS_URL=$(gcloud run services describe thumbnails-service --format 'value(status.url)') export VISION_DATA_TRANSFORM_URL=$(gcloud functions describe vision-data-transform --format 'value(httpsTrigger.url)') gcloud config set functions/region ${REGION}
Triển khai hàm phản hồi để hoàn tất các sự kiện:
export SERVICE_NAME=trigger-workflow-on-finalize gcloud functions deploy ${SERVICE_NAME} \ --source=. \ --runtime nodejs10 \ --entry-point=trigger_workflow \ --trigger-resource=${BUCKET_PICTURES} \ --trigger-event=google.storage.object.finalize \ --allow-unauthenticated \ --set-env-vars GOOGLE_CLOUD_PROJECT=${GOOGLE_CLOUD_PROJECT},WORKFLOW_REGION=${WORKFLOW_REGION},WORKFLOW_NAME=${WORKFLOW_NAME},THUMBNAILS_URL=${THUMBNAILS_URL},COLLAGE_URL=${COLLAGE_URL},VISION_DATA_TRANSFORM_URL=${VISION_DATA_TRANSFORM_URL}
Triển khai hàm thứ hai để phản hồi các sự kiện xoá:
export SERVICE_NAME=trigger-workflow-on-delete gcloud functions deploy ${SERVICE_NAME} \ --source=. \ --runtime nodejs10 \ --entry-point=trigger_workflow \ --trigger-resource=${BUCKET_PICTURES} \ --trigger-event=google.storage.object.delete \ --allow-unauthenticated \ --set-env-vars GOOGLE_CLOUD_PROJECT=${GOOGLE_CLOUD_PROJECT},WORKFLOW_REGION=${WORKFLOW_REGION},WORKFLOW_NAME=${WORKFLOW_NAME},THUMBNAILS_URL=${THUMBNAILS_URL},COLLAGE_URL=${COLLAGE_URL},VISION_DATA_TRANSFORM_URL=${VISION_DATA_TRANSFORM_URL}
Khi triển khai xong, bạn có thể xem cả hai chức năng này trong Cloud Console:
14. Giao diện người dùng (App Engine)
Trong bước này, bạn tạo giao diện người dùng web trên Google App Engine từ Pic-a-daily: Lab 4 – Tạo giao diện người dùng web cho phép người dùng tải ảnh lên từ ứng dụng web cũng như duyệt qua các ảnh đã tải lên và hình thu nhỏ của họ.
Bạn có thể tìm hiểu thêm về App Engine và đọc nội dung mô tả mã trong bài viết Pic-a-daily: Lab 4 – Tạo giao diện người dùng web.
Khám phá mã
Ứng dụng App Engine được gọi là frontend
. Bạn có thể kiểm tra mã đầy đủ của tệp trong index.js.
Triển khai cho App Engine
Chuyển đến thư mục:
cd frontend
Đặt khu vực mà bạn chọn, đồng thời thay thế GOOGLE_CLOUD_PROJECT
trong app.yaml bằng mã dự án thực tế của bạn:
export REGION=europe-west1 gcloud config set compute/region ${REGION} sed -i -e "s/GOOGLE_CLOUD_PROJECT/${GOOGLE_CLOUD_PROJECT}/" app.yaml
Triển khai:
gcloud app deploy app.yaml -q
Sau 1 hoặc 2 phút, bạn sẽ được thông báo rằng ứng dụng đang phân phát lưu lượng truy cập:
Beginning deployment of service [default]... ╔════════════════════════════════════════════════════════════╗ ╠═ Uploading 8 files to Google Cloud Storage ═╣ ╚════════════════════════════════════════════════════════════╝ File upload done. Updating service [default]...done. Setting traffic split for service [default]...done. Deployed service [default] to [https://GOOGLE_CLOUD_PROJECT.appspot.com] You can stream logs from the command line by running: $ gcloud app logs tail -s default To view your application in the web browser run: $ gcloud app browse
Bạn cũng có thể truy cập vào phần App Engine của Cloud Console để xem ứng dụng đã được triển khai và khám phá các tính năng của App Engine như tạo phiên bản và phân tách lưu lượng truy cập:
15. Kiểm thử quy trình công việc
Để kiểm thử, hãy truy cập URL mặc định của App Engine cho ứng dụng (https://<YOUR_PROJECT_ID>.appspot.com/
) và bạn sẽ thấy giao diện người dùng đang hoạt động!
Tải ảnh lên. Thao tác này sẽ kích hoạt Quy trình công việc và bạn có thể thấy quá trình thực thi Quy trình công việc ở trạng thái Active
trên Cloud Console:
Sau khi Quy trình công việc hoàn tất, bạn có thể nhấp vào mã thực thi và xem kết quả từ các dịch vụ khác nhau:
Tải thêm 3 ảnh lên. Bạn cũng sẽ thấy hình thu nhỏ và ảnh ghép của hình ảnh trong bộ chứa Cloud Storage và giao diện người dùng App Engine được cập nhật:
16. Dọn dẹp (Không bắt buộc)
Nếu không có ý định giữ lại ứng dụng này, bạn có thể dọn dẹp tài nguyên để tiết kiệm chi phí và trở thành một công dân tốt nói chung về đám mây bằng cách xoá toàn bộ dự án:
gcloud projects delete ${GOOGLE_CLOUD_PROJECT}
17. Xin chúc mừng!
Bạn đã tạo một phiên bản ứng dụng có sự phối hợp và sử dụng Quy trình công việc để sắp xếp và gọi dịch vụ.
Nội dung đã đề cập
- App Engine
- Cloud Firestore
- Cloud Functions
- Cloud Run
- Quy trình công việc