1. परिचय
Google Cloud Run फ़ंक्शन, इवेंट पर आधारित बिना सर्वर वाला कंप्यूट प्लैटफ़ॉर्म है. Cloud Run फ़ंक्शन की मदद से, बदलती हुई ज़रूरतों को पूरा करने के लिए, संसाधनों को उपलब्ध कराने या स्केलिंग करने की चिंता किए बिना कोड लिखा जा सकता है.
Cloud Run फ़ंक्शन दो तरह के होते हैं:
- एचटीटीपी फ़ंक्शन, एचटीटीपी अनुरोधों का जवाब देते हैं.
- इवेंट फ़ंक्शन, इवेंट से ट्रिगर होते हैं. जैसे, Cloud Pub/Sub पर पब्लिश होने वाला मैसेज या Cloud Storage में अपलोड की गई फ़ाइल.
यह कोडलैब आपको C# में, Cloud Run फ़ंक्शन बनाने में आपकी मदद करेगा. खास तौर पर, आपको Google Cloud के अलग-अलग सोर्स से एचटीटीपी और CloudEvents के जवाब देने वाले C# फ़ंक्शन डिप्लॉय करने होंगे.
आपको क्या सीखने को मिलेगा
- .NET के लिए फ़ंक्शन फ़्रेमवर्क.
- एचटीटीपी फ़ंक्शन लिखने का तरीका.
- Cloud Storage इवेंट के जवाब में, इवेंट ट्रिगर करने वाला फ़ंक्शन लिखने का तरीका.
- Cloud Pub/Sub इवेंट के जवाब देने के लिए, इवेंट ट्रिगर करने वाला फ़ंक्शन लिखने का तरीका.
- किसी भी तरह के इवेंट के जवाब में, इवेंट ट्रिगर करने वाला फ़ंक्शन लिखने का तरीका.
2. सेटअप और ज़रूरी शर्तें
अपने हिसाब से एनवायरमेंट सेट अप करना
- Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास पहले से कोई Gmail या Google Workspace खाता नहीं है, तो आपको एक खाता बनाना होगा.
- प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों का डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करते. इसे कभी भी अपडेट किया जा सकता है.
- प्रोजेक्ट आईडी, Google Cloud के सभी प्रोजेक्ट के लिए यूनीक होना चाहिए. साथ ही, आईडी को बदला नहीं जा सकता. सेट अप के बाद इसे बदला नहीं जा सकता. Cloud Console, अपने-आप एक यूनीक स्ट्रिंग जनरेट करता है. आम तौर पर, आपको यह जानने की ज़रूरत नहीं होती कि यह स्ट्रिंग क्या है. ज़्यादातर कोडलैब में, आपको प्रोजेक्ट आईडी का रेफ़रंस देना होगा. आम तौर पर, इसे
PROJECT_ID
के तौर पर पहचाना जाता है. अगर आपको जनरेट किया गया आईडी पसंद नहीं है, तो कोई दूसरा आईडी जनरेट किया जा सकता है. इसके अलावा, खुद भी आज़माया जा सकता है और देखें कि वह उपलब्ध है या नहीं. इस चरण के बाद इसे बदला नहीं जा सकता और प्रोजेक्ट के कुल समय तक बना रहेगा. - आपकी जानकारी के लिए, एक तीसरी वैल्यू यानी प्रोजेक्ट नंबर है. इसका इस्तेमाल कुछ एपीआई करते हैं. दस्तावेज़ में इन तीनों वैल्यू के बारे में ज़्यादा जानें.
- इसके बाद, आपको Cloud के संसाधनों/एपीआई का इस्तेमाल करने के लिए, Cloud Console में बिलिंग की सुविधा चालू करनी होगी. इस कोडलैब का इस्तेमाल करने पर, आपको ज़्यादा पैसे नहीं चुकाने होंगे. इस ट्यूटोरियल के अलावा, संसाधनों को बंद करने के लिए कि आपको बिलिंग न करनी पड़े. इसके लिए, अपने बनाए गए संसाधनों को मिटाएं या पूरा प्रोजेक्ट मिटाएं. Google Cloud के नए उपयोगकर्ता, 300 डॉलर के मुफ़्त ट्रायल वाले कार्यक्रम में शामिल हो सकते हैं.
Cloud Shell शुरू करना
Google Cloud को आपके लैपटॉप से, कहीं से भी ऑपरेट किया जा सकता है. हालांकि, इस कोडलैब में Google Cloud Shell का इस्तेमाल किया जा रहा है. यह क्लाउड में चलने वाला कमांड लाइन एनवायरमेंट है.
Google Cloud Console में जाकर, सबसे ऊपर दाईं ओर मौजूद टूलबार पर क्लाउड शेल आइकॉन पर क्लिक करें:
एनवायरमेंट से कनेक्ट होने और उसे प्रोवाइड करने में सिर्फ़ कुछ मिनट लगेंगे. प्रोसेस पूरी होने के बाद, आपको कुछ ऐसा दिखेगा:
इस वर्चुअल मशीन में ऐसे सभी डेवलपमेंट टूल मौजूद हैं जिनकी आपको ज़रूरत पड़ेगी. यह 5 जीबी की होम डायरेक्ट्री उपलब्ध कराता है. यह Google Cloud पर चलता है, जिससे नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की सुविधा बेहतर होती है. इस कोडलैब में, सारा काम ब्राउज़र में किया जा सकता है. आपको कुछ भी इंस्टॉल करने की ज़रूरत नहीं है.
3. शुरू करने से पहले
Cloud Shell के अंदर, ज़रूरी सेवाएं चालू करने के लिए यह निर्देश चलाएं:
gcloud services enable \ artifactregistry.googleapis.com \ cloudbuild.googleapis.com \ cloudfunctions.googleapis.com \ eventarc.googleapis.com \ run.googleapis.com
इसके बाद, अपना क्षेत्र सेट करें.
REGION=<YOUR_REGION>
इस कोडलैब के लिए, आपको Cloud Storage से कोई इवेंट पाने और Cloud Run फ़ंक्शन को शुरू करने के लिए, EventArc अनुमतियों और Cloud Run इनवॉइसर की ज़रूरी अनुमतियों के साथ सेवा खाता बनाना होगा.
सबसे पहले, सेवा खाता बनाएं.
PROJECT_ID=$(gcloud config get-value core/project) 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 की शुरुआती भूमिका असाइन करें, ताकि वह फ़ंक्शन को शुरू कर सके.
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \ --role=roles/run.invoker
4. .NET के लिए फ़ंक्शन फ़्रेमवर्क
.NET के लिए फ़ंक्शन फ़्रेमवर्क, एक ओपन सोर्स FaaS (फ़ंक्शन के तौर पर सेवा) फ़्रेमवर्क है. इसका इस्तेमाल, पोर्टेबल .NET फ़ंक्शन लिखने के लिए किया जाता है. इसे Google Cloud Functions की टीम ने उपलब्ध कराया है.
फ़ंक्शन फ़्रेमवर्क की मदद से, ऐसे लाइटवेट फ़ंक्शन लिखे जा सकते हैं जो कई अलग-अलग एनवायरमेंट में चलते हैं. जैसे:
- Google Cloud Run फ़ंक्शन
- आपकी लोकल डेवलपमेंट मशीन
- Cloud Run और GKE पर Cloud Run
- Kनेटिव-आधारित एनवायरमेंट
इस कोडलैब में, C# में Cloud Functions बनाने और डिप्लॉय करने के लिए, .NET और इसके टेंप्लेट के लिए फ़ंक्शन फ़्रेमवर्क का इस्तेमाल किया जाएगा.
Cloud Shell के अंदर, dotnet
के लिए Cloud Functions टेंप्लेट इंस्टॉल करने के लिए, यह कमांड चलाएं:
dotnet new install Google.Cloud.Functions.Templates
इससे dotnet
के लिए तीन टेंप्लेट इंस्टॉल हो जाएंगे. हर टेंप्लेट C#, F#, और VB में उपलब्ध है. हालांकि, इस लैब में आपको सिर्फ़ C# का इस्तेमाल करना होगा. टेंप्लेट इंस्टॉल होने की पुष्टि करने के लिए, यह तरीका अपनाएं:
dotnet new list Templates Short Name ----------------------------------------------------------------------- Google Cloud Functions CloudEvent Function gcf-event Google Cloud Functions CloudEvent Function (Untyped) gcf-untyped-event Google Cloud Functions HttpFunction gcf-http
5. एचटीटीपी फ़ंक्शन
आपको एचटीटीपी अनुरोधों के जवाब में एक एचटीटीपी फ़ंक्शन बनाना और उसे डिप्लॉय करना होगा.
gcf-http
टेंप्लेट का इस्तेमाल करके एचटीटीपी फ़ंक्शन बनाएं:
mkdir HelloHttp cd HelloHttp dotnet new gcf-http
इससे एक प्रोजेक्ट और Function.cs
फ़ाइल बन जाती है, जो एचटीटीपी अनुरोधों के जवाब देती है.
.csproj
फ़ाइल में टारगेट फ़्रेमवर्क को net8.0
में बदलें:
<TargetFramework>net8.0</TargetFramework>
Cloud Run फ़ंक्शन को सीधे Cloud Run पर डिप्लॉय करने के लिए, यह कमांड चलाएं:
gcloud beta run deploy hello-http-function \ --source . \ --function HelloHttp.Function \ --base-image dotnet8 \ --region $REGION \ --allow-unauthenticated
अगर आपको Cloud Functions 2nd gen के तौर पर डिप्लॉय करना है, तो इस निर्देश का इस्तेमाल करें:
gcloud functions deploy hello-http-function \ --allow-unauthenticated \ --entry-point HelloHttp.Function \ --gen2 \ --region $REGION \ --runtime dotnet8 \ --trigger-http
एक बार आपके फ़ंक्शन को डिप्लॉय करने के बाद, नीचे दिए गए कर्ल कमांड का इस्तेमाल करके इसे शुरू किया जा सकता है:
SERVICE_URL=$(gcloud run services describe hello-http-function --platform managed --region $REGION --format 'value(status.url)') curl $SERVICE_URL
6. CloudEvent फ़ंक्शन - GCS
आपको Google Cloud Storage (GCS) के इवेंट का जवाब देने वाला CloudEvent फ़ंक्शन बनाना और उसे डिप्लॉय करना होगा.
सबसे पहले, Cloud Storage बकेट बनाएं. यह वह बकेट है जिसमें आपको बाद में इवेंट सुनने हैं:
BUCKET_NAME="cloud-functions-bucket-${PROJECT_ID}" gsutil mb -l us-central1 gs://${BUCKET_NAME}
gcf-event
टेंप्लेट का इस्तेमाल करके CloudEvent फ़ंक्शन बनाएं:
cd .. mkdir HelloGcs cd HelloGcs dotnet new gcf-event
इससे एक प्रोजेक्ट और CloudEvent
अनुरोधों का जवाब देने वाली Function.cs
फ़ाइल बनती है. यह CloudEvent
के डेटा को StorageObjectData
में भी पार्स करता है.
.csproj
फ़ाइल में टारगेट फ़्रेमवर्क को net8.0
में बदलें:
<TargetFramework>net8.0</TargetFramework>
Cloud Run फ़ंक्शन को सीधे Cloud Run पर डिप्लॉय करने के लिए, आपको सबसे पहले फ़ंक्शन को डिप्लॉय करना होगा. इसके बाद, उसके लिए ट्रिगर बनाना होगा.
gcloud beta run deploy hello-gcs-function \ --source . \ --function HelloGcs.Function \ --region $REGION \ --base-image dotnet8 \ --no-allow-unauthenticated
अब Cloud Run फ़ंक्शन के लिए ट्रिगर बनाएं
BUCKET_REGION=$REGION gcloud eventarc triggers create hello-gcs-function-trigger \ --location=$REGION \ --destination-run-service=hello-gcs-function \ --destination-run-region=$BUCKET_REGION \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=$BUCKET_NAME" \ --service-account=$SERVICE_ACCOUNT_ADDRESS
अगर आपको Cloud Functions 2nd gen के तौर पर डिप्लॉय करना है, तो trigger-event
और trigger-resource
फ़्लैग का इस्तेमाल करके, इस कमांड का इस्तेमाल करके फ़ंक्शन को डिप्लॉय किया जा सकता है:
gcloud functions deploy hello-gcs-function \ --allow-unauthenticated \ --entry-point HelloGcs.Function \ --gen2 \ --region $REGION \ --runtime dotnet8 \ --trigger-event google.storage.object.finalize \ --trigger-resource ${BUCKET_NAME} \ --service-account=$SERVICE_ACCOUNT_ADDRESS
कुछ मिनट के बाद, यह फ़ंक्शन Cloud Console में दिखने लगेगा:
स्टोरेज बकेट में कोई फ़ाइल अपलोड करके, फ़ंक्शन को ट्रिगर करें:
echo "Hello from Storage" > random.txt gsutil cp random.txt gs://${BUCKET_NAME}
लॉग को पढ़कर पुष्टि करें कि फ़ंक्शन ट्रिगर हुआ है:
Cloud Run फ़ंक्शन के लिए, आप इस निर्देश को चला सकते हैं:
gcloud logging read "resource.labels.service_name=hello-gcs-function AND textPayload: Name" --format=json
2nd gen फ़ंक्शन के लिए, इस कमांड को चलाया जा सकता है:
gcloud functions logs read hello-gcs-function \ --gen2 \ --region us-central1
7. CloudEvent फ़ंक्शन - Pub/Sub
आपको Cloud Pub/Sub इवेंट के जवाब में, CloudEvent फ़ंक्शन बनाना और डिप्लॉय करना होगा.
सबसे पहले, ऐसा Cloud Pub/Sub विषय बनाएं जिससे इवेंट ट्रिगर हों:
TOPIC_NAME=cloud-functions-topic gcloud pubsub topics create ${TOPIC_NAME}
gcf-event
टेंप्लेट का इस्तेमाल करके CloudEvent फ़ंक्शन बनाएं:
cd .. mkdir HelloPubSub cd HelloPubSub dotnet new gcf-event
इससे एक प्रोजेक्ट और CloudEvent
अनुरोधों का जवाब देने वाली Function.cs
फ़ाइल बनती है. यह CloudEvent
के डेटा को डिफ़ॉल्ट रूप से StorageObjectData
में भी पार्स करता है.
.csproj
फ़ाइल में, टारगेट फ़्रेमवर्क को net8.0
में बदलें:
<TargetFramework>net8.0</TargetFramework>
Pub/Sub मैसेज को पार्स करने के लिए, StorageObjectData
को MessagePublishedData
में बदलें. Google.Events.Protobuf.Cloud.Storage.V1
को Google.Events.Protobuf.Cloud.PubSub.V1
में बदलें.
आखिर में, आपका फ़ंक्शन ऐसा दिखना चाहिए:
using CloudNative.CloudEvents; using Google.Cloud.Functions.Framework; using Google.Events.Protobuf.Cloud.PubSub.V1; using System; using System.Threading; using System.Threading.Tasks; namespace HelloPubSub; public class Function : ICloudEventFunction<MessagePublishedData> { public Task HandleAsync(CloudEvent cloudEvent, MessagePublishedData data, CancellationToken cancellationToken) { var nameFromMessage = data.Message?.TextData; var name = string.IsNullOrEmpty(nameFromMessage) ? "world" : nameFromMessage; Console.WriteLine($"Hello {name}"); return Task.CompletedTask; } }
Cloud Run फ़ंक्शन को सीधे Cloud Run पर डिप्लॉय करने के लिए, सबसे पहले फ़ंक्शन को डिप्लॉय करना होगा. इसके बाद, उसके लिए ट्रिगर बनाना होगा.
gcloud beta run deploy hello-pubsub-function \ --source . \ --function HelloPubSub.Function \ --region $REGION \ --base-image dotnet8 \ --no-allow-unauthenticated \ --service-account=$SERVICE_ACCOUNT_ADDRESS
अब Cloud Run फ़ंक्शन के लिए ट्रिगर बनाएं
gcloud eventarc triggers create my-pubsub-trigger \ --location=$REGION \ --service-account=$SERVICE_ACCOUNT_ADDRESS \ --destination-run-service=hello-pubsub-function \ --destination-run-region=$REGION \ --destination-run-path="/" \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --transport-topic=projects/$PROJECT_ID/topics/$TOPIC_NAME
अगर आपको Cloud Functions के दूसरे जनरेशन के तौर पर डिप्लॉय करना है, तो trigger-topic
फ़्लैग का इस्तेमाल करके फ़ंक्शन को डिप्लॉय करने के लिए, नीचे दिए गए कमांड का इस्तेमाल करें:
gcloud functions deploy hello-pubsub-function \ --allow-unauthenticated \ --entry-point HelloPubSub.Function \ --gen2 \ --region us-central1 \ --runtime dotnet8 \ --trigger-topic ${TOPIC_NAME}
कुछ मिनट के बाद, यह फ़ंक्शन Cloud Console में दिखने लगेगा:
टॉपिक में मैसेज पब्लिश करके फ़ंक्शन को ट्रिगर करें:
gcloud pubsub topics publish ${TOPIC_NAME} --message="World"
लॉग को पढ़कर पुष्टि करें कि फ़ंक्शन ट्रिगर हुआ है.
Cloud Run फ़ंक्शन के लिए, आप इस निर्देश को चला सकते हैं:
gcloud logging read "resource.labels.service_name=hello-pubsub-function AND textPayload: World" --format=json
2nd gen फ़ंक्शन के लिए, इस कमांड को चलाया जा सकता है:
gcloud functions logs read hello-pubsub-function \ --gen2 \ --region us-central1
8. CloudEvent फ़ंक्शन - बिना टाइप वाला
अगर CloudEvent के साथ एक्सपेरिमेंट किया जा रहा है और आपके पास अब तक कोई पेलोड डेटा मॉडल नहीं है, जिसे आपको इस्तेमाल करना है या आपको अपने फ़ंक्शन से किसी Cloud इवेंट को मैनेज करना है, तो ऐसे CloudEvent फ़ंक्शन का इस्तेमाल करें.
gcf-untyped-event
टेंप्लेट का इस्तेमाल करके, CloudEvent फ़ंक्शन बनाएं:
cd .. mkdir HelloUntyped cd HelloUntyped dotnet new gcf-untyped-event
इससे एक प्रोजेक्ट और Function.cs
फ़ाइल बनती है, जो CloudEvent
के अनुरोधों का जवाब देती है. हालांकि, इसमें CloudEvent
के डेटा को पार्स नहीं किया जाता.
.csproj
फ़ाइल में टारगेट फ़्रेमवर्क को net8.0
में बदलें:
<TargetFramework>net8.0</TargetFramework>
Cloud Run फ़ंक्शन को सीधे Cloud Run पर डिप्लॉय करने के लिए, आपको सबसे पहले फ़ंक्शन को डिप्लॉय करना होगा. इसके बाद, उसके लिए ट्रिगर बनाना होगा.
gcloud beta run deploy hello-untyped-function \ --source . \ --function HelloUntyped.Function \ --region $REGION \ --base-image dotnet8 \ --no-allow-unauthenticated
अब Cloud Run फ़ंक्शन के लिए ट्रिगर बनाएं
BUCKET_REGION=$REGION gcloud eventarc triggers create hello-untyped-function-trigger \ --location=$REGION \ --destination-run-service=hello-untyped-function \ --destination-run-region=$BUCKET_REGION \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=$BUCKET_NAME" \ --service-account=$SERVICE_ACCOUNT_ADDRESS
अगर आपको Cloud Functions 2nd gen के तौर पर डिप्लॉय करना है, तो trigger-event
और trigger-resource
फ़्लैग का इस्तेमाल करके, इस कमांड का इस्तेमाल करके फ़ंक्शन को डिप्लॉय किया जा सकता है:
gcloud functions deploy hello-untyped-function \ --allow-unauthenticated \ --entry-point HelloUntyped.Function \ --gen2 \ --region us-central1 \ --runtime dotnet8 \ --trigger-event google.storage.object.finalize \ --trigger-resource ${BUCKET_NAME}
यह फ़ंक्शन तब ट्रिगर होगा, जब किसी फ़ाइल को स्टोरेज बकेट में अपलोड किया जाएगा.
कुछ मिनट के बाद, यह फ़ंक्शन Cloud Console में दिखने लगेगा:
स्टोरेज बकेट में कोई फ़ाइल अपलोड करके, फ़ंक्शन को ट्रिगर करें:
echo "Hello from Storage" > random.txt gsutil cp random.txt gs://${BUCKET_NAME}
लॉग को पढ़कर पुष्टि करें कि फ़ंक्शन ट्रिगर हुआ है.
Cloud Run फ़ंक्शन के लिए, आप इस निर्देश को चला सकते हैं:
gcloud logging read "resource.labels.service_name=hello-gcs-function AND textPayload: Name" --format=json
2nd gen फ़ंक्शन के लिए, इस कमांड को चलाया जा सकता है:
gcloud functions logs read hello-untyped-function \ --gen2 \ --region us-central1
9. बधाई हो!
कोडलैब पूरा करने के लिए बधाई.
इसमें हमने इन विषयों के बारे में बताया
- .NET के लिए फ़ंक्शन फ़्रेमवर्क.
- एचटीटीपी Cloud फ़ंक्शन लिखने का तरीका.
- Cloud Storage इवेंट का जवाब देने वाला CloudEvent फ़ंक्शन लिखने का तरीका.
- Cloud Pub/Sub इवेंट के जवाब देने वाला CloudEvent फ़ंक्शन लिखने का तरीका.
- किसी भी तरह के इवेंट का जवाब देने वाला CloudEvent फ़ंक्शन लिखने का तरीका.