1. บทนำ
ฟังก์ชัน Google Cloud Run เป็นแพลตฟอร์มการประมวลผลแบบ Serverless ที่ขับเคลื่อนด้วยเหตุการณ์ ฟังก์ชัน Cloud Run ช่วยให้คุณเขียนโค้ดได้โดยไม่ต้องกังวลเรื่องการจัดสรรทรัพยากรหรือการปรับขนาดเพื่อรองรับข้อกำหนดที่เปลี่ยนแปลงไป
ฟังก์ชัน Cloud Run มี 2 ประเภท ได้แก่
- ฟังก์ชัน HTTP จะตอบกลับคำขอ HTTP
- ฟังก์ชันเหตุการณ์จะทริกเกอร์โดยเหตุการณ์ต่างๆ เช่น การเผยแพร่ข้อความไปยัง Cloud Pub/Sub หรือการอัปโหลดไฟล์ไปยัง Cloud Storage

Codelab นี้จะแนะนำวิธีสร้างฟังก์ชัน Cloud Run ของคุณเองใน C# กล่าวโดยละเอียดคือ คุณจะทําการติดตั้งใช้งานฟังก์ชัน C# ที่ตอบสนองต่อ HTTP และ CloudEvents จากแหล่งที่มาต่างๆ ของ Google Cloud
สิ่งที่คุณจะได้เรียนรู้
- Functions Framework สำหรับ .NET
- วิธีเขียนฟังก์ชัน HTTP
- วิธีเขียนฟังก์ชันที่ทริกเกอร์เหตุการณ์เพื่อตอบสนองต่อเหตุการณ์ใน Cloud Storage
- วิธีเขียนฟังก์ชันที่ทริกเกอร์เหตุการณ์เพื่อตอบสนองต่อเหตุการณ์ Cloud Pub/Sub
- วิธีเขียนฟังก์ชันที่ทริกเกอร์เหตุการณ์เพื่อตอบสนองต่อเหตุการณ์ทุกประเภท
2. การตั้งค่าและข้อกำหนด
การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง
- ลงชื่อเข้าใช้ Google Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี



- ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ โดยคุณจะอัปเดตได้ทุกเมื่อ
- รหัสโปรเจ็กต์ต้องไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและเปลี่ยนแปลงไม่ได้ (เปลี่ยนไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งโดยปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นคืออะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยปกติจะระบุเป็น
PROJECT_ID) หากไม่ชอบรหัสที่สร้างขึ้น คุณก็สร้างรหัสแบบสุ่มอีกรหัสหนึ่งได้ หรือคุณจะลองใช้ชื่อของคุณเองเพื่อดูว่าพร้อมใช้งานหรือไม่ก็ได้ คุณจะเปลี่ยนแปลงรหัสนี้หลังจากขั้นตอนนี้ไม่ได้ และรหัสจะยังคงอยู่ตลอดระยะเวลาของโปรเจ็กต์ - โปรดทราบว่ายังมีค่าที่ 3 ซึ่งคือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 นี้ได้ในเอกสารประกอบ
- จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตาม Codelab นี้ไม่ควรมีค่าใช้จ่ายมากนัก หรืออาจไม่มีเลย หากต้องการปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างขึ้นหรือลบทั้งโปรเจ็กต์ได้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD
เริ่มต้น Cloud Shell
แม้ว่าคุณจะใช้งาน Google Cloud จากระยะไกลจากแล็ปท็อปได้ แต่ใน Codelab นี้คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์
จาก Google Cloud Console ให้คลิกไอคอน Cloud Shell ในแถบเครื่องมือด้านขวาบน

การจัดสรรและเชื่อมต่อกับสภาพแวดล้อมจะใช้เวลาเพียงไม่กี่นาที เมื่อเสร็จแล้ว คุณควรเห็นข้อความคล้ายกับตัวอย่างต่อไปนี้

