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 phạm vi của một VPC SC, bạn sẽ cần thực hiện thêm các bước để thiết lập công việc định kỳ. Vì Trình lập lịch biểu trên đám mây 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 cần phải proxy yêu cầu thông qua một thành phần khác. Bạn nên sử dụng dịch vụ Cloud Run làm proxy này.

Cấu trúc sẽ có dạng như sau:

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

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

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

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

Trước tiên, hãy đảm bảo 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 sử dụng trong toàn bộ 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 công việc mẫu trên Cloud Run.

Trước tiên, hãy tạo một kho lưu trữ Cấu phần phần mềm 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 công việc Cloud Run mẫu vào một Cấu phần đăng ký cấu phần phần mềm 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 sau. 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

Tiếp theo, 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ông việc, vui lòng làm theo các bước được liệt kê tại đây trong tài liệu về Công việc trên Cloud Run.

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

Tài khoản dịch vụ này sẽ được Cloud Run sử dụng để gọi công việc trên 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"

Tiếp theo, hãy cấp vai trò Cloud Run Invoker (Trình gọi Cloud Run) và Cloud Run Viewer (Người xem Cloud Run) 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à proxy.

mkdir job-runner-service && cd $_

Tạo một tệp có tên là main.py bằng 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 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 bản triển khai dựa trên nguồn trong môi trường VPC SC. Nếu bạn đã có quy trình xây dựng và triển khai, hãy sử dụng quy trình đó để tạo mã nguồn vào một vùng chứa và triển khai vùng chứa đó dưới dạng 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

Bây giờ, 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 của 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 công việc Lịch biểu trên đám mây để 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 Công việc của Trình lập lịch biểu trên đám mây, bạn có thể chạy lệnh sau để chạy Công việc của Trình lập lịch biểu trên đám mây 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ể phải đợ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 đó trên trang Cloud Run Scheduler.

Xác minh công việc trên 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ội dung đã đề cập

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

8. Dọn dẹp

Để tránh bị tính phí do nhầm lẫn (ví dụ: nếu các dịch vụ Cloud Run vô tình đượ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 cấp 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à công việc Cloud Run, hãy truy cập vào 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 SDK trên đám mây. Bạn có thể xem danh sách tất cả dự án hiện có bằng cách chạy gcloud projects list.