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 का इस्तेमाल करना होगा. यह Cloud में चलने वाला कमांड-लाइन एनवायरमेंट है.

Google Cloud Console में, सबसे ऊपर दाएं टूलबार में मौजूद Cloud Shell आइकॉन पर क्लिक करें:

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>

इस कोडलैब में, आपको EventArc की ज़रूरी अनुमतियों और Cloud Run के ट्रिगर करने वाले की भूमिका के साथ एक सेवा खाता बनाना होगा. इससे, Cloud Storage से इवेंट पाने और 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 की टीम ने उपलब्ध कराया है.

Functions फ़्रेमवर्क की मदद से, ऐसे छोटे फ़ंक्शन लिखे जा सकते हैं जो कई अलग-अलग एनवायरमेंट में काम करते हैं. जैसे:

  • Google Cloud Run फ़ंक्शन
  • आपकी लोकल डेवलपमेंट मशीन
  • Cloud Run और GKE पर Cloud Run
  • Knative पर आधारित एनवायरमेंट

इस कोडलैब में, आपको C# में Cloud Functions बनाने और डिप्लॉय करने के लिए, .NET के लिए Functions Framework और उसके टेंप्लेट का इस्तेमाल करना होगा.

dotnet के लिए Cloud Functions टेंप्लेट इंस्टॉल करने के लिए, Cloud Shell में यह कमांड चलाएं:

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 के दूसरे जनरेशन के तौर पर डिप्लॉय करना है, तो नीचे दिए गए कमांड का इस्तेमाल करें:

gcloud functions deploy hello-http-function \
    --allow-unauthenticated \
    --entry-point HelloHttp.Function \
    --gen2 \
    --region $REGION \
    --runtime dotnet8 \
    --trigger-http

फ़ंक्शन डिप्लॉय होने के बाद, इसे नीचे दिए गए curl निर्देश का इस्तेमाल करके चालू किया जा सकता है:

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 के दूसरे जनरेशन के तौर पर डिप्लॉय करना है, तो 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

दूसरे जनरेशन के फ़ंक्शन के लिए, यह निर्देश चलाया जा सकता है:

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

दूसरे जनरेशन के फ़ंक्शन के लिए, यह निर्देश चलाया जा सकता है:

gcloud functions logs read hello-pubsub-function \
    --gen2 \
    --region us-central1

8. CloudEvent फ़ंक्शन - बिना टाइप वाला

अगर CloudEvents का इस्तेमाल करके एक्सपेरिमेंट किया जा रहा है और आपके पास अब तक कोई ऐसा पेलोड डेटा मॉडल नहीं है जिसे आपको कमिट करना है या आपको अपने फ़ंक्शन को किसी भी Cloud Event को हैंडल करने की सुविधा देनी है, तो बिना टाइप वाले 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 के दूसरे जनरेशन के तौर पर डिप्लॉय करना है, तो 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

दूसरे जनरेशन के फ़ंक्शन के लिए, यह निर्देश चलाया जा सकता है:

gcloud functions logs read hello-untyped-function \
    --gen2 \
    --region us-central1

9. बधाई हो!

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

हमने क्या-क्या शामिल किया है

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