C# में Google Cloud के फ़ंक्शन

1. परिचय

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

Cloud Run फ़ंक्शन दो तरह के होते हैं:

  • एचटीटीपी फ़ंक्शन, एचटीटीपी अनुरोधों का जवाब देते हैं.
  • इवेंट फ़ंक्शन, इवेंट से ट्रिगर होते हैं. जैसे, Cloud Pub/Sub पर पब्लिश होने वाला मैसेज या Cloud Storage में अपलोड की गई फ़ाइल.

efb3268e3b74ed4f.png

यह कोडलैब आपको C# में, Cloud Run फ़ंक्शन बनाने में आपकी मदद करेगा. खास तौर पर, आपको Google Cloud के अलग-अलग सोर्स से एचटीटीपी और CloudEvents के जवाब देने वाले C# फ़ंक्शन डिप्लॉय करने होंगे.

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

  • .NET के लिए फ़ंक्शन फ़्रेमवर्क.
  • एचटीटीपी फ़ंक्शन लिखने का तरीका.
  • Cloud Storage इवेंट के जवाब में, इवेंट ट्रिगर करने वाला फ़ंक्शन लिखने का तरीका.
  • Cloud Pub/Sub इवेंट के जवाब देने के लिए, इवेंट ट्रिगर करने वाला फ़ंक्शन लिखने का तरीका.
  • किसी भी तरह के इवेंट के जवाब में, इवेंट ट्रिगर करने वाला फ़ंक्शन लिखने का तरीका.

2. सेटअप और ज़रूरी शर्तें

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

  1. Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास पहले से कोई Gmail या Google Workspace खाता नहीं है, तो आपको एक खाता बनाना होगा.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों का डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करते. इसे कभी भी अपडेट किया जा सकता है.
  • प्रोजेक्ट आईडी, Google Cloud के सभी प्रोजेक्ट के लिए यूनीक होना चाहिए. साथ ही, आईडी को बदला नहीं जा सकता. सेट अप के बाद इसे बदला नहीं जा सकता. Cloud Console, अपने-आप एक यूनीक स्ट्रिंग जनरेट करता है. आम तौर पर, आपको यह जानने की ज़रूरत नहीं होती कि यह स्ट्रिंग क्या है. ज़्यादातर कोडलैब में, आपको प्रोजेक्ट आईडी का रेफ़रंस देना होगा. आम तौर पर, इसे PROJECT_ID के तौर पर पहचाना जाता है. अगर आपको जनरेट किया गया आईडी पसंद नहीं है, तो कोई दूसरा आईडी जनरेट किया जा सकता है. इसके अलावा, खुद भी आज़माया जा सकता है और देखें कि वह उपलब्ध है या नहीं. इस चरण के बाद इसे बदला नहीं जा सकता और प्रोजेक्ट के कुल समय तक बना रहेगा.
  • आपकी जानकारी के लिए, एक तीसरी वैल्यू यानी प्रोजेक्ट नंबर है. इसका इस्तेमाल कुछ एपीआई करते हैं. दस्तावेज़ में इन तीनों वैल्यू के बारे में ज़्यादा जानें.
  1. इसके बाद, आपको Cloud के संसाधनों/एपीआई का इस्तेमाल करने के लिए, Cloud Console में बिलिंग की सुविधा चालू करनी होगी. इस कोडलैब का इस्तेमाल करने पर, आपको ज़्यादा पैसे नहीं चुकाने होंगे. इस ट्यूटोरियल के अलावा, संसाधनों को बंद करने के लिए कि आपको बिलिंग न करनी पड़े. इसके लिए, अपने बनाए गए संसाधनों को मिटाएं या पूरा प्रोजेक्ट मिटाएं. Google Cloud के नए उपयोगकर्ता, 300 डॉलर के मुफ़्त ट्रायल वाले कार्यक्रम में शामिल हो सकते हैं.

Cloud Shell शुरू करना

Google Cloud को आपके लैपटॉप से, कहीं से भी ऑपरेट किया जा सकता है. हालांकि, इस कोडलैब में Google Cloud Shell का इस्तेमाल किया जा रहा है. यह क्लाउड में चलने वाला कमांड लाइन एनवायरमेंट है.

Google Cloud Console में जाकर, सबसे ऊपर दाईं ओर मौजूद टूलबार पर क्लाउड शेल आइकॉन पर क्लिक करें:

55efc1aaa7a4d3ad.png

एनवायरमेंट से कनेक्ट होने और उसे प्रोवाइड करने में सिर्फ़ कुछ मिनट लगेंगे. प्रोसेस पूरी होने के बाद, आपको कुछ ऐसा दिखेगा:

7ffe5cbb04455448.png

इस वर्चुअल मशीन में ऐसे सभी डेवलपमेंट टूल मौजूद हैं जिनकी आपको ज़रूरत पड़ेगी. यह 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 में दिखने लगेगा:

c28654d74bb31420.png

स्टोरेज बकेट में कोई फ़ाइल अपलोड करके, फ़ंक्शन को ट्रिगर करें:

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 में दिखने लगेगा:

3443808da7caf3bc.png

टॉपिक में मैसेज पब्लिश करके फ़ंक्शन को ट्रिगर करें:

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 में दिखने लगेगा:

afe56530826787c6.png

स्टोरेज बकेट में कोई फ़ाइल अपलोड करके, फ़ंक्शन को ट्रिगर करें:

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 फ़ंक्शन लिखने का तरीका.