1. מבוא
פונקציות Google Cloud Run הן פלטפורמת מחשוב ללא שרת (serverless) שמבוססת על אירועים. פונקציות Cloud Run מאפשרות לכם לכתוב את הקוד בלי לדאוג להקצאת משאבים או להתאמת קנה מידה כדי לעמוד בדרישות משתנות.
יש שני סוגים של פונקציות Cloud Run:
- פונקציות HTTP מגיבות לבקשות HTTP.
- פונקציות של אירועים מופעלות על ידי אירועים, כמו פרסום הודעה ב-Cloud Pub/Sub או העלאת קובץ ל-Cloud Storage.

ב-codelab הזה נסביר איך ליצור פונקציות Cloud Run משלכם ב-C#. בפרט, תפרסו פונקציות C# שמגיבות ל-HTTP ול-CloudEvents ממקורות שונים ב-Google Cloud.
מה תלמדו
- Functions Framework for .NET.
- איך כותבים פונקציית HTTP.
- איך כותבים פונקציה שמופעלת על ידי אירוע ומגיבה לאירועים ב-Cloud Storage.
- איך כותבים פונקציה שמבוססת על טריגר אירועים ומגיבה לאירועים של Cloud Pub/Sub.
- איך כותבים פונקציה שמופעלת על ידי אירוע ומגיבה לכל סוג של אירוע.
2. הגדרה ודרישות
הגדרת סביבה בקצב אישי
- נכנסים ל-מסוף Google Cloud ויוצרים פרויקט חדש או משתמשים בפרויקט קיים. אם עדיין אין לכם חשבון Gmail או Google Workspace, אתם צריכים ליצור חשבון.



- שם הפרויקט הוא השם המוצג של הפרויקט הזה למשתתפים. זו מחרוזת תווים שלא נמצאת בשימוש ב-Google APIs. אפשר לעדכן את המיקום הזה בכל שלב.
- מזהה הפרויקט חייב להיות ייחודי בכל הפרויקטים ב-Google Cloud, והוא קבוע (אי אפשר לשנות אותו אחרי שמגדירים אותו). מסוף Cloud יוצר באופן אוטומטי מחרוזת ייחודית, ובדרך כלל לא צריך לדעת מה היא. ברוב ה-Codelabs, תצטרכו להפנות למזהה הפרויקט (בדרך כלל הוא מסומן כ-
PROJECT_ID). אם אתם לא אוהבים את המזהה שנוצר, אתם יכולים ליצור מזהה אקראי אחר. אפשר גם לנסות שם משתמש משלכם ולבדוק אם הוא זמין. אי אפשר לשנות את ההגדרה הזו אחרי השלב הזה, והיא תישאר כזו למשך הפרויקט. - לידיעתכם, יש ערך שלישי, מספר פרויקט, שחלק מממשקי ה-API משתמשים בו. במאמרי העזרה מפורט מידע נוסף על שלושת הערכים האלה.
- בשלב הבא, תצטרכו להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבי Cloud או בממשקי API של Cloud. העלות של התרגול הזה לא אמורה להיות גבוהה, ואולי אפילו לא תצטרכו לשלם בכלל. כדי להשבית את המשאבים ולא לחייב אתכם מעבר למדריך הזה, אתם יכולים למחוק את המשאבים שיצרתם או למחוק את כל הפרויקט. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300$.
מפעילים את Cloud Shell
אפשר להפעיל את Google Cloud מרחוק מהמחשב הנייד, אבל ב-codelab הזה תשתמשו ב-Google Cloud Shell, סביבת שורת פקודה שפועלת בענן.
ב-מסוף Google Cloud, לוחצים על סמל Cloud Shell בסרגל הכלים שבפינה הימנית העליונה:

יחלפו כמה רגעים עד שההקצאה והחיבור לסביבת העבודה יושלמו. בסיום התהליך, אמור להופיע משהו כזה:

