1. บทนำ
หากต้องการเริ่มต้นเขียนฟังก์ชัน Cloud Run ให้ใช้ Codelab ต่อไปนี้
หรือดูวิธีสร้าง Cloud Functions (รุ่นที่ 2) ในโค้ดแล็บนี้
ภาพรวม
Cloud Functions (รุ่นที่ 2) เป็นเวอร์ชันถัดไปของ Google Cloud Functions ซึ่งเป็นข้อเสนอ Functions-as-a-Service ของ Google Cloud เวอร์ชันใหม่นี้มาพร้อมกับชุดฟีเจอร์ขั้นสูงและขับเคลื่อนโดย Cloud Run และ Eventarc ซึ่งจะช่วยให้คุณควบคุมประสิทธิภาพและการขยายขนาดได้มากขึ้น รวมถึงควบคุมรันไทม์ของฟังก์ชันและทริกเกอร์จากแหล่งที่มาของเหตุการณ์กว่า 90 รายการได้มากขึ้น
โค้ดแล็บนี้จะแนะนำการสร้าง Cloud Functions ที่ตอบสนองต่อการเรียกใช้ HTTP และทริกเกอร์โดยข้อความ Pub/Sub และบันทึกการตรวจสอบ Cloud
มีอะไรใหม่
Cloud Functions เวอร์ชันใหม่นี้มอบประสบการณ์การใช้งาน FaaS ที่ปรับปรุงให้ดียิ่งขึ้นโดยทำงานร่วมกับ Cloud Run, Cloud Build, Artifact Registry และ Eventarc
โครงสร้างพื้นฐานที่ปรับปรุงแล้ว
- การประมวลผลการร้องขอนานขึ้น: เรียกใช้ Cloud Functions ได้นานกว่าค่าเริ่มต้น 5 นาที ซึ่งช่วยให้เรียกใช้ปริมาณงานที่ร้องขอได้นานขึ้น เช่น การประมวลผลสตรีมข้อมูลขนาดใหญ่จาก Cloud Storage หรือ BigQuery สําหรับฟังก์ชัน HTTP ระยะเวลาสูงสุดคือ 60 นาที สําหรับฟังก์ชันที่ทํางานตามเหตุการณ์ ปัจจุบันการดําเนินการนี้ใช้เวลาสูงสุด 10 นาที
- อินสแตนซ์ขนาดใหญ่ขึ้น: ใช้ประโยชน์จาก RAM สูงสุด 16 GB และ vCPU 4 ตัวใน Cloud Functions ซึ่งช่วยให้สามารถประมวลผลข้อมูลจำนวนมากในหน่วยความจำ ทำงานแบบขนานได้มากขึ้น และต้องใช้การประมวลผลมาก
- การเกิดขึ้นพร้อมกัน: ประมวลผลคำขอพร้อมกันได้สูงสุด 1, 000 รายการด้วยอินสแตนซ์ฟังก์ชันเดียว ซึ่งจะช่วยลดจำนวน Cold Start และปรับปรุงเวลาในการตอบสนองเมื่อปรับขนาด
- อินสแตนซ์ขั้นต่ำ: ระบุอินสแตนซ์ที่อุ่นไว้ล่วงหน้าเพื่อลดจำนวน Cold Start และตรวจสอบว่าเวลาเริ่มต้นของแอปพลิเคชันไม่ส่งผลต่อประสิทธิภาพของแอปพลิเคชัน
- การแยกการรับส่งข้อมูล: รองรับฟังก์ชันหลายเวอร์ชัน แยกการรับส่งข้อมูลระหว่างเวอร์ชันต่างๆ และเปลี่ยนฟังก์ชันกลับไปเป็นเวอร์ชันก่อนหน้า
การครอบคลุมเหตุการณ์ที่กว้างขึ้นและการรองรับ CloudEvents
- การผสานรวม Eventarc: ตอนนี้ Cloud Functions รองรับ Eventarc โดยค่าเริ่มต้น ซึ่งจะเพิ่มแหล่งที่มาของเหตุการณ์กว่า 90 รายการโดยใช้บันทึกการตรวจสอบระบบคลาวด์ (BigQuery, Cloud SQL, Cloud Storage...) และแน่นอนว่า Cloud Functions จะยังคงรองรับเหตุการณ์จากแหล่งที่มาที่กำหนดเองโดยการเผยแพร่ไปยัง Cloud Pub/Sub โดยตรง
- รูปแบบ CloudEvent: ฟังก์ชันที่ทำงานตามเหตุการณ์ทั้งหมดเป็นไปตามมาตรฐานอุตสาหกรรม CloudEvents ( cloudevents.io) ไม่ว่าจะมาจากแหล่งใดก็ตาม เพื่อให้นักพัฒนาแอปได้รับประสบการณ์การใช้งานที่สอดคล้องกัน ระบบจะส่งเพย์โหลดผ่าน CloudEvent ที่มีโครงสร้างซึ่งมีเพย์โหลด cloudevent.data และใช้มาตรฐาน CloudEvent
สิ่งที่คุณจะได้เรียนรู้
- ภาพรวมของ Cloud Functions (รุ่นที่ 2)
- วิธีเขียนฟังก์ชันที่ตอบสนองต่อการเรียก HTTP
- วิธีเขียนฟังก์ชันที่ตอบสนองต่อข้อความ Pub/Sub
- วิธีเขียนฟังก์ชันที่ตอบสนองต่อเหตุการณ์ใน Cloud Storage
- วิธีเขียนฟังก์ชันที่ตอบสนองต่อบันทึกการตรวจสอบระบบคลาวด์
- วิธีแยกการเข้าชมระหว่างการแก้ไข 2 ครั้ง
- วิธีกำจัด Cold Start ด้วยอินสแตนซ์ขั้นต่ำ
- วิธีตั้งค่าการเรียกใช้พร้อมกัน
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 ซึ่งจะช่วยเพิ่มประสิทธิภาพเครือข่ายและการรับรองได้อย่างมีประสิทธิภาพ คุณทํางานทั้งหมดในโค้ดแล็บนี้ได้ภายในเบราว์เซอร์ คุณไม่จำเป็นต้องติดตั้งอะไรเลย
ตั้งค่า gcloud
ใน Cloud Shell ให้ตรวจสอบว่าได้ตั้งค่ารหัสโปรเจ็กต์และบันทึกลงในตัวแปร PROJECT_ID
และตั้งค่า REGION
เป็น us-west1
แล้ว โดยทำดังนี้
gcloud config set project [YOUR-PROJECT-ID] PROJECT_ID=$(gcloud config get-value project) REGION=us-west1
เปิดใช้ API
เปิดใช้บริการที่จำเป็นทั้งหมด
gcloud services enable \ artifactregistry.googleapis.com \ cloudfunctions.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 $_
สร้างไฟล์ index.js
ที่ตอบสนองต่อคําขอ HTTP เพียงอย่างเดียว
const functions = require('@google-cloud/functions-framework'); functions.http('helloWorld', (req, res) => { res.status(200).send('HTTP with Node.js in GCF 2nd gen!'); });
สร้างไฟล์ package.json
เพื่อระบุทรัพยากร Dependency
{ "name": "nodejs-functions-gen2-codelab", "version": "0.0.1", "main": "index.js", "dependencies": { "@google-cloud/functions-framework": "^2.0.0" } }
ทำให้ใช้งานได้
ทำให้ฟังก์ชันใช้งานได้โดยทำดังนี้
gcloud functions deploy nodejs-http-function \ --gen2 \ --runtime nodejs16 \ --entry-point helloWorld \ --source . \ --region $REGION \ --trigger-http \ --timeout 600s
แม้ว่าจะไม่จำเป็นในขั้นตอนนี้ แต่โปรดทราบว่าการหมดเวลาคือ 600 วินาที ซึ่งจะช่วยให้ฟังก์ชันมีระยะหมดเวลาที่นานขึ้นเพื่อตอบสนองต่อคําขอ HTTP
เมื่อติดตั้งใช้งานฟังก์ชันแล้ว คุณจะเห็นฟังก์ชันในส่วน Cloud Functions ของ Cloud Console
ทดสอบ
ทดสอบฟังก์ชันด้วยคำสั่งต่อไปนี้
gcloud functions call nodejs-http-function \ --gen2 --region $REGION
คุณควรเห็นข้อความ HTTP with Node.js in GCF 2nd gen!
เป็นคำตอบ
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-functions-gen2-topic gcloud pubsub topics create $TOPIC
สร้างโฟลเดอร์สำหรับแอปและไปที่โฟลเดอร์ดังกล่าวโดยทำดังนี้
mkdir ~/hello-pubsub && cd $_
สร้างไฟล์ main.py
ที่บันทึกข้อความที่มีรหัส CloudEvent เท่านั้น
import functions_framework @functions_framework.cloud_event def hello_pubsub(cloud_event): print('Pub/Sub with Python in GCF 2nd gen! Id: ' + cloud_event['id'])
สร้างไฟล์ requirements.txt
ที่มีเนื้อหาต่อไปนี้เพื่อระบุทรัพยากร ดังนี้
functions-framework==3.*
ทำให้ใช้งานได้
ทำให้ฟังก์ชันใช้งานได้โดยทำดังนี้
gcloud functions deploy python-pubsub-function \ --gen2 \ --runtime python39 \ --entry-point hello_pubsub \ --source . \ --region $REGION \ --trigger-topic $TOPIC
เมื่อติดตั้งใช้งานฟังก์ชันแล้ว คุณจะเห็นฟังก์ชันในส่วน Cloud Functions ของ Cloud Console
ทดสอบ
ทดสอบฟังก์ชันนี้โดยส่งข้อความไปยังหัวข้อ
gcloud pubsub topics publish $TOPIC --message="Hello World"
คุณควรเห็น CloudEvent ที่ได้รับในบันทึก
gcloud functions logs read python-pubsub-function \ --region $REGION --gen2 --format "value(log)"
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 $_
สร้างไฟล์ index.js
ที่ตอบสนองต่อเหตุการณ์ใน Cloud Storage เพียงอย่างเดียว โดยทำดังนี้
const functions = require('@google-cloud/functions-framework'); functions.cloudEvent('helloStorage', (cloudevent) => { console.log('Cloud Storage event with Node.js in GCF 2nd gen!'); console.log(cloudevent); });
สร้างไฟล์ package.json
เพื่อระบุทรัพยากร Dependency
{ "name": "nodejs-functions-gen2-codelab", "version": "0.0.1", "main": "index.js", "dependencies": { "@google-cloud/functions-framework": "^2.0.0" } }
ทำให้ใช้งานได้
ก่อนอื่นให้สร้างที่เก็บข้อมูล Cloud Storage (หรือใช้ที่เก็บข้อมูลที่มีอยู่) โดยทำดังนี้
export BUCKET="gs://gcf-gen2-storage-$PROJECT_ID" gsutil mb -l $REGION $BUCKET
ทำให้ฟังก์ชันใช้งานได้โดยทำดังนี้
gcloud functions deploy nodejs-storage-function \ --gen2 \ --runtime nodejs16 \ --entry-point helloStorage \ --source . \ --region $REGION \ --trigger-bucket $BUCKET \ --trigger-location $REGION
เมื่อทำให้ฟังก์ชันใช้งานได้แล้ว คุณจะเห็นฟังก์ชันในส่วน Cloud Functions ของ Cloud Console
ทดสอบ
ทดสอบฟังก์ชันโดยการอัปโหลดไฟล์ไปยังที่เก็บข้อมูล ดังนี้
echo "Hello World" > random.txt gsutil cp random.txt $BUCKET/random.txt
คุณควรเห็น CloudEvent ที่ได้รับในบันทึก
gcloud functions logs read nodejs-storage-function \ --region $REGION --gen2 --limit=100 --format "value(log)"
6. ฟังก์ชันบันทึกการตรวจสอบ Cloud
สําหรับฟังก์ชันถัดไป ให้สร้างฟังก์ชัน Node.js ที่ได้รับเหตุการณ์ Cloud Audit Log เมื่อสร้างอินสแตนซ์ VM ของ Compute Engine การดำเนินการนี้จะเพิ่มป้ายกำกับลงใน VM ที่สร้างขึ้นใหม่ โดยระบุผู้สร้าง VM
ระบุ VM ของ Compute Engine ที่สร้างขึ้นใหม่
Compute Engine จะส่งบันทึกการตรวจสอบ 2 รายการเมื่อสร้าง VM
รายการแรกจะแสดงที่จุดเริ่มต้นของการสร้าง VM และมีลักษณะดังนี้
รายการที่ 2 จะแสดงหลังจากสร้าง VM และมีลักษณะดังนี้
สังเกตช่องการดำเนินการที่มีค่า first: true
และ last: true
บันทึกการตรวจสอบที่ 2 มีข้อมูลทั้งหมดที่เราต้องใช้ติดป้ายกำกับอินสแตนซ์ ดังนั้นเราจะใช้ Flag last: true
เพื่อตรวจหาใน Cloud Functions
ตั้งค่า
หากต้องการใช้ฟังก์ชันบันทึกการตรวจสอบของ Cloud คุณต้องเปิดใช้บันทึกการตรวจสอบสําหรับ Eventarc นอกจากนี้ คุณต้องใช้บัญชีบริการที่มีบทบาท eventarc.eventReceiver
ด้วย
- เปิดใช้บันทึกการตรวจสอบระบบคลาวด์ ประเภทบันทึกการอ่านของผู้ดูแลระบบ การอ่านข้อมูล และการเขียนข้อมูลสำหรับ Compute Engine API
- มอบบทบาท
eventarc.eventReceiver
IAM ต่อไปนี้ให้กับบัญชีบริการ Compute Engine เริ่มต้น
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role roles/eventarc.eventReceiver
รับโค้ด
โคลนรีโปที่มีแอปพลิเคชัน
git clone https://github.com/GoogleCloudPlatform/eventarc-samples.git
ไปที่ไดเรกทอรีแอปด้วยคำสั่งต่อไปนี้
cd eventarc-samples/gce-vm-labeler/gcf/nodejs
ไฟล์ index.js
มีโค้ดแอปพลิเคชันที่รับบันทึกการตรวจสอบซึ่งรวมอยู่ใน CloudEvent จากนั้นจะดึงรายละเอียดอินสแตนซ์ VM ของ Compute Engine และตั้งค่าป้ายกำกับในอินสแตนซ์ VM คุณสามารถศึกษา index.js
เพิ่มเติมด้วยตนเองได้
ทำให้ใช้งานได้
คุณสามารถทำให้ฟังก์ชันใช้งานได้ด้วย gcloud
เหมือนเดิม สังเกตวิธีที่ฟังก์ชันกรองบันทึกการตรวจสอบสําหรับการแทรก Compute Engine ด้วย Flag --trigger-event-filters
gcloud functions deploy gce-vm-labeler \ --gen2 \ --runtime nodejs16 \ --entry-point labelVmCreation \ --source . \ --region $REGION \ --trigger-event-filters="type=google.cloud.audit.log.v1.written,serviceName=compute.googleapis.com,methodName=beta.compute.instances.insert" \ --trigger-location us-central1
นอกจากนี้ คุณยังทำให้ฟังก์ชันใช้งานได้และเพิ่มทริกเกอร์ Eventarc จาก Google Cloud Console ได้ด้วย
ก่อนอื่น ให้ไปที่ส่วน Cloud Functions และสร้างฟังก์ชันที่มีสภาพแวดล้อมรุ่นที่ 2 โดยทำดังนี้
คลิกปุ่ม Add Eventarc Trigger
ซึ่งจะเปิดแผงด้านข้างทางด้านขวาที่คุณสามารถเลือกผู้ให้บริการเหตุการณ์และเหตุการณ์ต่างๆ สําหรับทริกเกอร์ Eventarc ได้
เลือกผู้ให้บริการและเหตุการณ์ที่เหมาะสม แล้วคลิก Save Trigger
สุดท้าย ในหน้าถัดไป คุณสามารถอัปเดตไฟล์ index.js
และ package.json
ด้วยไฟล์ index.js
และ package.json
ใน GitHub แล้วคลิกปุ่ม Deploy
ทดสอบ
หากต้องการทดสอบฟังก์ชันบันทึกการตรวจสอบ คุณต้องสร้าง VM ของ Compute Engine ใน Cloud Console (คุณสร้าง VM ด้วย gcloud
ได้ด้วย แต่ดูเหมือนว่าจะไม่สร้างบันทึกการตรวจสอบ)
ไปที่ส่วน Compute Engine > อินสแตนซ์ VM ของ Cloud Console แล้วสร้าง VM ใหม่ เมื่อสร้าง VM เสร็จแล้ว คุณควรเห็นป้ายกํากับ creator
ที่เพิ่มใน VM ในคอนโซลระบบคลาวด์ในส่วนข้อมูลพื้นฐาน หรือใช้คําสั่งต่อไปนี้
gcloud compute instances describe YOUR_VM_NAME
คุณควรเห็นป้ายกำกับในเอาต์พุตดังตัวอย่างต่อไปนี้
... labelFingerprint: ULU6pAy2C7s= labels: creator: atameldev ...
7. การแยกการเข้าชม
Cloud Functions (รุ่นที่ 2) รองรับการแก้ไขฟังก์ชันหลายเวอร์ชัน การแยกการรับส่งข้อมูลระหว่างการแก้ไขเวอร์ชันต่างๆ และการย้อนกลับฟังก์ชันไปยังเวอร์ชันก่อนหน้า ซึ่งเป็นไปได้เนื่องจากฟังก์ชันรุ่นที่ 2 เป็นบริการ Cloud Run อยู่เบื้องหลัง
ในขั้นตอนนี้ คุณจะทําให้ฟังก์ชันเวอร์ชันที่แก้ไขแล้ว 2 เวอร์ชันใช้งานได้ แล้วแยกการเข้าชมระหว่างเวอร์ชันต่างๆ ออกเป็น 50:50
สร้าง
สร้างโฟลเดอร์สำหรับแอปและไปที่โฟลเดอร์ดังกล่าวโดยทำดังนี้
mkdir ~/traffic-splitting && cd $_
สร้างไฟล์ 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>'
ทำให้ใช้งานได้
ติดตั้งใช้งานการแก้ไขครั้งแรกของฟังก์ชันที่มีพื้นหลังสีส้ม
COLOR=orange gcloud functions deploy hello-world-colored \ --gen2 \ --runtime python39 \ --entry-point hello_world \ --source . \ --region $REGION \ --trigger-http \ --allow-unauthenticated \ --update-env-vars COLOR=$COLOR
เมื่อถึงจุดนี้ หากคุณทดสอบฟังก์ชันโดยดูทริกเกอร์ HTTP (เอาต์พุต URI ของคำสั่งการทําให้ใช้งานได้ข้างต้น) ในเบราว์เซอร์ คุณควรเห็น Hello World
ที่มีพื้นหลังสีส้ม
ทำให้การแก้ไขครั้งที่ 2 ใช้งานได้โดยทำดังนี้
COLOR=yellow gcloud functions deploy hello-world-colored \ --gen2 \ --runtime python39 \ --entry-point hello_world \ --source . \ --region $REGION \ --trigger-http \ --allow-unauthenticated \ --update-env-vars COLOR=$COLOR
เนื่องจากนี่เป็นการแก้ไขล่าสุด หากคุณทดสอบฟังก์ชันนี้ คุณควรเห็น Hello World
ที่มีพื้นหลังสีเหลือง
แยกการเข้าชม 50-50
หากต้องการแยกการเข้าชมระหว่างการแก้ไขสีส้มและสีเหลือง คุณต้องค้นหารหัสการแก้ไขของบริการ Cloud Run ที่เกี่ยวข้อง คำสั่งเพื่อดูรหัสการแก้ไข
gcloud run revisions list --service hello-world-colored \ --region $REGION --format 'value(REVISION)'
เอาต์พุตควรมีลักษณะคล้ายกับตัวอย่างต่อไปนี้
hello-world-colored-00001-man hello-world-colored-00002-wok
จากนั้นให้แบ่งการเข้าชมระหว่างการแก้ไข 2 รายการนี้ดังนี้ (อัปเดต X-XXX
ตามชื่อการแก้ไข)
gcloud run services update-traffic hello-world-colored \ --region $REGION \ --to-revisions hello-world-colored-0000X-XXX=50,hello-world-colored-0000X-XXX=50
ทดสอบ
ทดสอบฟังก์ชันโดยไปที่ URL สาธารณะของฟังก์ชัน คุณควรเห็นการแก้ไขสีส้มครึ่งหนึ่ง และการแก้ไขสีเหลืองอีกครึ่งหนึ่ง
ดูข้อมูลเพิ่มเติมได้ในการย้อนกลับ การเปิดตัวแบบค่อยเป็นค่อยไป และการย้ายข้อมูลการเข้าชม
8. จำนวนอินสแตนซ์ขั้นต่ำ
ใน Cloud Functions (รุ่นที่ 2) คุณสามารถระบุจำนวนอินสแตนซ์ฟังก์ชันขั้นต่ำที่จะเก็บไว้และพร้อมให้บริการคำขอ ซึ่งมีประโยชน์ในการจํากัดจํานวนการเริ่มต้นแบบ Cold Start
ในขั้นตอนนี้ คุณจะนำฟังก์ชันที่มีการจัดเตรียมเริ่มต้นช้าๆ ไปใช้งาน คุณจะเห็นปัญหาการเริ่มแอปแบบ Cold Start จากนั้นคุณจะติดตั้งใช้งานฟังก์ชันโดยตั้งค่าอินสแตนซ์ขั้นต่ำเป็น 1 เพื่อกำจัดปัญหา Cold Start
สร้าง
สร้างโฟลเดอร์สำหรับแอปและไปยังโฟลเดอร์ดังกล่าวโดยทำดังนี้
mkdir ~/min-instances && cd $_
สร้างไฟล์ 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 GCF 2nd gen!") }
ทำให้ใช้งานได้
ติดตั้งใช้งานฟังก์ชันฉบับแก้ไขครั้งแรกซึ่งมีค่าอินสแตนซ์ขั้นต่ำเริ่มต้นเป็น 0
gcloud functions deploy slow-function \ --gen2 \ --runtime go116 \ --entry-point HelloWorld \ --source . \ --region $REGION \ --trigger-http \ --allow-unauthenticated
ทดสอบฟังก์ชันด้วยคําสั่งนี้
gcloud functions call slow-function \ --gen2 --region $REGION
คุณจะสังเกตเห็นความล่าช้า 10 วินาที (การเริ่มต้นแบบเย็น) ในการโทรครั้งแรก จากนั้นจะเห็นข้อความ การโทรครั้งต่อๆ ไปควรแสดงผลทันที
กำหนดอินสแตนซ์ขั้นต่ำ
หากต้องการกำจัดการเริ่มต้นครั้งแรกในคําขอแรก ให้ทําให้การทํางานกลับมาใช้งานได้อีกครั้งโดยตั้งค่า Flag --min-instances
เป็น 1 ดังนี้
gcloud functions deploy slow-function \ --gen2 \ --runtime go116 \ --entry-point HelloWorld \ --source . \ --region $REGION \ --trigger-http \ --allow-unauthenticated \ --min-instances 1
ทดสอบ
ทดสอบฟังก์ชันอีกครั้ง
gcloud functions call slow-function \ --gen2 --region $REGION
คุณไม่ควรเห็นความล่าช้า 10 วินาทีในคำขอแรกอีกต่อไป ปัญหาการเริ่มต้นแบบ Cold Start ในการเรียกใช้ครั้งแรก (หลังจากไม่ได้เรียกใช้เป็นเวลานาน) หายไปแล้ว ขอบคุณอินสแตนซ์ขั้นต่ำ
ดูข้อมูลเพิ่มเติมที่การใช้อินสแตนซ์ขั้นต่ำ
9. การเกิดขึ้นพร้อมกัน
ใน Cloud Functions (รุ่นที่ 2) อินสแตนซ์ฟังก์ชันจะจัดการคําขอพร้อมกันได้ 1 รายการโดยค่าเริ่มต้น แต่คุณสามารถระบุจํานวนคําขอพร้อมกันที่อินสแตนซ์จะประมวลผลได้พร้อมกัน วิธีนี้ยังช่วยป้องกันไม่ให้ระบบเริ่มทำงานแบบ Cold Start ได้อีกด้วย เนื่องจากไม่จําเป็นต้องสร้างอินสแตนซ์ฟังก์ชันใหม่สําหรับคําขอแบบขนานทุกรายการ
ในขั้นตอนนี้ คุณจะใช้ฟังก์ชันที่มีการเริ่มต้นช้าจากขั้นตอนก่อนหน้า คุณจะส่งคำขอ 10 รายการและสังเกตปัญหาการเริ่มต้นระบบใหม่อีกครั้ง เนื่องจากต้องสร้างอินสแตนซ์ฟังก์ชันใหม่เพื่อจัดการกับคำขอ
หากต้องการแก้ไขปัญหาการเริ่มต้นระบบเย็น คุณจะต้องทําให้ฟังก์ชันอื่นใช้งานได้โดยมีค่าการเรียกใช้พร้อมกัน 100 คุณจะเห็นได้ว่าตอนนี้คําขอ 10 รายการไม่ก่อให้เกิดปัญหาการเริ่มต้นแบบเย็น และอินสแตนซ์ฟังก์ชันเดียวสามารถจัดการคําขอทั้งหมดได้
ทดสอบแบบไม่ใช้การทำงานพร้อมกัน
รับ URL ของฟังก์ชันโดยทำดังนี้
SLOW_URL=$(gcloud functions describe slow-function --region $REGION --gen2 --format="value(serviceConfig.uri)")
ใช้เครื่องมือการเปรียบเทียบประสิทธิภาพแบบโอเพนซอร์สชื่อ hey
เพื่อส่งคําขอพร้อมกัน 10 รายการไปยังฟังก์ชันที่ช้า ติดตั้ง hey
ใน Cloud Shell ไว้แล้ว
hey -n 10 -c 10 $SLOW_URL
คุณควรเห็นในเอาต์พุตของ hey
ว่าคําขอบางรายการใช้เวลานาน
Summary: Total: 10.9053 secs Slowest: 10.9048 secs Fastest: 0.4439 secs Average: 9.7930 secs Requests/sec: 0.9170 Total data: 310 bytes Size/request: 31 bytes Response time histogram: 0.444 [1] |■■■■ 1.490 [0] | 2.536 [0] | 3.582 [0] | 4.628 [0] | 5.674 [0] | 6.720 [0] | 7.767 [0] | 8.813 [0] | 9.859 [0] | 10.905 [9] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
เนื่องจากมีการสร้างอินสแตนซ์ฟังก์ชันเพิ่มเติมเพื่อจัดการคําขอ หากตรวจสอบจํานวนอินสแตนซ์ที่ใช้งานอยู่ของฟังก์ชัน คุณควรเห็นว่ามีการสร้างอินสแตนซ์มากกว่า 1 รายการ ณ จุดหนึ่ง และอินสแตนซ์เหล่านี้เป็นสาเหตุของปัญหาการเริ่มต้นแบบเย็น
ทำให้ใช้งานได้
ทำให้ฟังก์ชันใหม่ใช้งานได้โดยเหมือนกับฟังก์ชันก่อนหน้า เมื่อทําให้การทํางานพร้อมกันเสร็จแล้ว คุณจะสามารถเพิ่มการทํางานพร้อมกันได้ดังนี้
gcloud functions deploy slow-concurrent-function \ --gen2 \ --runtime go116 \ --entry-point HelloWorld \ --source . \ --region $REGION \ --trigger-http \ --allow-unauthenticated \ --min-instances 1
ตั้งค่าการทํางานพร้อมกัน
ตั้งค่าการเรียกใช้พร้อมกันของบริการ Cloud Run ที่อยู่เบื้องหลังสำหรับฟังก์ชันเป็น 100 (สูงสุด 1,000) วิธีนี้ช่วยให้อินสแตนซ์ฟังก์ชันเดียวจัดการคำขอได้อย่างน้อย 100 รายการ
gcloud run services update slow-concurrent-function \ --concurrency 100 \ --cpu 1 \ --region $REGION
ทดสอบแบบพร้อมกัน
รับ URL ของฟังก์ชันโดยทำดังนี้
SLOW_CONCURRENT_URL=$(gcloud functions describe slow-concurrent-function --region $REGION --gen2 --format="value(serviceConfig.uri)")
จากนั้นใช้ hey
เพื่อส่งคําขอพร้อมกัน 10 รายการ
hey -n 10 -c 10 $SLOW_CONCURRENT_URL
คุณควรเห็นในเอาต์พุตของ hey
ว่าคําขอทั้งหมดได้รับการประมวลผลอย่างรวดเร็ว
Summary: Total: 0.2164 secs Slowest: 0.2163 secs Fastest: 0.0921 secs Average: 0.2033 secs Requests/sec: 46.2028 Total data: 310 bytes Size/request: 31 bytes Response time histogram: 0.092 [1] |■■■■ 0.105 [0] | 0.117 [0] | 0.129 [0] | 0.142 [0] | 0.154 [0] | 0.167 [0] | 0.179 [0] | 0.191 [0] | 0.204 [0] | 0.216 [9] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
อินสแตนซ์ฟังก์ชันเดียวสามารถจัดการคำขอทั้งหมดและปัญหาการเริ่มต้นแบบ Cold Start หายไปแล้ว เนื่องจากการเรียกใช้พร้อมกันที่เพิ่มขึ้น
ดูข้อมูลเพิ่มเติมได้ในการทำงานพร้อมกัน
10. ยินดีด้วย
ยินดีด้วยที่ทํา Codelab จนเสร็จสมบูรณ์
สิ่งที่เราได้พูดถึง
- ภาพรวมของ Cloud Functions (รุ่นที่ 2)
- วิธีเขียนฟังก์ชันที่ตอบสนองต่อการเรียก HTTP
- วิธีเขียนฟังก์ชันที่ตอบสนองต่อข้อความ Pub/Sub
- วิธีเขียนฟังก์ชันที่ตอบสนองต่อเหตุการณ์ใน Cloud Storage
- วิธีเขียนฟังก์ชันที่ตอบสนองต่อบันทึกการตรวจสอบระบบคลาวด์
- วิธีแยกการเข้าชมระหว่างการแก้ไข 2 ครั้ง
- วิธีกำจัด Cold Start ด้วยอินสแตนซ์ขั้นต่ำ
- วิธีตั้งค่าการเรียกใช้พร้อมกัน