Kích hoạt công việc trong Cloud Run bằng Cloud Scheduler

1. Tổng quan

Trong phòng thí nghiệm này, bạn sẽ tạo một công việc trên Cloud Run và thiết lập công việc Cloud Scheduler. Bạn sẽ triển khai Dịch vụ thực đơn ăn uống của Cymbal bằng cách sử dụng tập lệnh thiết lập. Bạn sẽ tạo một công việc trên Cloud Run để thực hiện lệnh gọi API đến Dịch vụ thực đơn Cymbal Eats. Bạn sẽ thực thi công việc bằng cách sử dụng Google Cloud CLI và thiết lập lịch cho công việc. Bạn sẽ xác minh việc thực thi bằng cách xem lại nhật ký và thực hiện lệnh gọi API đến Dịch vụ trình đơn để xác nhận rằng các mục trong trình đơn đã bị xoá.

Công việc trên Cloud Run là gì?

Công việc trên Cloud Run chạy một vùng chứa không phân phát các yêu cầu web, mà thực thi các nhiệm vụ vận hành hoặc xử lý dữ liệu. Vùng chứa sẽ chạy tác vụ và thoát khi hoàn tất.

Dịch vụ dọn dẹp

Công việc của dịch vụ dọn dẹp sẽ truy xuất các mục trong trình đơn ở trạng thái Không thành công và xoá các mục đó. Khi các mục mới trong thực đơn được tạo, hệ thống sẽ phân tích hình ảnh bằng Vision API để phát hiện xem đó có phải là món ăn hay không. Đối với những hình ảnh không xác thực được, trạng thái của các mục trong trình đơn sẽ được cập nhật thành Không thành công và sau đó sẽ bị xoá bởi công việc dọn dẹp.

d74200f0bd14d350.png

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

Trong phòng thí nghiệm này, bạn sẽ tìm hiểu cách thực hiện những việc sau:

  • Tạo công việc trên Cloud Run
  • Thực thi các công việc trên Cloud Run
  • Tạo công việc trên Cloud Scheduler
  • Xác minh việc thực thi công việc

Đ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 Cloud Run và Cloud Scheduler trước đây 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.

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

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.

eb0157a992f16fa3.png

Từ Cloud Shell, hãy chạy lệnh sau để sao chép mã xử lý ứng dụng từ kho lưu trữ này rồi chuyển đến thư mục chứa dịch vụ trình đơn:

git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service

Triển khai dịch vụ Trình đơn bằng tập lệnh thiết lập cho Cloud Run. Dịch vụ Trình đơn là một dịch vụ vi mô dựa trên Java được xây dựng dựa trên khung Quarkus bằng cách sử dụng cơ sở dữ liệu Cloud SQL Postgres cho phần phụ trợ. Dịch vụ Trình đơn là phần phụ thuộc trong thời gian chạy cho công việc trên Cloud Run mà bạn sẽ tạo trong các bước sau.

./setup.sh

Quá trình triển khai sẽ mất khoảng 10 phút để tạo tất cả các thành phần bắt buộc.

Tiếp tục thực hiện các bước tiếp theo sau khi thực thi lệnh trên.

3. Khám phá mã công việc Cloud Run

Mở một thẻ mới trong Cloud Shell bằng cách nhấp vào biểu tượng dấu cộng.

45f480cd1b9a995.pngS

Chuyển đến thư mục chứa dịch vụ dọn dẹp và xem lại các tệp tạo nên công việc đó:

cd ~/cymbal-eats/cleanup-service

Dịch vụ dọn dẹp trong thư mục này chứa Dockerfile xác định hình ảnh vùng chứa cho công việc dịch vụ dọn dẹp với các phần phụ thuộc bắt buộc(httpie, jq).

Tệp Docker

FROM ubuntu:latest 
RUN apt-get update && apt-get install -y httpie jq && apt-get clean
COPY script.sh /
RUN chmod +x /script.sh
CMD ["/script.sh"]
ENTRYPOINT ["/bin/bash"]

