Cách lên lịch công việc trên Cloud Run trong phạm vi Kiểm soát dịch vụ VPC

1. Giới thiệu

Tổng quan

Nếu dự án GCP của bạn nằm trong một chu vi VPC SC, bạn sẽ cần thực hiện thêm các bước để thiết lập các công việc định kỳ. Vì Cloud Scheduler không thể trực tiếp kích hoạt các công việc trong phạm vi VPC SC, nên bạn sẽ cần chuyển yêu cầu qua một thành phần khác. Bạn nên sử dụng một dịch vụ Cloud Run làm proxy này.

Kiến trúc này có dạng như sau:

Sơ đồ Cloud Scheduler kích hoạt một dịch vụ Cloud Run thực thi một công việc Cloud Run

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

  • Cách chạy một Công việc Cloud Run theo lịch trong phạm vi SC của VPC
  • Cách tạo một dịch vụ Cloud Run kích hoạt một công việc Cloud Run bằng thư viện ứng dụng Cloud Run
  • Cách định cấu hình Cloud Scheduler để gọi một dịch vụ Cloud Run theo lịch

2. Trước khi bắt đầu

Trước tiên, hãy đảm bảo rằng bạn đã làm theo các bước để thiết lập Cloud Run cho VPC Service Controls.

Tiếp theo, hãy thiết lập các biến môi trường sẽ được dùng trong suốt lớp học lập trình này.

PROJECT_ID=<YOUR_PROJECT_ID>
REGION=<YOUR_REGION>
AR_REPO=sample-job-repo
CLOUD_RUN_SERVICE=job-runner-service
CLOUD_RUN_JOB=sample-job
CLOUD_SCHEDULER=job-scheduler
SERVICE_ACCOUNT="cloud-run-invoker-sa"
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
NETWORK=default
SUBNET=default

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

Lớp học lập trình này sử dụng vùng chứa mẫu cho các công việc trên Cloud Run.

Trước tiên, hãy tạo một kho lưu trữ Artifact Registry cho vùng chứa công việc Cloud Run.

gcloud artifacts repositories create $AR_REPO --repository-format=docker --location=$REGION --description="codelab for Cloud Run jobs on schedule within VPC SC"

Tiếp theo, hãy sao chép vùng chứa mẫu của các công việc Cloud Run vào một Artifact Registry trong dự án được định cấu hình VPC SC. Bạn có thể sử dụng công cụ gcrane để thực hiện việc này bằng cách làm theo hướng dẫn cài đặt. Bạn có thể tìm hiểu thêm về gcrane trong tài liệu về cách sao chép hình ảnh giữa các kho lưu trữ.

gcrane cp us-docker.pkg.dev/cloudrun/container/job:latest $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_JOB:latest

Thứ hai, hãy triển khai công việc Cloud Run tuân thủ VPC Service Controls.

gcloud run jobs create $CLOUD_RUN_JOB --region $REGION \
 --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_JOB:latest \
 --network=$NETWORK \
 --subnet=$SUBNET \
 --vpc-egress=all-traffic

Để biết thêm thông tin về cách tạo các Job, vui lòng làm theo các bước được liệt kê tại đây trong tài liệu về các Job trên Cloud Run.

4. Tạo tài khoản dịch vụ

Cloud Run sẽ dùng tài khoản dịch vụ này để gọi công việc Cloud Run.

Trước tiên, hãy tạo tài khoản dịch vụ bằng cách chạy lệnh sau:

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run to run a Cloud Run job"

Thứ hai, cấp vai trò Cloud Run Invoker và vai trò Cloud Run Viewer cho tài khoản dịch vụ.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/run.invoker

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/run.viewer

5. Tạo dịch vụ Cloud Run

Trong bước này, bạn sẽ triển khai một dịch vụ Cloud Run đóng vai trò là một proxy.

mkdir job-runner-service && cd $_

Tạo một tệp có tên là main.py bằng đoạn mã sau.

import os
from flask import Flask
app = Flask(__name__)

# pip install google-cloud-run
from google.cloud import run_v2

@app.route('/')
def hello():

    client = run_v2.JobsClient()

    # UPDATE TO YOUR JOB NAME, REGION, AND PROJECT ID
    job_name = 'projects/YOUR_PROJECT_ID/locations/YOUR_JOB_REGION/jobs/YOUR_JOB_NAME' 

    print("Triggering job...")
    request = run_v2.RunJobRequest(name=job_name)
    operation = client.run_job(request=request)
    response = operation.result()

    print(response)
    return "Done!"

