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:

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.