เกี่ยวกับ Codelab นี้
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
ที่มีพื้นหลังสีส้ม
เผยแพร่การแก้ไขครั้งที่ 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
ที่มีพื้นหลังสีเหลือง
แยกการเข้าชม 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 สาธารณะของฟังก์ชัน คุณควรเห็นการแก้ไขสีส้มครึ่งหนึ่งและการแก้ไขสีเหลืองอีกครึ่งหนึ่ง
ดูข้อมูลเพิ่มเติมได้ที่การย้อนกลับ การเปิดตัวแบบค่อยเป็นค่อยไป และการย้ายข้อมูลการเข้าชม
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 ด้วยอินสแตนซ์ขั้นต่ำ