इवेंट-ड्रिवन Cloud Run फ़ंक्शन का इस्तेमाल शुरू करना

1. परिचय

खास जानकारी

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

Cloud Run फ़ंक्शन की मदद से, हम Cloud Run सोर्स डिप्लॉय का आसान यूज़र एक्सपीरियंस (यूएक्स) उपलब्ध कराते हैं. इससे डेवलपर को Cloud Run कॉन्फ़िगरेशन का इस्तेमाल करके, अपने वर्कलोड पर पूरा कंट्रोल मिलता है.

इस सेक्शन में, आपको Node में इवेंट-ड्रिवन फ़ंक्शन को डिप्लॉय करने का तरीका बताया जाएगा. आपको एक ऐसा फ़ंक्शन डिप्लॉय करना होगा जो Google Cloud Storage बकेट में किसी ऑब्जेक्ट के फ़ाइनल होने पर ट्रिगर हो.

इस कोडलैब में, नीचे दिए गए उदाहरणों में nodejs के सैंपल का इस्तेमाल किया गया है. हालांकि, Cloud Functions के दूसरे जनरेशन के कोड सैंपल का इस्तेमाल अपनी पसंद की भाषा में किया जा सकता है:

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

  • इवेंट पर आधारित Cloud Run फ़ंक्शन को डिप्लॉय करने का तरीका, जो GCS बकेट में कोई ऑब्जेक्ट अपलोड होने पर ट्रिगर होता है
  • Cloud Storage से इवेंट पाने और Cloud Run फ़ंक्शन को शुरू करने के लिए, सही भूमिकाओं वाला सेवा खाता बनाने का तरीका

2. एनवायरमेंट वैरिएबल सेट अप करना और एपीआई चालू करना

gcloud सीएलआई को अपडेट करना

इस कोडलैब के लिए, gcloud CLI का नया वर्शन इंस्टॉल होना ज़रूरी है. सीएलआई को अपडेट करने के लिए, यह कमांड चलाएं

gcloud components update

एपीआई चालू करें

इस कोडलैब का इस्तेमाल करने से पहले, आपको कई एपीआई चालू करने होंगे. इस कोडलैब के लिए, इन एपीआई का इस्तेमाल करना ज़रूरी है. इन एपीआई को चालू करने के लिए, यह कमांड चलाएं:

gcloud services enable run.googleapis.com \
    cloudbuild.googleapis.com \
    storage.googleapis.com \
    artifactregistry.googleapis.com

एनवायरमेंट वैरिएबल सेट अप करना

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

PROJECT_ID=<YOUR_PROJECT_ID>
REGION=<YOUR_REGION, e.g. us-central1>

gcloud config set project $PROJECT_ID
SERVICE_NAME=crf-event-codelab
BUCKET_NAME=$PROJECT_ID-$SERVICE_NAME
TRIGGER_NAME=$SERVICE_NAME-trigger

3. स्टोरेज बकेट और सेवा खाता बनाना

स्टोरेज बकेट बनाना

Cloud Storage बकेट बनाने के लिए, यह निर्देश चलाएं:

gsutil mb -l us-central1 gs://$BUCKET_NAME

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

इस उदाहरण के लिए, आपको EventArc की ज़रूरी अनुमतियों और Cloud Run invoker की भूमिका वाला एक सेवा खाता बनाना होगा. इससे Cloud Storage से इवेंट मिल पाएगा और Cloud Run फ़ंक्शन को चालू किया जा सकेगा.

सबसे पहले, सेवा खाता बनाएं.

PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')

SERVICE_ACCOUNT="cloud-run-functions"
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run functions Eventarc service account"

इसके बाद, अपने Eventarc ट्रिगर से जुड़े सेवा खाते को प्रोजेक्ट पर Eventarc इवेंट रिसीवर की भूमिका (roles/eventarc.eventReceiver) दें, ताकि ट्रिगर, इवेंट उपलब्ध कराने वाली कंपनियों से इवेंट पा सके.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/eventarc.eventReceiver

इसके बाद, सेवा खाते को Cloud Run invoker की भूमिका असाइन करें, ताकि वह फ़ंक्शन को शुरू कर सके.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/run.invoker

4. फ़ंक्शन बनाना और उसे डिप्लॉय करना

सबसे पहले, सोर्स कोड के लिए एक डायरेक्ट्री बनाएं और उस डायरेक्ट्री में cd करें.

mkdir ../$SERVICE_NAME && cd $_

इसके बाद, यहां दिए गए कॉन्टेंट के साथ package.json फ़ाइल बनाएं:

{
    "dependencies": {
        "@google-cloud/functions-framework": "^3.0.0"
    }
}

इसके बाद, यहां दिए गए कॉन्टेंट के साथ index.js फ़ाइल बनाएं:

const functions = require("@google-cloud/functions-framework");

// Register a CloudEvent callback with the Functions Framework that will
// be triggered by Cloud Storage.
functions.cloudEvent("helloGCS", (cloudEvent) => {
    console.log(`Event ID: ${cloudEvent.id}`);
    console.log(`Event Type: ${cloudEvent.type}`);

    const file = cloudEvent.data;
    console.log(`Bucket: ${file.bucket}`);
    console.log(`File: ${file.name}`);
    console.log(`Metageneration: ${file.metageneration}`);
    console.log(`Created: ${file.timeCreated}`);
    console.log(`Updated: ${file.updated}`);
});

