เริ่มต้นใช้งานฟังก์ชัน Cloud Run

เริ่มต้นใช้งานฟังก์ชัน Cloud Run

เกี่ยวกับ Codelab นี้

subjectอัปเดตล่าสุดเมื่อ พ.ค. 7, 2025
account_circleเขียนโดย Mete Atamel

1 บทนำ

ภาพรวม

Cloud Run Functions เป็นข้อเสนอ Functions-as-a-Service ของ Google Cloud ที่ทำงานด้วย Cloud Run และ Eventarc ซึ่งช่วยให้คุณควบคุมประสิทธิภาพและความสามารถในการปรับขนาดได้มากขึ้น รวมถึงควบคุมรันไทม์ของฟังก์ชันและทริกเกอร์จากแหล่งที่มาของเหตุการณ์กว่า 90 รายการได้มากขึ้น

โค้ดแล็บนี้จะแนะนำการสร้างฟังก์ชัน Cloud Run ที่ตอบสนองต่อการเรียกใช้ HTTP และทริกเกอร์โดยข้อความ Pub/Sub และบันทึกการตรวจสอบ Cloud

นอกจากนี้ Codelab นี้ยังใช้การอัปเดตรูปภาพฐานอัตโนมัติสำหรับการนำฟังก์ชันไปใช้งานด้วย โดยระบุรูปภาพฐานโดยใช้ Flag --base-image การอัปเดตอิมเมจฐานอัตโนมัติสำหรับ Cloud Run ช่วยให้ Google สามารถสร้างแพตช์ความปลอดภัยให้กับระบบปฏิบัติการและคอมโพเนนต์รันไทม์ภาษาของอิมเมจฐานโดยอัตโนมัติ คุณไม่ต้องสร้างหรือปรับใช้บริการอีกครั้งเพื่อให้อัปเดตอิมเมจฐาน ดูข้อมูลเพิ่มเติมได้ที่การอัปเดตรูปภาพฐานอัตโนมัติ

หากไม่ต้องการใช้การอัปเดตรูปภาพฐานอัตโนมัติ ให้นำ Flag --base-image ออกจากตัวอย่างที่แสดงในโค้ดแล็บนี้

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

  • ภาพรวมของฟังก์ชัน Cloud Run และวิธีใช้การอัปเดตภาพฐานอัตโนมัติ
  • วิธีเขียนฟังก์ชันที่ตอบสนองต่อการเรียก HTTP
  • วิธีเขียนฟังก์ชันที่ตอบสนองต่อข้อความ Pub/Sub
  • วิธีเขียนฟังก์ชันที่ตอบสนองต่อเหตุการณ์ใน Cloud Storage
  • วิธีแยกการเข้าชมระหว่างการแก้ไข 2 ครั้ง
  • วิธีกำจัด Cold Start ด้วยอินสแตนซ์ขั้นต่ำ

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

สร้างโฟลเดอร์รูท

สร้างโฟลเดอร์รูทสำหรับตัวอย่างทั้งหมด

mkdir crf-codelab
cd crf-codelab

ตั้งค่าตัวแปรสภาพแวดล้อม

ตั้งค่าตัวแปรสภาพแวดล้อมที่จะใช้ใน Codelab นี้

gcloud config set project <YOUR-PROJECT-ID>
REGION=<YOUR_REGION>

PROJECT_ID=$(gcloud config get-value project)

เปิดใช้ API

เปิดใช้บริการที่จำเป็นทั้งหมด

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  eventarc.googleapis.com \
  run.googleapis.com \
  logging.googleapis.com \
  pubsub.googleapis.com

3 ฟังก์ชัน HTTP

สําหรับฟังก์ชันแรก ให้สร้างฟังก์ชัน Node.js ที่ตรวจสอบสิทธิ์แล้วซึ่งตอบสนองต่อคําขอ HTTP นอกจากนี้ เรายังใช้การหมดเวลา 10 นาทีเพื่อแสดงให้เห็นว่าฟังก์ชันมีเวลามากขึ้นในการตอบกลับคําขอ HTTP ได้อย่างไร

สร้าง

สร้างโฟลเดอร์สำหรับแอปและไปที่โฟลเดอร์ดังกล่าวโดยทำดังนี้

mkdir hello-http
cd hello-http

สร้างไฟล์ index.js ที่ตอบสนองต่อคําขอ HTTP

const functions = require('@google-cloud/functions-framework');