Tập lệnh dọn dẹp thực tế (được liệt kê bên dưới) chứa các lệnh để lấy danh sách các mục trong trình đơn ở trạng thái không thành công và xoá các mục đó bằng cách thực hiện lệnh gọi API đến dịch vụ Trình đơn.

script.sh

echo "FAILED_ITEM_AGE=$FAILED_ITEM_AGE"
echo "MENU_SERVICE_URL=$MENU_SERVICE_URL"
# Failed items older than FAILED_ITEM_AGE in minutes
for id in $(http GET $MENU_SERVICE_URL/menu/failed | jq '[.[] | select(.updateDateTime < ((now - 60 * (env.FAILED_ITEM_AGE | tonumber) )| strftime("%Y-%m-%dT%H:%M:%S.%f")))]'| jq '.[].id'); do
  echo "Deleting Menu Item : $MENU_SERVICE_URL/menu/$id"
  http GET $MENU_SERVICE_URL/menu/$id
  http DELETE $MENU_SERVICE_URL/menu/$id
done

# Processing items older than FAILED_ITEM_AGE in minutes
for id in $(http GET $MENU_SERVICE_URL/menu/processing | jq '[.[] | select(.updateDateTime < ((now - 60 * (env.FAILED_ITEM_AGE | tonumber))| strftime("%Y-%m-%dT%H:%M:%S.%f")))]'| jq '.[].id'); do
  echo "Deleting Menu Item : $MENU_SERVICE_URL/menu/$id"
  http GET $MENU_SERVICE_URL/menu/$id
  http DELETE $MENU_SERVICE_URL/menu/$id
done

Lưu ý những điều sau về tập lệnh:

  • Các biến môi trường FAILED_ITEM_AGEMENU_SERVICE_URL sẽ được thiết lập trong quá trình triển khai và được chuyển qua công việc trong Cloud Run.
  • FAILED_ITEM_AGE – Số phút trước khi mục Không thành công sẽ bị xoá.
  • MENU_SERVICE_URL – URL của dịch vụ Thực đơn đồ ăn Cymbal.

4. Tạo công việc trên Cloud Run

Tiếp theo, bạn sẽ tạo một hình ảnh vùng chứa và xuất bản hình ảnh đó lên Artifact Registry.

Hình ảnh vùng chứa này sẽ được dùng để tạo một công việc trên Cloud Run.

Bật API dịch vụ:

gcloud services enable \
    run.googleapis.com \
    artifactregistry.googleapis.com \
    cloudscheduler.googleapis.com \
    --quiet

Thiết lập các biến môi trường:

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export PROJECT_NAME=$(gcloud projects describe $PROJECT_ID --format='value(name)')
export REGION=us-east1
export MENU_SERVICE_NAME=menu-service

Tạo kho lưu trữ Artifact Registry mới để lưu trữ các hình ảnh docker cho công việc dọn dẹp:

gcloud artifacts repositories create cymbal-eats --repository-format=docker --location=$REGION

Tạo hình ảnh vùng chứa bằng Cloud Build và đẩy hình ảnh đó vào Artifact Registry bằng một lệnh:

gcloud builds submit -t $REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest

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

DURATION: 35S
SOURCE: gs://cymbal-eats-14906-569_cloudbuild/source/1657126400.933586-dc3e91ec85934a55bb6d2f7012611365.tgz
IMAGES: us-east1-docker.pkg.dev/cymbal-eats-14906-569/cymbal-eats/cleanup-service (+1 more)
STATUS: SUCCESS

Sau khi xuất bản xong, hãy chuyển đến Artifact Registry rồi xem lại hình ảnh đã xuất bản:

fb95ae38baa7c543.png

Chuyển về thẻ Cloud Shell thứ hai. Chạy lệnh sau để mô tả dịch vụ Trình đơn và lưu URL vào biến môi trường. Biến môi trường này sẽ được dùng để định cấu hình công việc trên Cloud Run.

