วิธีตั้งเวลางาน Cloud Run ภายในขอบเขตการควบคุมบริการ VPC

1. บทนำ

ภาพรวม

หากโปรเจ็กต์ GCP อยู่ภายในขอบเขต VPC SC คุณจะต้องทำตามขั้นตอนเพิ่มเติมเพื่อตั้งค่างานที่กำหนดเวลาไว้ เนื่องจาก Cloud Scheduler ไม่สามารถทริกเกอร์งานภายในขอบเขต VPC SC ได้โดยตรง คุณจึงต้องพร็อกซีคำขอผ่านคอมโพเนนต์อื่น เราขอแนะนำให้ใช้บริการ Cloud Run เป็นพร็อกซีนี้

สถาปัตยกรรมมีลักษณะดังนี้

แผนภาพของ Cloud Scheduler ที่ทริกเกอร์บริการ Cloud Run ซึ่งเรียกใช้งาน Cloud Run Job

สิ่งที่คุณจะได้เรียนรู้

  • วิธีเรียกใช้ Cloud Run Job ตามกำหนดการภายในขอบเขต VPC SC
  • วิธีสร้างบริการ Cloud Run ที่ทริกเกอร์งาน Cloud Run โดยใช้ไลบรารีของไคลเอ็นต์ Cloud Run
  • วิธีกำหนดค่า Cloud Scheduler เพื่อเรียกใช้บริการ Cloud Run ตามกำหนดการ

2. ก่อนเริ่มต้น

ก่อนอื่น ให้ตรวจสอบว่าคุณได้ทำตามขั้นตอนการตั้งค่า Cloud Run สำหรับการควบคุมบริการ VPC แล้ว

จากนั้นตั้งค่าตัวแปรสภาพแวดล้อมที่จะใช้ตลอดทั้ง Codelab นี้

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. สร้างงาน Cloud Run

Codelab นี้ใช้คอนเทนเนอร์ของงาน Cloud Run ตัวอย่าง

ก่อนอื่น ให้สร้างที่เก็บ Artifact Registry สำหรับคอนเทนเนอร์งาน Cloud Run

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

จากนั้นคัดลอกคอนเทนเนอร์ของงาน Cloud Run ตัวอย่างไปยัง Artifact Registry ภายในโปรเจ็กต์ที่กำหนดค่า VPC SC คุณใช้เครื่องมือ gcrane เพื่อดำเนินการนี้ได้โดยทำตามวิธีการติดตั้งเหล่านี้ ดูข้อมูลเพิ่มเติมเกี่ยวกับ gcrane ได้ในเอกสารประกอบสำหรับการคัดลอกอิมเมจระหว่างที่เก็บ

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

ประการที่ 2 ทำให้งาน Cloud Run ที่เป็นไปตามการควบคุมบริการ VPC ใช้งานได้

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับการสร้างงานได้โดยทำตามขั้นตอนที่ระบุไว้ที่นี่ในเอกสารประกอบเกี่ยวกับงาน Cloud Run

4. สร้างบัญชีบริการ

Cloud Run จะใช้บัญชีบริการนี้เพื่อเรียกใช้ Cloud Run Job

ก่อนอื่น ให้สร้างบัญชีบริการโดยเรียกใช้คำสั่งนี้

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

ประการที่ 2 ให้สิทธิ์บทบาทผู้เรียกใช้ Cloud Run และบทบาทผู้ดู Cloud Run แก่บัญชีบริการ

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. สร้างบริการ Cloud Run

ในขั้นตอนนี้ คุณจะติดตั้งใช้งานบริการ Cloud Run ที่ทำหน้าที่เป็นพร็อกซี

mkdir job-runner-service && cd $_

สร้างไฟล์ชื่อ main.py ด้วยโค้ดต่อไปนี้

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)))

สร้างไฟล์ชื่อ requirements.txt ด้วยโค้ดต่อไปนี้

google-cloud-run
flask

สุดท้าย ให้สร้าง 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"]

จากนั้นสร้างคอนเทนเนอร์โดยใช้คำสั่ง Docker ต่อไปนี้ โปรดทราบว่าการติดตั้งใช้งานตามแหล่งที่มาอาจตั้งค่าได้ยากในสภาพแวดล้อม VPC SC หากมีไปป์ไลน์การสร้างและทำให้ใช้งานได้อยู่แล้ว ให้ใช้ไปป์ไลน์นั้นเพื่อสร้างซอร์สโค้ดเป็นคอนเทนเนอร์และทำให้คอนเทนเนอร์ใช้งานได้เป็นบริการ 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

ตอนนี้ให้ทำให้บริการ Cloud Run ที่เป็นไปตามการควบคุมบริการ VPC ใช้งานได้

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

บันทึก URL ของปลายทางบริการโดยเรียกใช้คำสั่งนี้

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

6. สร้างงาน Cloud Scheduler เพื่อทริกเกอร์บริการ

# 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

เมื่อสร้างงาน Cloud Scheduler แล้ว คุณจะเรียกใช้คำสั่งต่อไปนี้เพื่อเรียกใช้งาน Cloud Scheduler ทันทีเพื่อวัตถุประสงค์ในการทดสอบได้

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

หมายเหตุ:

คุณอาจต้องรอ 2-3 นาทีเพื่อให้การดำเนินการของงานเสร็จสมบูรณ์ คุณติดตามสถานะได้ในหน้า Cloud Run Scheduler

ตรวจสอบว่างาน Cloud Run ทำงานสำเร็จโดยเรียกใช้คำสั่งต่อไปนี้

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

และคุณควรเห็นข้อมูลที่มีลักษณะคล้ายด้านล่าง

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

7. ยินดีด้วย

ขอแสดงความยินดีที่ทำ Codelab นี้เสร็จสมบูรณ์

สิ่งที่เราได้พูดถึงไปแล้ว

  • วิธีเรียกใช้ Cloud Run Job ตามกำหนดการภายในขอบเขต VPC SC
  • วิธีสร้างบริการ Cloud Run ที่ทริกเกอร์งาน Cloud Run โดยใช้ไลบรารีของไคลเอ็นต์ Cloud Run
  • วิธีกำหนดค่า Cloud Scheduler เพื่อเรียกใช้บริการ Cloud Run ตามกำหนดการ

8. ล้างข้อมูล

หากต้องการหลีกเลี่ยงการเรียกเก็บเงินโดยไม่ตั้งใจ (เช่น หากมีการเรียกใช้บริการ Cloud Run โดยไม่ตั้งใจมากกว่าจำนวนการเรียกใช้ Cloud Run ที่จัดสรรรายเดือนในระดับฟรี) คุณสามารถลบบริการ GCP หรือลบโปรเจ็กต์ที่สร้างในขั้นตอนที่ 2

หากต้องการลบบริการ Cloud Run และงาน Cloud Run ให้ไปที่ Cloud Run Cloud Console ที่ https://console.cloud.google.com/run แล้วลบบริการ

หากเลือกที่จะลบทั้งโปรเจ็กต์ ให้ไปที่ https://console.cloud.google.com/cloud-resource-manager เลือกโปรเจ็กต์ที่สร้างในขั้นตอนที่ 2 แล้วเลือก "ลบ" หากลบโปรเจ็กต์ คุณจะต้องเปลี่ยนโปรเจ็กต์ใน Cloud SDK คุณดูรายการโปรเจ็กต์ทั้งหมดที่พร้อมใช้งานได้โดยเรียกใช้ gcloud projects list