VPC सेवा कंट्रोल पेरीमीटर में Cloud Run जॉब को शेड्यूल करने का तरीका

1. परिचय

खास जानकारी

अगर आपका GCP प्रोजेक्ट, वीपीसी एससी के दायरे में है, तो आपको शेड्यूल किए गए जॉब सेट अप करने के लिए अतिरिक्त चरण पूरे करने होंगे. Cloud Scheduler, VPC SC पेरीमीटर में सीधे तौर पर जॉब ट्रिगर नहीं कर सकता. इसलिए, आपको किसी अन्य कॉम्पोनेंट के ज़रिए अनुरोध को प्रॉक्सी करना होगा. हमारा सुझाव है कि इस प्रॉक्सी के तौर पर, Cloud Run सेवा का इस्तेमाल करें.

आर्किटेक्चर ऐसा दिखता है:

Cloud Run सेवा को ट्रिगर करने वाले Cloud Scheduler का डायग्राम. यह सेवा, Cloud Run जॉब को एक्ज़ीक्यूट करती है

आपको क्या सीखने को मिलेगा

  • VPC SC पेरीमीटर में, शेड्यूल के हिसाब से Cloud Run जॉब चलाने का तरीका
  • Cloud Run क्लाइंट लाइब्रेरी का इस्तेमाल करके, Cloud Run सेवा बनाने का तरीका. यह सेवा, Cloud Run जॉब को ट्रिगर करती है
  • शेड्यूल के हिसाब से Cloud Run सेवा को शुरू करने के लिए, Cloud Scheduler को कॉन्फ़िगर करने का तरीका

2. शुरू करने से पहले

सबसे पहले, पक्का करें कि आपने VPC सर्विस कंट्रोल के लिए Cloud Run को सेट अप करने के चरणों का पालन किया हो.

इसके बाद, ऐसे एनवायरमेंट वैरिएबल सेट करें जिनका इस्तेमाल इस कोडलैब में किया जाएगा.

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 जॉब बनाना

इस कोडलैब में, Cloud Run jobs के सैंपल कंटेनर का इस्तेमाल किया गया है.

सबसे पहले, Cloud Run जॉब कंटेनर के लिए Artifact Registry रेपो बनाएं.

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

इसके बाद, Cloud Run jobs के कंटेनर के सैंपल को, वीपीसी एससी कॉन्फ़िगर किए गए प्रोजेक्ट में मौजूद Artifact Registry में कॉपी करें. इसके लिए, gcrane टूल का इस्तेमाल किया जा सकता है. इसके लिए, इंस्टॉल करने के ये निर्देश अपनाएं. एक से ज़्यादा रिपॉज़िटरी के बीच इमेज कॉपी करने से जुड़े दस्तावेज़ में जाकर, gcrane के बारे में ज़्यादा जानें.

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

दूसरा, VPC सर्विस कंट्रोल के साथ काम करने वाला Cloud Run जॉब डिप्लॉय करें.

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 jobs के दस्तावेज़ में दिया गया तरीका अपनाएं.

4. सेवा खाता बनाना

इस सेवा खाते का इस्तेमाल Cloud Run, Cloud Run जॉब को कॉल करने के लिए करेगा.

सबसे पहले, यह कमांड चलाकर सेवा खाता बनाएं:

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

दूसरा, सेवा खाते को Cloud Run Invoker की भूमिका और Cloud Run Viewer की भूमिका असाइन करें.

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"]

इसके बाद, इन डॉकर कमांड का इस्तेमाल करके कंटेनर बनाएं. ध्यान दें कि वीपीसी एससी एनवायरमेंट में, सोर्स के आधार पर डिप्लॉयमेंट सेट अप करना मुश्किल हो सकता है. अगर आपके पास पहले से कोई बिल्ड और डिप्लॉय पाइपलाइन है, तो उसका इस्तेमाल करके सोर्स कोड को कंटेनर में बनाएं. इसके बाद, कंटेनर को 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

अब VPC सर्विस कंट्रोल के साथ काम करने वाली Cloud Run सेवा को डिप्लॉय करें.

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

इस निर्देश को चलाकर, सेवा एंडपॉइंट यूआरएल सेव करें:

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

6. सेवा को ट्रिगर करने के लिए, Cloud Schedule की मदद से कोई जॉब बनाएं

# 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 Job बन जाने के बाद, जांच के लिए इसे तुरंत चलाने के लिए, यह कमांड चलाएं:

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

ध्यान दें:

टास्क पूरा होने में कुछ मिनट लग सकते हैं. 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. बधाई हो!

कोडलैब पूरा करने के लिए बधाई!

हमने क्या-क्या कवर किया है

  • VPC SC पेरीमीटर में, Cloud Run जॉब को शेड्यूल के हिसाब से चलाने का तरीका
  • Cloud Run क्लाइंट लाइब्रेरी का इस्तेमाल करके, Cloud Run सेवा बनाने का तरीका. यह सेवा, Cloud Run जॉब को ट्रिगर करती है
  • शेड्यूल के हिसाब से Cloud Run सेवा को शुरू करने के लिए, Cloud Scheduler को कॉन्फ़िगर करने का तरीका

8. व्यवस्थित करें

अनचाहे शुल्क से बचने के लिए, GCP की सेवाओं को मिटा दें या चरण 2 में बनाए गए प्रोजेक्ट को मिटा दें. उदाहरण के लिए, अगर Cloud Run की सेवाओं को मुफ़्त टियर में, Cloud Run के लिए महीने के तय किए गए कॉल की संख्या से ज़्यादा बार अनजाने में कॉल किया जाता है, तो ऐसा किया जा सकता है.

Cloud Run सेवा और Cloud Run जॉब को मिटाने के लिए, Cloud Run Cloud Console पर जाएं. इसके लिए, https://console.cloud.google.com/run पर जाएं और सेवा को मिटाएं.

अगर आपको पूरा प्रोजेक्ट मिटाना है, तो https://console.cloud.google.com/cloud-resource-manager पर जाएं. इसके बाद, दूसरे चरण में बनाया गया प्रोजेक्ट चुनें और मिटाएं को चुनें. प्रोजेक्ट मिटाने पर, आपको Cloud SDK में प्रोजेक्ट बदलने होंगे. gcloud projects list कमांड चलाकर, सभी उपलब्ध प्रोजेक्ट की सूची देखी जा सकती है.