if __name__ == '__main__':
    app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))

Tạo một tệp có tên là requirements.txt bằng mã sau.

google-cloud-run
flask

Cuối cùng, hãy tạo một Dockerfile.

FROM python:3.9-slim-buster
# for logging purposes
ENV PYTHONUNBUFFERED=True

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY . .

CMD ["python3", "main.py"]

Tiếp theo, hãy tạo vùng chứa bằng các lệnh docker sau. Xin lưu ý rằng bạn có thể gặp khó khăn khi thiết lập các hoạt động triển khai dựa trên nguồn trong môi trường VPC SC. Nếu bạn có quy trình tạo và triển khai hiện có, hãy sử dụng quy trình đó để tạo mã nguồn thành một vùng chứa và triển khai vùng chứa đó dưới dạng một dịch vụ Cloud Run.

docker build -t $CLOUD_RUN_SERVICE .

docker tag $CLOUD_RUN_SERVICE $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_SERVICE

docker push $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_SERVICE

Giờ đây, hãy triển khai dịch vụ Cloud Run tuân thủ VPC Service Controls.

gcloud run deploy $CLOUD_RUN_SERVICE --region $REGION \
 --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_SERVICE \
 --service-account $SERVICE_ACCOUNT_ADDRESS \
 --network=$NETWORK \
 --subnet=$SUBNET \
 --vpc-egress=all-traffic \
 --no-allow-unauthenticated \
 --ingress internal

Lưu URL điểm cuối dịch vụ bằng cách chạy lệnh sau:

SERVICE_URL=$(gcloud run services describe $CLOUD_RUN_SERVICE --region $REGION --format 'value(status.url)')

6. Tạo một công việc Cloud Schedule để kích hoạt dịch vụ

# create the Cloud Scheduler job
gcloud scheduler jobs create http $CLOUD_SCHEDULER \
  --location=$REGION \
  --schedule="0 0 1 * *" \
  --uri=$SERVICE_URL \
  --http-method=GET \
  --oidc-service-account-email=$SERVICE_ACCOUNT_ADDRESS

Sau khi tạo Cloud Scheduler Job, bạn có thể chạy lệnh sau để chạy Cloud Scheduler Job ngay lập tức cho mục đích kiểm thử:

gcloud scheduler jobs run $CLOUD_SCHEDULER --location=$REGION

LƯU Ý:

Bạn có thể cần đợi vài phút để quá trình thực thi công việc hoàn tất. Bạn có thể theo dõi trạng thái của công việc này trên trang Cloud Run Scheduler.

Xác minh rằng công việc Cloud Run đã chạy thành công bằng cách chạy các lệnh sau:

EXECUTION_NAME=$(gcloud run jobs describe $CLOUD_RUN_JOB --region $REGION --format 'value(status.latestCreatedExecution.name)')

gcloud run jobs executions describe $EXECUTION_NAME --region $REGION

và bạn sẽ thấy nội dung tương tự như sau:

✔ Execution sample-job-w6hrj in region us-central1
1 task completed successfully
Elapsed time: 28 seconds

7. Xin chúc mừng!

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

Nội dung đã đề cập

  • Cách chạy một Cloud Run Job theo lịch trong ranh giới SC của VPC
  • Cách tạo một dịch vụ Cloud Run kích hoạt một công việc Cloud Run bằng thư viện ứng dụng Cloud Run
  • Cách định cấu hình Cloud Scheduler để gọi một dịch vụ Cloud Run theo lịch

8. Dọn dẹp

Để tránh bị tính phí ngoài ý muốn (ví dụ: nếu các dịch vụ Cloud Run được gọi nhiều lần hơn mức phân bổ số lần gọi Cloud Run hằng tháng trong bậc miễn phí), bạn có thể xoá các dịch vụ GCP hoặc xoá dự án mà bạn đã tạo ở Bước 2.

Để xoá dịch vụ Cloud Run và tác vụ Cloud Run, hãy truy cập Cloud Console của Cloud Run tại https://console.cloud.google.com/run rồi xoá dịch vụ đó.

Nếu chọn xoá toàn bộ dự án, bạn có thể truy cập vào https://console.cloud.google.com/cloud-resource-manager, chọn dự án bạn đã tạo ở Bước 2 rồi chọn Xoá. Nếu xoá dự án, bạn sẽ cần thay đổi dự án trong Cloud SDK. Bạn có thể xem danh sách tất cả các dự án có sẵn bằng cách chạy gcloud projects list.