ฟังก์ชัน Google Cloud ใน C#

1. บทนำ

ฟังก์ชัน Google Cloud Run เป็นแพลตฟอร์มการประมวลผลแบบ Serverless ที่ขับเคลื่อนด้วยเหตุการณ์ ฟังก์ชัน Cloud Run ช่วยให้คุณเขียนโค้ดได้โดยไม่ต้องกังวลเรื่องการจัดสรรทรัพยากรหรือการปรับขนาดเพื่อรองรับข้อกำหนดที่เปลี่ยนแปลงไป

ฟังก์ชัน Cloud Run มี 2 ประเภท ได้แก่

  • ฟังก์ชัน HTTP จะตอบกลับคำขอ HTTP
  • ฟังก์ชันเหตุการณ์จะทริกเกอร์โดยเหตุการณ์ต่างๆ เช่น การเผยแพร่ข้อความไปยัง Cloud Pub/Sub หรือการอัปโหลดไฟล์ไปยัง Cloud Storage

efb3268e3b74ed4f.png

Codelab นี้จะแนะนำวิธีสร้างฟังก์ชัน Cloud Run ของคุณเองใน C# กล่าวโดยละเอียดคือ คุณจะทําการติดตั้งใช้งานฟังก์ชัน C# ที่ตอบสนองต่อ HTTP และ CloudEvents จากแหล่งที่มาต่างๆ ของ Google Cloud

สิ่งที่คุณจะได้เรียนรู้

  • Functions Framework สำหรับ .NET
  • วิธีเขียนฟังก์ชัน HTTP
  • วิธีเขียนฟังก์ชันที่ทริกเกอร์เหตุการณ์เพื่อตอบสนองต่อเหตุการณ์ใน Cloud Storage
  • วิธีเขียนฟังก์ชันที่ทริกเกอร์เหตุการณ์เพื่อตอบสนองต่อเหตุการณ์ Cloud Pub/Sub
  • วิธีเขียนฟังก์ชันที่ทริกเกอร์เหตุการณ์เพื่อตอบสนองต่อเหตุการณ์ทุกประเภท

2. การตั้งค่าและข้อกำหนด

การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง

  1. ลงชื่อเข้าใช้ Google Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

เริ่มต้น Cloud Shell

แม้ว่าคุณจะใช้งาน Google Cloud จากระยะไกลจากแล็ปท็อปได้ แต่ใน Codelab นี้คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์

จาก Google Cloud Console ให้คลิกไอคอน Cloud Shell ในแถบเครื่องมือด้านขวาบน

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

เครื่องเสมือนนี้มาพร้อมเครื่องมือพัฒนาซอฟต์แวร์ทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักแบบถาวรขนาด 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 ดังนี้

c28654d74bb31420.png

ทริกเกอร์ฟังก์ชันโดยการอัปโหลดไฟล์ไปยัง 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 ดังนี้

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

สำหรับฟังก์ชันรุ่นที่ 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 ดังนี้

afe56530826787c6.png

ทริกเกอร์ฟังก์ชันโดยการอัปโหลดไฟล์ไปยัง 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 ที่ตอบสนองต่อเหตุการณ์ทุกประเภท