functions.http('helloWorld', (req, res) => {
  res.status(200).send('HTTP with Node.js in Cloud Run functions!');
});

สร้างไฟล์ package.json เพื่อระบุทรัพยากร Dependency

{
  "name": "nodejs-run-functions-codelab",
  "version": "0.0.1",
  "main": "index.js",
  "dependencies": {
    "@google-cloud/functions-framework": "^2.0.0"
  }
}

ทำให้ใช้งานได้

ทำให้ฟังก์ชันใช้งานได้โดยทำดังนี้

gcloud run deploy nodejs-run-function \
      --source . \
      --function helloWorld \
      --base-image nodejs22 \
      --region $REGION \
      --timeout 600 \
      --no-allow-unauthenticated

คำสั่งนี้ใช้ buildpack เพื่อเปลี่ยนรูปแบบซอร์สโค้ดของฟังก์ชันเป็นอิมเมจคอนเทนเนอร์ที่พร้อมใช้งานจริง

โปรดทราบว่า

  • Flag --source ใช้เพื่อบอก Cloud Run ให้สร้างฟังก์ชันเป็นบริการแบบคอนเทนเนอร์ที่เรียกใช้ได้
  • Flag --function (ใหม่) ใช้เพื่อตั้งค่าจุดแรกเข้าของบริการใหม่ให้เป็นลายเซ็นฟังก์ชันที่คุณต้องการเรียกใช้
  • Flag --base-image (ใหม่) จะระบุสภาพแวดล้อมของภาพฐานสําหรับฟังก์ชัน เช่น nodejs22, python312, go123, java21, dotnet8, ruby33 หรือ php83 ดูรายละเอียดเพิ่มเติมเกี่ยวกับรูปภาพฐานและแพ็กเกจที่รวมอยู่ในรูปภาพแต่ละรูปได้ที่รูปภาพฐานของรันไทม์
  • (ไม่บังคับ) Flag --timeout ช่วยให้ฟังก์ชันมีระยะหมดเวลาที่นานขึ้นเพื่อตอบสนองต่อคําขอ HTTP ในตัวอย่างนี้ ระบบใช้ 600 วินาทีเพื่อแสดงเวลาในการตอบสนอง 10 นาที
  • (ไม่บังคับ) --no-allow-unauthenticated เพื่อป้องกันไม่ให้เรียกใช้ฟังก์ชันแบบสาธารณะได้

ทดสอบ

ทดสอบฟังก์ชันด้วยคำสั่งต่อไปนี้

# get the Service URL
SERVICE_URL="$(gcloud run services describe nodejs-run-function --region $REGION --format 'value(status.url)')"

# invoke the service
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

คุณควรเห็นข้อความ HTTP with Node.js in Cloud Run functions! เป็นคำตอบ

4 ฟังก์ชัน Pub/Sub

สําหรับฟังก์ชันที่ 2 ให้สร้างฟังก์ชัน Python ที่ทริกเกอร์โดยข้อความ Pub/Sub ที่เผยแพร่ไปยังหัวข้อที่เฉพาะเจาะจง

ตั้งค่าโทเค็นการตรวจสอบสิทธิ์ Pub/Sub

หากคุณเปิดใช้บัญชีบริการ Pub/Sub ในวันที่ 8 เมษายน 2021 หรือก่อนหน้า ให้มอบบทบาท iam.serviceAccountTokenCreator ให้กับบัญชีบริการ Pub/Sub ดังนี้

PROJECT_NUMBER=$(gcloud projects list --filter="project_id:$PROJECT_ID" --format='value(project_number)')

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member  serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
  --role roles/iam.serviceAccountTokenCreator

สร้าง

สร้างหัวข้อ Pub/Sub เพื่อใช้กับตัวอย่าง

TOPIC=cloud-run-functions-pubsub-topic
gcloud pubsub topics create $TOPIC

สร้างโฟลเดอร์สำหรับแอปและไปที่โฟลเดอร์ดังกล่าวโดยทำดังนี้

mkdir ../hello-pubsub
cd ../hello-pubsub

สร้างไฟล์ main.py ที่บันทึกข้อความที่มีรหัส CloudEvent โดยทำดังนี้

import functions_framework

@functions_framework.cloud_event
def hello_pubsub(cloud_event):
   print('Pub/Sub with Python in Cloud Run functions! Id: ' + cloud_event['id'])