המכונה הווירטואלית הזו כוללת את כל הכלים שדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר מאוד את הביצועים והאימות ברשת. אפשר לבצע את כל העבודה ב-codelab הזה בדפדפן. לא צריך להתקין שום דבר.
3. לפני שמתחילים
ב-Cloud Shell, מריצים את הפקודה הבאה כדי להפעיל את השירותים הנדרשים:
gcloud services enable \ artifactregistry.googleapis.com \ cloudbuild.googleapis.com \ cloudfunctions.googleapis.com \ eventarc.googleapis.com \ run.googleapis.com
לאחר מכן מגדירים את האזור.
REGION=<YOUR_REGION>
ב-codelab הזה תיצרו חשבון שירות עם ההרשאות הנדרשות של 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 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 (פונקציה כשירות) בקוד פתוח לכתיבת פונקציות ניידות של .NET – הפלטפורמה הזו היא פרי פיתוח של צוות Google Cloud Functions.
ה-Functions Framework מאפשר לכתוב פונקציות קלות משקל שפועלות בסביבות שונות, כולל:
- פונקציות Google Cloud Run
- מחשב הפיתוח המקומי
- Cloud Run ו-Cloud Run on GKE
- סביבות מבוססות Knative
ב-Codelab הזה תשתמשו ב-Functions Framework for .NET ובשבלונות שלו כדי ליצור ולפרוס פונקציות ב-Cloud Functions ב-C#.
ב-Cloud Shell, מריצים את הפקודה הבאה כדי להתקין תבניות של Cloud Functions בשביל dotnet:
dotnet new install Google.Cloud.Functions.Templates
הפעולה הזו תתקין 3 תבניות ל-dotnet. כל תבנית זמינה ב-C#, F# ו-VB (אבל בשיעור ה-Lab הזה תשתמשו רק ב-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. פונקציית HTTP
תצרו ותפרוסו פונקציית HTTP שמגיבה לבקשות HTTP.
יוצרים פונקציית HTTP באמצעות התבנית gcf-http:
mkdir HelloHttp cd HelloHttp dotnet new gcf-http
יצירת פרויקט וקובץ Function.cs שנותן מענה לבקשות HTTP.
משנים את מסגרת היעד ל-net8.0 בקובץ .csproj:
<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
תלמדו איך ליצור ולפרוס פונקציית CloudEvent שמגיבה לאירועים ב-Google Cloud Storage (GCS).
קודם יוצרים קטגוריה של Cloud Storage. זהו ה-bucket שממנו תקשיבו לאירועים בהמשך:
BUCKET_NAME="cloud-functions-bucket-${PROJECT_ID}"
gsutil mb -l us-central1 gs://${BUCKET_NAME}
יוצרים פונקציית CloudEvent באמצעות התבנית gcf-event:
cd .. mkdir HelloGcs cd HelloGcs dotnet new gcf-event
יצירת פרויקט וקובץ Function.cs בתגובה לבקשות CloudEvent. הוא גם מנתח את הנתונים של CloudEvent ומעביר אותם אל StorageObjectData.
משנים את מסגרת היעד ל-net8.0 בקובץ .csproj:
<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:

מפעילים את הפונקציה על ידי העלאת קובץ לקטגוריית האחסון:
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
תצרו ותפרסו פונקציית CloudEvent שמגיבה לאירועים ב-Cloud Pub/Sub.
קודם כול, יוצרים נושא ב-Cloud Pub/Sub שישדר אירועים:
TOPIC_NAME=cloud-functions-topic
gcloud pubsub topics create ${TOPIC_NAME}
יוצרים פונקציית CloudEvent באמצעות התבנית gcf-event:
cd .. mkdir HelloPubSub cd HelloPubSub dotnet new gcf-event
יצירת פרויקט וקובץ Function.cs בתגובה לבקשות CloudEvent. בנוסף, המערכת מנתחת את הנתונים של CloudEvent ל-StorageObjectData כברירת מחדל.
משנים את מסגרת היעד ל-net8.0 בקובץ .csproj:
<TargetFramework>net8.0</TargetFramework>
משנים את StorageObjectData ל-MessagePublishedData כדי לנתח הודעות Pub/Sub. שינוי של 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:

מפעילים את הפונקציה על ידי פרסום הודעה בנושא:
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 לא מוקלדת.
יוצרים פונקציית CloudEvent באמצעות התבנית gcf-untyped-event:
cd .. mkdir HelloUntyped cd HelloUntyped dotnet new gcf-untyped-event
כך נוצר פרויקט וקובץ Function.cs שמגיב לבקשות CloudEvent בלי לנסות לנתח את הנתונים של CloudEvent.
משנים את מסגרת היעד ל-net8.0 בקובץ .csproj:
<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:

מפעילים את הפונקציה על ידי העלאת קובץ לקטגוריית האחסון:
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. מעולה!
כל הכבוד, סיימתם את ה-Codelab.
מה נכלל
- Functions Framework for .NET.
- איך כותבים פונקציית HTTP ב-Cloud Functions.
- איך כותבים פונקציית CloudEvent שמגיבה לאירועים ב-Cloud Storage.
- איך כותבים פונקציית CloudEvent שמגיבה לאירועים של Cloud Pub/Sub.
- איך כותבים פונקציית CloudEvent שמגיבה לכל סוג של אירוע.