MENU_SERVICE_URL=$(gcloud run services describe $MENU_SERVICE_NAME \
 --region=$REGION \
 --format=json | jq \
 --raw-output ".status.url")

Tạo công việc trên Cloud Run để dọn dẹp các mục trong trình đơn không thành công quá 1 phút [do FAILED_ITEM_AGE thiết lập].

gcloud beta run jobs create cleanup-service \
  --image=$REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest \
  --set-env-vars MENU_SERVICE_URL=$MENU_SERVICE_URL \
  --set-env-vars FAILED_ITEM_AGE=1 \
  --region $REGION

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

Creating Cloud Run job [cleanup-service] in project [cymbal-eats] region [us-east1]
OK Creating job... Done.
Done.
Job [cleanup-service] has successfully been created.

Chuyển đến mục CÔNG VIỆC của Cloud Run trong bảng điều khiển và xem xét công việc đã tạo.

Nhấp vào công việc và khám phá các thẻ hiện có: nhật ký, nhật ký, cấu hình và YAML.

b12c8e312de3b66.png

Hãy xác minh rằng các biến môi trường đã được đặt bằng cách xem lại phần CONFIGURATION của công việc trong bảng điều khiển:

724c2919d05349c8.pngS

(Không bắt buộc) Nếu muốn thay đổi các biến URL Độ tuổi của mục không thành công hoặc Dịch vụ trình đơn, sau khi tạo công việc trên Cloud Run, bạn có thể sử dụng lệnh cập nhật:

gcloud beta run jobs update cleanup-service \
  --image=$REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest \
  --set-env-vars MENU_SERVICE_URL=$MENU_SERVICE_URL \
  --set-env-vars FAILED_ITEM_AGE=1 \
  --region $REGION

Để xác thực công việc, hãy thực thi công việc trên Cloud Run bằng cách chạy lệnh sau:

gcloud beta run jobs execute cleanup-service --region=$REGION

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

OK Creating execution... Done.                                   
  OK Provisioning resources...
Done.
Execution [cleanup-service-rlxs4] has successfully started running.

View details about this execution by running:
gcloud beta run jobs executions describe cleanup-service-rlxs4
 

Chuyển sang thẻ NHẬT KÝ để xem kết quả của công việc. Bạn sẽ thấy mục Thời gian của mặt hàng không thành công và URL của dịch vụ thực đơn trong nhật ký.

518cb00036a2561f.png.

5. Thiết lập lịch biểu cho công việc trên Cloud Run

Cloud Scheduler là một trình lập lịch biểu công việc định kỳ cấp doanh nghiệp được quản lý toàn diện. Dịch vụ này giúp bạn lên lịch cho hầu hết mọi công việc, bao gồm cả công việc hàng loạt, công việc liên quan đến dữ liệu lớn, vận hành cơ sở hạ tầng đám mây và nhiều công việc khác.

Một phương pháp bảo mật hay nhất khi làm việc với công việc của Cloud Scheduler là thực thi từng công việc bằng thông tin xác thực riêng biệt. Trong bước này, hãy tạo một Tài khoản dịch vụ để công việc của trình lập lịch dọn dẹp sử dụng.

export SCHEDULER_SERVICE_ACCOUNT=cleanup-scheduler-job-sa

gcloud iam service-accounts create ${SCHEDULER_SERVICE_ACCOUNT}

Công việc của Trình lập lịch biểu Cloud sẽ cần có quyền để gọi đến các Công việc trong Cloud Run.

Cấp vai trò của Cloud Run Invoker cho tài khoản dịch vụ được dùng trong công việc của Trình lập lịch biểu đám mây:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member="serviceAccount:${SCHEDULER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role="roles/run.invoker"

Tiếp theo, bạn sẽ thiết lập một lịch để chạy công việc của dịch vụ dọn dẹp.