अब Cloud Run फ़ंक्शन को डिप्लॉय किया जा सकता है. इसके लिए, यह कमांड चलाएं:

gcloud beta run deploy $SERVICE_NAME \
 --source . \
      --function helloGCS \
      --region $REGION \
      --no-allow-unauthenticated

कृपया इन बातों का ध्यान रखें:

  • –source फ़्लैग का इस्तेमाल, Cloud Run को यह बताने के लिए किया जाता है कि फ़ंक्शन को कंटेनर आधारित सेवा में बनाया जाए, ताकि उसे चलाया जा सके
  • –function फ़्लैग (नया) का इस्तेमाल, नई सेवा के एंट्रीपॉइंट को सेट करने के लिए किया जाता है. यह एंट्रीपॉइंट, वह फ़ंक्शन सिग्नेचर होता है जिसे आपको लागू करना है
  • (ज़रूरी नहीं) –no-allow-unauthenticated, ताकि आपके फ़ंक्शन को सार्वजनिक तौर पर कॉल न किया जा सके

नीचे दिए गए कमांड को चलाकर, अपनी नई सेवा crf-event-codelab देखी जा सकती है:

gcloud beta run services describe $SERVICE_NAME

5. इवेंट बनाना

हमारा फ़ंक्शन, Google Cloud Storage में हर बार ऑब्जेक्ट के फ़ाइनल होने पर मैसेज भेज सके, इसके लिए हम एक Eventarc ट्रिगर बना सकते हैं:

BUCKET_REGION=$REGION

gcloud eventarc triggers create $TRIGGER_NAME \
     --location=$REGION \
     --destination-run-service=$SERVICE_NAME \
  --destination-run-region=$BUCKET_REGION \
     --event-filters="type=google.cloud.storage.object.v1.finalized" \
     --event-filters="bucket=$BUCKET_NAME" \
     --service-account=$SERVICE_ACCOUNT_ADDRESS

कृपया इन बातों का ध्यान रखें:

  • gcs-function-trigger, ट्रिगर का नाम है
  • crf-event-codelab, Cloud Run सेवा का नाम है. इस सेवा में हमारा फ़ंक्शन डिप्लॉय किया गया है
  • –event-filters फ़्लैग के लिए, अपने बकेट के नाम में gs:// प्रीफ़िक्स का इस्तेमाल न करें.

Eventarc का इस्तेमाल करके, Cloud Storage से ट्रिगर सेवा को सेट अप करने के बारे में ज़्यादा जानकारी वाला ट्यूटोरियल यहां Cloud Run के दस्तावेज़ में देखा जा सकता है: https://cloud.google.com/run/docs/tutorials/eventarc

6. फ़ंक्शन की जांच करना

डप्लॉयमेंट पूरा होने पर, आपको सेवा का यूआरएल दिखेगा. फ़ंक्शन को चालू करने के लिए, आपको पुष्टि किया गया अनुरोध भेजना होगा. इसके साथ, आपको अपना पहचान टोकन या ऐसे प्रिंसिपल का पहचान टोकन भेजना होगा जिसके पास Cloud Run Invoker की भूमिका है. इसके बारे में यहां बताया गया है:

# get the Service URL
SERVICE_URL="$(gcloud run services describe $SERVICE_NAME --region us-central1 --format 'value(status.url)')"

# invoke the service
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

फ़ंक्शन को डिप्लॉय करने और ट्रिगर बनाने के बाद, अब हम फ़ंक्शन को शुरू करने के लिए तैयार हैं.

कोई फ़ाइल बनाएं और उसे Cloud Storage बकेट में अपलोड करें. इसे Cloud Console के वेब इंटरफ़ेस या gsutil सीएलआई टूल का इस्तेमाल करके किया जा सकता है. उदाहरण के लिए,

echo "hello world" > test.txt
gsutil cp test.txt gs://$BUCKET_NAME

फ़ाइल के अपलोड हो जाने पर, एक इवेंट जनरेट होगा.साथ ही, आपका फ़ंक्शन ऑब्जेक्ट के बारे में कुछ बुनियादी जानकारी प्रिंट करेगा. जैसे, फ़ाइल का नाम. आपको यह आउटपुट, Cloud Console में फ़ंक्शन के लिए लॉग एंट्री में मिलेगा. इसके अलावा, gcloud CLI का इस्तेमाल करके इस आउटपुट के लिए क्वेरी की जा सकती है:

gcloud logging read "resource.labels.service_name=$SERVICE_NAME AND textPayload: File" --format=json 

और आपको यह आउटपुट दिखेगा

"textPayload": "File: test.txt"

7. बधाई हो!

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

हमारा सुझाव है कि आप Cloud Run फ़ंक्शन से जुड़े दस्तावेज़ देखें

हमने क्या-क्या बताया

  • इवेंट पर आधारित Cloud Run फ़ंक्शन को डिप्लॉय करने का तरीका, जो GCS बकेट में कोई ऑब्जेक्ट अपलोड होने पर ट्रिगर होता है
  • Cloud Storage से इवेंट पाने और Cloud Run फ़ंक्शन को शुरू करने के लिए, सही भूमिकाओं वाला सेवा खाता बनाने का तरीका

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

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

Cloud Run सेवाओं को मिटाने के लिए, Cloud Run Cloud Console पर जाएं. इसका लिंक यह है: https://console.cloud.google.com/run/. इसके बाद, इस कोडलैब में बनाई गई crf-event-codelab सेवा को मिटाएं.

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