สร้างไฟล์ requirements.txt ที่มีเนื้อหาต่อไปนี้เพื่อระบุข้อกําหนด

functions-framework==3.*

ทำให้ใช้งานได้

ทำให้ฟังก์ชันใช้งานได้โดยทำดังนี้

gcloud run deploy python-pubsub-function \
       --source . \
       --function hello_pubsub \
       --base-image python313 \
       --region $REGION \
       --no-allow-unauthenticated

เรียกข้อมูลหมายเลขโปรเจ็กต์ที่จะใช้สำหรับข้อมูลประจำตัวของบัญชีบริการ

PROJECT_NUMBER=$(gcloud projects list --filter="project_id:$PROJECT_ID" --format='value(project_number)')

สร้างทริกเกอร์

gcloud eventarc triggers create python-pubsub-function-trigger  \
    --location=$REGION \
    --destination-run-service=python-pubsub-function  \
    --destination-run-region=$REGION \
    --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
    --transport-topic=projects/$PROJECT_ID/topics/$TOPIC \
    --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com

ทดสอบ

ทดสอบฟังก์ชันนี้โดยส่งข้อความไปยังหัวข้อ

gcloud pubsub topics publish $TOPIC --message="Hello World"

คุณควรเห็น CloudEvent ที่ได้รับในบันทึก

gcloud run services logs read python-pubsub-function --region $REGION --limit=10

5 ฟังก์ชัน Cloud Storage

สําหรับฟังก์ชันถัดไป มาดูการสร้างฟังก์ชัน Node.js ที่ตอบสนองต่อเหตุการณ์จากที่เก็บข้อมูล Cloud Storage

ตั้งค่า

หากต้องการใช้ฟังก์ชันของ Cloud Storage ให้มอบบทบาท pubsub.publisher IAM ให้กับบัญชีบริการ Cloud Storage โดยทำดังนี้

SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p $PROJECT_NUMBER)

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT \
  --role roles/pubsub.publisher

สร้าง

สร้างโฟลเดอร์สำหรับแอปและไปที่โฟลเดอร์ดังกล่าวโดยทำดังนี้

mkdir ../hello-storage
cd ../hello-storage

สร้างไฟล์ index.js ที่ตอบสนองต่อเหตุการณ์ Cloud Storage เพียงอย่างเดียว โดยทำดังนี้

const functions = require('@google-cloud/functions-framework');

functions.cloudEvent('helloStorage', (cloudevent) => {
  console.log('Cloud Storage event with Node.js in Cloud Run functions!');
  console.log(cloudevent);
});

สร้างไฟล์ package.json เพื่อระบุทรัพยากร Dependency

{
  "name": "nodejs-crf-cloud-storage",
  "version": "0.0.1",
  "main": "index.js",
  "dependencies": {
    "@google-cloud/functions-framework": "^2.0.0"
  }
}

ทำให้ใช้งานได้

ก่อนอื่นให้สร้างที่เก็บข้อมูล Cloud Storage (หรือใช้ที่เก็บข้อมูลที่มีอยู่) โดยทำดังนี้

export BUCKET_NAME="gcf-storage-$PROJECT_ID"
​​export BUCKET="gs://gcf-storage-$PROJECT_ID"
gsutil mb -l $REGION $BUCKET

ทำให้ฟังก์ชันใช้งานได้โดยทำดังนี้

gcloud run deploy nodejs-crf-cloud-storage \
 --source . \
 --base-image nodejs22 \
 --function helloStorage \
 --region $REGION \
 --no-allow-unauthenticated

เมื่อทำให้ฟังก์ชันใช้งานได้แล้ว คุณจะเห็นฟังก์ชันดังกล่าวในส่วน Cloud Run ของ Cloud Console

ตอนนี้ให้สร้างทริกเกอร์ Eventarc

BUCKET_REGION=$REGION

gcloud eventarc triggers create nodejs-crf-cloud-storage-trigger \
  --location=$BUCKET_REGION \
  --destination-run-service=nodejs-crf-cloud-storage \
  --destination-run-region=$REGION \
  --event-filters="type=google.cloud.storage.object.v1.finalized" \
  --event-filters="bucket=$BUCKET_NAME" \
  --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com

ทดสอบ

ทดสอบฟังก์ชันโดยการอัปโหลดไฟล์ไปยังที่เก็บข้อมูล ดังนี้

echo "Hello World" > random.txt
gsutil cp random.txt $BUCKET/random.txt