Trình lập lịch biểu đám mây hỗ trợ nhiều loại mục tiêu.

  • HTTP
  • Pub/Sub
  • HTTP của App Engine

Bạn sẽ tạo một công việc về trình lập lịch biểu bằng cách sử dụng loại mục tiêu HTTP.

Vì mục đích minh hoạ, bạn sẽ lên lịch chạy 5 phút một lần.

gcloud scheduler jobs create http cleanup-schedule \
    --location $REGION \
    --schedule="*/5 * * * *" \
    --uri="https://$REGION-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/$PROJECT_ID/jobs/cleanup-service:run" \
    --http-method POST \
    --oauth-service-account-email ${SCHEDULER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com

Xem lại tham số uri dùng để gọi Cloud Run Job:

  • REGIONPROJECT_ID – Khu vực Cloud Run và Mã dự án nơi triển khai công việc dịch vụ dọn dẹp
  • cleanup-service – tên của công việc trên Cloud Run

Chuyển đến Cloud Scheduler trong bảng điều khiển để xem lại công việc của trình lập lịch biểu đã tạo:

3bc9120df7fc6ed.png.

Xem các tuỳ chọn có sẵn trong trình đơn Thao tác.

7945908025dd2f2b.png.

6. Kiểm thử công việc chạy trên đám mây

Bằng cách sử dụng điểm cuối của Dịch vụ trình đơn, hãy kiểm tra các mục hiện có trong thực đơn và trạng thái của các mục đó:

curl ${MENU_SERVICE_URL}/menu | jq

Kết quả:

Bạn sẽ thấy 3 mục trong trình đơn ở trạng thái Ready.

Thay đổi trạng thái của mục menu số 1 thành Failed:

curl -X PUT "${MENU_SERVICE_URL}/menu/1" \
  -H 'Content-Type: application/json' \
  -d '{"status": "Failed"}' | jq

Đợi 1 phút. Để xoá mục trong trình đơn, mục đó phải tồn tại 1 phút, như được thiết lập theo tham số FAILED_ITEM_AGE.

Bạn có thể đợi lần chạy theo lịch tiếp theo hoặc buộc thực thi lệnh qua bảng điều khiển.

Có nhiều cách để kích hoạt một công việc, thông qua giao diện người dùng hoặc từ dòng lệnh.

Trong ví dụ này, hãy chạy lệnh trong Cloud Shell(Lựa chọn 3) để kích hoạt lệnh.

  1. Từ Cloud Scheduler (Trình lập lịch biểu đám mây) bằng cách chọn "Force a Job run" (Buộc chạy công việc) từ trình đơn Thao tác.

6c8cbeae6165ba4a.png.

  1. Từ Cloud Run Job bằng cách nhấp vào "EXECUTE" (Thực thi) .

229c22288882b5c3.pngS

  1. Từ Cloud Shell bằng cách chạy lệnh sau:
gcloud beta run jobs execute cleanup-service --region=$REGION

Chuyển đến mục CÔNG VIỆC trên Cloud Run, mở thẻ Nhật ký rồi xác minh rằng mục trong trình đơn đã bị xoá.

50829ae27b135b2d.pngS

Lọc nhật ký cho thao tác "xoá" để tìm nhật ký.

d94fb9e444b1c1b8.png

Sử dụng các điểm cuối của Dịch vụ trình đơn để kiểm tra các mục hiện có trong trình đơn thông qua điểm cuối REST.

curl ${MENU_SERVICE_URL}/menu | jq

Kết quả:

Bạn sẽ thấy 2 mục trong trình đơn ở trạng thái Ready.

7. Xin chúc mừng!

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

Những nội dung chúng ta đã đề cập:

  • Cách tạo công việc trên Cloud Run
  • Cách thực thi các công việc trên Cloud Run
  • Cách tạo công việc trên Cloud Scheduler
  • Cách xác minh việc thực thi công việc

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.