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

1. परिचय

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

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

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

efb3268e3b74ed4f.png

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

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

  • .NET के लिए Functions Framework.
  • एचटीटीपी फ़ंक्शन लिखने का तरीका.
  • 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 Console में बिलिंग चालू करनी होगी, ताकि Cloud संसाधनों/एपीआई का इस्तेमाल किया जा सके. इस कोडलैब को पूरा करने में ज़्यादा खर्च नहीं आएगा. इस ट्यूटोरियल के बाद बिलिंग से बचने के लिए, बनाए गए संसाधनों को बंद किया जा सकता है. इसके लिए, बनाए गए संसाधनों को मिटाएं या पूरे प्रोजेक्ट को मिटाएं. Google Cloud के नए उपयोगकर्ताओं को, मुफ़्त में आज़माने के लिए 300 डॉलर का क्रेडिट मिलता है.

Cloud Shell शुरू करें

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

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 invoker की भूमिका वाला एक सेवा खाता बनाना होगा. इससे 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 invoker की भूमिका असाइन करें, ताकि वह फ़ंक्शन को शुरू कर सके.

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

4. Functions Framework for .NET

Functions Framework for .NET एक ओपन सोर्स FaaS (Function as a Service) फ़्रेमवर्क है. इसका इस्तेमाल, पोर्टेबल .NET फ़ंक्शन लिखने के लिए किया जाता है. इसे Google Cloud Functions की टीम ने बनाया है.

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

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

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

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 2nd gen के तौर पर डिप्लॉय करना है, तो इस कमांड का इस्तेमाल करें:

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

इससे एक प्रोजेक्ट और Function.cs फ़ाइल बनती है, जो CloudEvent अनुरोधों का जवाब देती है. यह 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

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

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

इससे एक प्रोजेक्ट और Function.cs फ़ाइल बनती है, जो CloudEvent अनुरोधों का जवाब देती है. यह 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 2nd gen के तौर पर डिप्लॉय करना है, तो 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 का इस्तेमाल करना है और आपके पास ऐसा पेलोड डेटा मॉडल नहीं है जिसका इस्तेमाल किया जा सके या आपको अपने फ़ंक्शन को किसी भी CloudEvent को हैंडल करने की अनुमति देनी है, तो बिना टाइप वाला 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

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

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

9. बधाई हो!

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

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

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