คุณควรเห็น CloudEvent ที่ได้รับในบันทึก

gcloud run services logs read nodejs-crf-cloud-storage --region $REGION --limit=10

6 การแยกการเข้าชม

ฟังก์ชัน Cloud Run รองรับการแก้ไขฟังก์ชันหลายเวอร์ชัน การแยกการรับส่งข้อมูลระหว่างการแก้ไขเวอร์ชันต่างๆ และการย้อนกลับฟังก์ชันไปยังเวอร์ชันก่อนหน้า

ในขั้นตอนนี้ คุณจะทําให้ฟังก์ชันเวอร์ชันที่แก้ไขแล้ว 2 เวอร์ชันใช้งานได้ แล้วแยกการเข้าชมระหว่างเวอร์ชันต่างๆ ออกเป็น 50:50

สร้าง

สร้างโฟลเดอร์สำหรับแอปและไปที่โฟลเดอร์ดังกล่าวโดยทำดังนี้

mkdir ../traffic-splitting
cd ../traffic-splitting

สร้างไฟล์ main.py ด้วยฟังก์ชัน Python ที่อ่านตัวแปรสภาพแวดล้อมสีและตอบกลับด้วย Hello World ในสีพื้นหลังนั้น ดังนี้

import os

color = os.environ.get('COLOR')

def hello_world(request):
    return f'<body style="background-color:{color}"><h1>Hello World!</h1></body>'

สร้างไฟล์ requirements.txt ที่มีเนื้อหาต่อไปนี้เพื่อระบุข้อกําหนด

functions-framework==3.*

ทำให้ใช้งานได้

ติดตั้งใช้งานการแก้ไขครั้งแรกของฟังก์ชันที่มีพื้นหลังสีส้ม

COLOR=orange
gcloud run deploy hello-world-colors \
 --source . \
 --base-image python313 \
 --function hello_world \
 --region $REGION \
 --allow-unauthenticated \
 --update-env-vars COLOR=$COLOR

เมื่อถึงจุดนี้ หากคุณทดสอบฟังก์ชันโดยดูทริกเกอร์ HTTP (เอาต์พุต URI ของคำสั่งการทำให้ใช้งานได้ข้างต้น) ในเบราว์เซอร์ คุณควรเห็น Hello World ที่มีพื้นหลังสีส้ม

36ca0c5f39cc89cf.png

เผยแพร่การแก้ไขครั้งที่ 2 ที่มีพื้นหลังสีเหลือง

COLOR=yellow
gcloud run deploy hello-world-colors \
 --source . \
 --base-image python313 \
 --function hello_world \
 --region $REGION \
 --allow-unauthenticated \
 --update-env-vars COLOR=$COLOR

เนื่องจากนี่เป็นการแก้ไขล่าสุด หากคุณทดสอบฟังก์ชันนี้ คุณควรเห็น Hello World ที่มีพื้นหลังสีเหลือง

391286a08ad3cdde.png

แยกการเข้าชม 50-50

หากต้องการแยกการเข้าชมระหว่างการแก้ไขสีส้มและสีเหลือง คุณต้องค้นหารหัสการแก้ไขของบริการ Cloud Run คำสั่งเพื่อดูรหัสการแก้ไข

gcloud run revisions list --service hello-world-colors \
  --region $REGION --format 'value(REVISION)'

เอาต์พุตควรมีลักษณะคล้ายกับตัวอย่างต่อไปนี้

hello-world-colors-00001-man
hello-world-colors-00002-wok

จากนั้นให้แบ่งการเข้าชมระหว่างการแก้ไข 2 รายการนี้ดังนี้ (อัปเดต X-XXX ตามชื่อการแก้ไข)

gcloud run services update-traffic hello-world-colors \
  --region $REGION \
  --to-revisions hello-world-colors-0000X-XXX=50,hello-world-colors-0000X-XXX=50

ทดสอบ

ทดสอบฟังก์ชันโดยไปที่ URL สาธารณะของฟังก์ชัน คุณควรเห็นการแก้ไขสีส้มครึ่งหนึ่งและการแก้ไขสีเหลืองอีกครึ่งหนึ่ง

36ca0c5f39cc89cf.png 391286a08ad3cdde.png

ดูข้อมูลเพิ่มเติมได้ที่การย้อนกลับ การเปิดตัวแบบค่อยเป็นค่อยไป และการย้ายข้อมูลการเข้าชม

