เกี่ยวกับ Codelab นี้
1 บทนำ
ฟังก์ชัน Google Cloud Run เป็นแพลตฟอร์มการประมวลผลแบบ Serverless ที่ขับเคลื่อนด้วยเหตุการณ์ ฟังก์ชัน Cloud Run ช่วยให้คุณเขียนโค้ดได้โดยไม่ต้องกังวลเกี่ยวกับการเตรียมทรัพยากรหรือการขยายขนาดเพื่อรองรับข้อกำหนดที่เปลี่ยนแปลงไป
ฟังก์ชัน Cloud Run มี 2 ประเภท ได้แก่
- ฟังก์ชัน HTTP จะตอบสนองต่อคำขอ HTTP
- ฟังก์ชันเหตุการณ์จะทริกเกอร์โดยเหตุการณ์ เช่น ข้อความที่เผยแพร่ไปยัง Cloud Pub/Sub หรือไฟล์ที่อัปโหลดไปยัง Cloud Storage
โค้ดแล็บนี้จะแนะนำการสร้างฟังก์ชัน 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 จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นจะเป็นอะไร ในโค้ดแล็บส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยปกติจะระบุเป็น
PROJECT_ID
) หากไม่ชอบรหัสที่สร้างขึ้น คุณก็สร้างรหัสอื่นแบบสุ่มได้ หรือจะลองใช้อุปกรณ์ของคุณเองเพื่อดูว่าฟีเจอร์นี้พร้อมใช้งานหรือไม่ก็ได้ คุณจะเปลี่ยนแปลงชื่อหลังจากขั้นตอนนี้ไม่ได้ และชื่อดังกล่าวจะคงอยู่ตลอดระยะเวลาของโปรเจ็กต์ - โปรดทราบว่ามีค่าที่ 3 ซึ่งเป็นหมายเลขโปรเจ็กต์ที่ API บางรายการใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 รายการนี้ได้ในเอกสารประกอบ
- ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตามโค้ดแล็บนี้ไม่น่าจะเสียค่าใช้จ่ายมากนัก หากต้องการปิดใช้ทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินหลังจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างไว้หรือลบทั้งโปรเจ็กต์ได้ ผู้ใช้ใหม่ของ Google Cloud มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD
เริ่ม Cloud Shell
แม้ว่า Google Cloud จะทำงานจากระยะไกลจากแล็ปท็อปได้ แต่ในโค้ดแล็บนี้ คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์
จากคอนโซล Google Cloud ให้คลิกไอคอน Cloud Shell ในแถบเครื่องมือด้านขวาบน
การจัดสรรและเชื่อมต่อกับสภาพแวดล้อมจะใช้เวลาเพียงไม่กี่นาที เมื่อดำเนินการเสร็จแล้ว คุณควรเห็นข้อมูลดังต่อไปนี้
เครื่องเสมือนนี้โหลดเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ ซึ่งจะมีไดเรกทอรีหลักขนาด 5 GB ถาวรและทำงานบน 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 (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 สำหรับ .NET เป็นเฟรมเวิร์ก FaaS (Function as a Service) แบบโอเพนซอร์สสําหรับเขียนฟังก์ชัน .NET ที่นําไปใช้ได้กับหลายแพลตฟอร์ม ซึ่งทีม Google Cloud Functions เป็นผู้นําเสนอ
เฟรมเวิร์กฟังก์ชันช่วยให้คุณเขียนฟังก์ชันที่มีน้ำหนักเบาซึ่งทำงานได้ในสภาพแวดล้อมต่างๆ มากมาย ซึ่งรวมถึง
- ฟังก์ชัน Google Cloud Run
- เครื่องสำหรับพัฒนาซอฟต์แวร์ของคุณ
- Cloud Run และ Cloud Run บน GKE
- สภาพแวดล้อมที่อิงตาม Knative
ในโค้ดแล็บนี้ คุณจะใช้เฟรมเวิร์ก Functions สำหรับ .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)
ก่อนอื่น ให้สร้างที่เก็บข้อมูล 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 ให้ใช้คําสั่งต่อไปนี้เพื่อเผยแพร่ฟังก์ชันโดยใช้ Flag 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
ทริกเกอร์ฟังก์ชันโดยการอัปโหลดไฟล์ไปยังที่เก็บข้อมูลของพื้นที่เก็บข้อมูล
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 ให้ใช้คำสั่งต่อไปนี้เพื่อทำให้ฟังก์ชันใช้งานได้โดยใช้ Flag 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 โดยใช้เทมเพลต 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 ให้ใช้คําสั่งต่อไปนี้เพื่อเผยแพร่ฟังก์ชันโดยใช้ Flag 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}
ฟังก์ชันจะทริกเกอร์เมื่อมีการอัปโหลดไฟล์ไปยังที่เก็บข้อมูลของพื้นที่เก็บข้อมูล
หลังจากผ่านไป 2-3 นาที ฟังก์ชันจะปรากฏใน Cloud Console
ทริกเกอร์ฟังก์ชันโดยการอัปโหลดไฟล์ไปยังที่เก็บข้อมูลของพื้นที่เก็บข้อมูล
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 ที่ตอบสนองต่อเหตุการณ์ประเภทใดก็ได้