เครื่องเสมือนนี้มาพร้อมเครื่องมือพัฒนาซอฟต์แวร์ทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักแบบถาวรขนาด 5 GB และทำงานบน 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 (roles/eventarc.eventReceiver) ในโปรเจ็กต์แก่บัญชีบริการที่เชื่อมโยงกับทริกเกอร์ Eventarc เพื่อให้ทริกเกอร์รับเหตุการณ์จากผู้ให้บริการเหตุการณ์ได้
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. Functions Framework สำหรับ .NET
Functions Framework สำหรับ .NET เป็นเฟรมเวิร์ก FaaS (ฟังก์ชันเป็นบริการ) แบบโอเพนซอร์สสำหรับเขียนฟังก์ชัน .NET แบบพกพา ซึ่งทีม Google Cloud Functions เป็นผู้พัฒนา
Functions Framework ช่วยให้คุณเขียนฟังก์ชันที่มีน้ำหนักเบาซึ่งทำงานในสภาพแวดล้อมต่างๆ ได้มากมาย ซึ่งรวมถึง
- ฟังก์ชัน Google Cloud Run
- เครื่องพัฒนาในพื้นที่
- Cloud Run และ Cloud Run บน GKE
- สภาพแวดล้อมที่ใช้ Knative
ในโค้ดแล็บนี้ คุณจะได้ใช้ Functions Framework สำหรับ .NET และเทมเพลตเพื่อสร้างและทำให้ Cloud Functions ใช้งานได้ใน C#
ใน Cloud Shell ให้เรียกใช้คำสั่งต่อไปนี้เพื่อติดตั้งเทมเพลต Cloud Functions สำหรับ dotnet
dotnet new install Google.Cloud.Functions.Templates
ซึ่งจะติดตั้งเทมเพลต 3 รายการสำหรับ 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. ฟังก์ชัน 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 รุ่นที่ 2 ให้ใช้คำสั่งต่อไปนี้
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)
ก่อนอื่น ให้สร้าง Bucket ของ Cloud Storage นี่คือที่เก็บข้อมูลที่คุณจะใช้ฟังเหตุการณ์ในภายหลัง
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 รุ่นที่ 2 คุณสามารถใช้คำสั่งต่อไปนี้เพื่อติดตั้งใช้งานฟังก์ชันโดยใช้แฟล็ก 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
หลังจากผ่านไป 2-3 นาที ฟังก์ชันควรปรากฏใน Cloud Console ดังนี้

ทริกเกอร์ฟังก์ชันโดยการอัปโหลดไฟล์ไปยัง Bucket ของพื้นที่เก็บข้อมูล
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
สำหรับฟังก์ชันรุ่นที่ 2 คุณสามารถเรียกใช้คำสั่งนี้ได้
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 รุ่นที่ 2 คุณสามารถใช้คำสั่งต่อไปนี้เพื่อติดตั้งใช้งานฟังก์ชันโดยใช้แฟล็ก trigger-topic
gcloud functions deploy hello-pubsub-function \
--allow-unauthenticated \
--entry-point HelloPubSub.Function \
--gen2 \
--region us-central1 \
--runtime dotnet8 \
--trigger-topic ${TOPIC_NAME}
หลังจากผ่านไป 2-3 นาที ฟังก์ชันควรปรากฏใน 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
สำหรับฟังก์ชันรุ่นที่ 2 คุณสามารถเรียกใช้คำสั่งนี้ได้
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 รุ่นที่ 2 คุณสามารถใช้คำสั่งต่อไปนี้เพื่อติดตั้งใช้งานฟังก์ชันโดยใช้แฟล็ก 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}
ฟังก์ชันจะทริกเกอร์เมื่อมีการอัปโหลดไฟล์ไปยัง Bucket ของพื้นที่เก็บข้อมูล
หลังจากผ่านไป 2-3 นาที ฟังก์ชันควรปรากฏใน Cloud Console ดังนี้

ทริกเกอร์ฟังก์ชันโดยการอัปโหลดไฟล์ไปยัง Bucket ของพื้นที่เก็บข้อมูล
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
สำหรับฟังก์ชันรุ่นที่ 2 คุณสามารถเรียกใช้คำสั่งนี้ได้
gcloud functions logs read hello-untyped-function \
--gen2 \
--region us-central1
9. ยินดีด้วย
ขอแสดงความยินดีที่ทำ Codelab เสร็จสมบูรณ์
สิ่งที่เราได้พูดถึง
- Functions Framework สำหรับ .NET
- วิธีเขียน HTTP Cloud Function
- วิธีเขียนฟังก์ชัน CloudEvent ที่ตอบสนองต่อเหตุการณ์ Cloud Storage
- วิธีเขียนฟังก์ชัน CloudEvent ที่ตอบสนองต่อเหตุการณ์ Cloud Pub/Sub
- วิธีเขียนฟังก์ชัน CloudEvent ที่ตอบสนองต่อเหตุการณ์ทุกประเภท