7 จำนวนอินสแตนซ์ขั้นต่ำ

ในฟังก์ชัน Cloud Run คุณสามารถระบุจำนวนอินสแตนซ์ฟังก์ชันขั้นต่ำที่จะเก็บไว้และพร้อมให้บริการตามคำขอ ซึ่งมีประโยชน์ในการจํากัดจํานวนการเริ่มต้นแบบ Cold Start

ในขั้นตอนนี้ คุณจะนำฟังก์ชันที่มีการจัดเตรียมเริ่มต้นช้าๆ ไปใช้งาน คุณจะเห็นปัญหาการเริ่มแอปแบบ Cold Start จากนั้นคุณจะติดตั้งใช้งานฟังก์ชันโดยตั้งค่าอินสแตนซ์ขั้นต่ำเป็น 1 เพื่อกำจัดปัญหา Cold Start

สร้าง

สร้างโฟลเดอร์สำหรับแอปและไปยังโฟลเดอร์ดังกล่าว

mkdir ../min-instances
cd ../min-instances

สร้างไฟล์ main.go บริการ Go นี้มีฟังก์ชัน init ที่หยุดทำงานเป็นเวลา 10 วินาทีเพื่อจำลองการเริ่มต้นที่ใช้เวลานาน นอกจากนี้ยังมีฟังก์ชัน HelloWorld ที่ตอบสนองต่อการเรียก HTTP ดังนี้

package p

import (
        "fmt"
        "net/http"
        "time"
)

func init() {
        time.Sleep(10 * time.Second)
}

func HelloWorld(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Slow HTTP Go in Cloud Run functions!")
}

ทำให้ใช้งานได้

ติดตั้งใช้งานฟังก์ชันฉบับแก้ไขครั้งแรกซึ่งมีค่าอินสแตนซ์ขั้นต่ำเริ่มต้นเป็น 0

gcloud run deploy go-slow-function \
 --source . \
 --base-image go123 \
 --function HelloWorld \
 --region $REGION \
 --no-allow-unauthenticated

ทดสอบฟังก์ชันด้วยคําสั่งนี้

# get the Service URL
SERVICE_URL="$(gcloud run services describe go-slow-function --region $REGION --format 'value(status.url)')"

# invoke the service
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

คุณจะสังเกตเห็นความล่าช้า 10 วินาที (การเริ่มต้นแบบเย็น) ในการโทรครั้งแรก จากนั้นจะเห็นข้อความ การโทรครั้งต่อๆ ไปควรแสดงผลทันที

กำหนดอินสแตนซ์ขั้นต่ำ

หากต้องการกำจัดการเริ่มต้นครั้งแรกในคำขอแรก ให้ทําให้การทํางานกลับมาใช้งานได้อีกครั้งโดยตั้งค่า Flag --min-instances เป็น 1 ดังนี้

gcloud run deploy go-slow-function \
 --source . \
 --base-image go123 \
 --function HelloWorld \
 --region $REGION \
 --no-allow-unauthenticated \
 --min-instances 1

ทดสอบ

ทดสอบฟังก์ชันอีกครั้ง

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

คุณไม่ควรเห็นความล่าช้า 10 วินาทีในคำขอแรกอีกต่อไป ปัญหาการเริ่มต้นแบบ Cold Start ในการเรียกใช้ครั้งแรก (หลังจากไม่มีการใช้งานเป็นเวลานาน) หายไปแล้ว ขอบคุณอินสแตนซ์ขั้นต่ำ

ดูข้อมูลเพิ่มเติมที่การใช้อินสแตนซ์ขั้นต่ำ

8 ยินดีด้วย

ยินดีด้วยที่ทํา Codelab จนเสร็จสมบูรณ์

สิ่งที่เราได้พูดถึง

  • ภาพรวมของฟังก์ชัน Cloud Run และวิธีใช้การอัปเดตภาพฐานอัตโนมัติ
  • วิธีเขียนฟังก์ชันที่ตอบสนองต่อการเรียก HTTP
  • วิธีเขียนฟังก์ชันที่ตอบสนองต่อข้อความ Pub/Sub
  • วิธีเขียนฟังก์ชันที่ตอบสนองต่อเหตุการณ์ใน Cloud Storage
  • วิธีแยกการเข้าชมระหว่างการแก้ไข 2 ครั้ง
  • วิธีกำจัด Cold Start ด้วยอินสแตนซ์ขั้นต่ำ