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

1. परिचय

खास जानकारी

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

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

Cloud Scheduler की मदद से, Cloud Run की किसी सेवा को ट्रिगर करने का डायग्राम. यह सेवा, 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 जॉब कंटेनर का इस्तेमाल किया गया है.

सबसे पहले, अपने 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 जॉब कंटेनर को अपने 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

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

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

इसके बाद, यहां दिए गए 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

अब 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 शेड्यूल जॉब बनाना

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

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

ध्यान दें:

जॉब पूरी होने में कुछ मिनट लग सकते हैं. Cloud Run शेड्यूलर पेज पर जाकर, इसकी स्थिति ट्रैक की जा सकती है.

यहां दिए गए निर्देशों को चलाकर, पुष्टि करें कि 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 की सेवाओं को मिटाएं या दूसरे चरण में बनाया गया प्रोजेक्ट मिटाएं. उदाहरण के लिए, अगर Cloud Run की सेवाओं को अनजाने में, मुफ़्त टीयर में Cloud Run के लिए हर महीने तय किए गए इंवोकेशन से ज़्यादा बार इंवोक किया जाता है, तो ऐसा हो सकता है.

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

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