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

1. Tổng quan

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

Cloud Run jobs là gì?

Tác vụ Cloud Run chạy một vùng chứa không xử lý các yêu cầu web mà thay vào đó thực thi các tác 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.

Công việc dọn dẹp

Tác vụ dịch vụ dọn dẹp sẽ truy xuất các mục trong trình đơn có trạng thái Thất bại và xoá các mục đó. Khi các mục mới của trình đơn được tạo, hình ảnh sẽ được phân tích bằng Vision API để phát hiện xem đó có phải là một món ăn hay không. Đối với những hình ảnh không vượt qua được bước xác thực này, 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 đó bị xoá bởi quy trình 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ác công việc trên Cloud Run
  • Thực thi các công việc Cloud Run
  • Tạo công việc Cloud Scheduler
  • Xác minh việc thực thi các lệnh

Đ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 Cloud Console và môi trường shell.
  • Bạn nên có kinh nghiệm sử dụng Cloud Run và Cloud Scheduler, 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 đám mây

  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.

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ự mà các API của Google không 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à giá trị duy nhất trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này 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ã nhận dạng được tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Hoặc bạn có thể thử tên người dùng của riêng mình để xem tên đó có dùng được 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ẽ giữ nguyên trong suốt thời gian diễn ra dự án.
  • Để bạn biết, có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 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 thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh phát sinh phí thanh toán ngoài hướng dẫn này, bạn có thể xoá các tài nguyê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í trị giá 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

Trong 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ụ Menu bằng tập lệnh thiết lập cho Cloud Run. Dịch vụ Menu là một vi dịch vụ dựa trên Java được xây dựng bằng khung Quarkus, 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 thời gian chạy cho tác vụ 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 cần thiết.

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ã Cloud Run Job

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.png

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

cd ~/cymbal-eats/cleanup-service

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

Dockerfile

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 có trạng thái thất bại 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 đây 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 truyền bởi lệnh Cloud Run.
  • FAILED_ITEM_AGE – Số phút trước khi mục Thất bại bị xoá.
  • MENU_SERVICE_URL – URL dịch vụ thực đơn của Cymbal Eats.

4. Tạo Cloud Run Job

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 Cloud Run.

Bật API dịch vụ:

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

Đặt 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 một 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

Ví dụ về đầu ra:

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 xét 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ụ Menu 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 Cloud Run.

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

Tạo một công việc Cloud Run để dọn dẹp các mục trong trình đơn không thành công có thời gian tạo hơn 1 phút [do FAILED_ITEM_AGE đặt].

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

Ví dụ về đầu ra:

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 JOBS (CÔNG VIỆC) của Cloud Run trong bảng điều khiển rồi xem xét công việc đã tạo.

Nhấp vào công việc đó và khám phá các thẻ có sẵn: HISTORY (NHẬT KÝ), LOGS (NHẬT KÝ), CONFIGURATION (CẤU HÌNH) và YAML.

b12c8e312de3b66.png

Xác minh rằng các biến môi trường đã được thiết lập bằng cách xem xét phần CONFIGURATION (CẤU HÌNH) của công việc trong bảng điều khiển:

724c2919d05349c8.png

(Không bắt buộc) Nếu muốn thay đổi các biến Failed Item Age (Tuổi của mặt hàng không thành công) hoặc Menu Service URL (URL dịch vụ thực đơn), sau khi tạo tác vụ Cloud Run, bạn có thể sử dụng lệnh update (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 Cloud Run bằng cách chạy lệnh sau:

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

Ví dụ về đầu ra:

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ẻ LOGS để xem xét đầu ra của công việc. Bạn sẽ thấy Tuổi của mặt hàng không thành công và URL 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 Cloud Run

Cloud Scheduler là một trình lập lịch dịch vụ chạy ngầm theo thời gian định trước cấp doanh nghiệp được quản lý hoàn toàn. Dịch vụ này cho phé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 dữ liệu lớn, hoạt động cơ sở hạ tầng đám mây, v.v.

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

export SCHEDULER_SERVICE_ACCOUNT=cleanup-scheduler-job-sa

gcloud iam service-accounts create ${SCHEDULER_SERVICE_ACCOUNT}

Công việc Cloud Scheduler sẽ cần có quyền gọi đến Cloud Run Jobs.

Cấp vai trò Cloud Run Invoker cho tài khoản dịch vụ được dùng trong công việc Cloud Scheduler:

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 lịch biểu để chạy tác vụ dịch vụ dọn dẹp.

Cloud Scheduler 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 lập lịch bằng cách sử dụng loại đích HTTP.

Để minh hoạ, bạn sẽ lên lịch chạy quy trình nà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 xét 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 của dịch vụ dọn dẹp
  • cleanup-service – tên của Cloud Run Job

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

3bc9120df7fc6ed.png

Xem các lựa chọn có trong trình đơn Thao tác.

7945908025dd2f2b.png

6. Kiểm thử Cloud Run Job

Khi sử dụng các điểm cuối của Dịch vụ thực đơn, hãy xem xét 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 có trạng thái Ready.

Thay đổi trạng thái của mục trình đơn 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ón ăn, món ăn đó phải được tạo cách đây 1 phút, theo thông 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 từ 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 công việc.

  1. Từ Cloud Scheduler bằng cách chọn "Force a job run" (Buộc chạy một công việc) trong trình đơn Actions (Hành động).

6c8cbeae6165ba4a.png

  1. Từ Cloud Run Job bằng cách nhấp vào nút "THỰC THI".

229c22288882b5c3.png

  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 phần Cloud Run JOBS, mở thẻ LOGS (NHẬT KÝ) rồi xác minh rằng mục trình đơn đã bị xoá.

50829ae27b135b2d.png

Lọc nhật ký theo từ khoá "deleting" để 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 có trạng thái Ready.

7. Xin chúc mừng!

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

Nội dung đã đề cập:

  • Cách tạo các 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 Cloud Scheduler
  • Cách xác minh việc thực thi các lệnh

Bước tiếp theo:

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

Dọn dẹp

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

Xoá dự án

Cách dễ nhất để không bị tính phí là xoá dự án mà bạn đã tạo cho hướng dẫn này.