Azure Functions เป็นส่วนหนึ่งของบริการคอมพิวต์แบบไร้เซิร์ฟเวอร์ของ Microsoft ช่วยให้รันโค้ดขนาดเล็กเพื่อตอบสนองต่อเหตุการณ์ได้โดยไม่ต้องดูแลจัดการเซิร์ฟเวอร์เอง
ตัวอย่างเช่น ฟังก์ชันสามารถทำงานเมื่อมีคำขอ HTTP เข้ามา เมื่อมีการอัปโหลดไฟล์ไปยังสตอเรจ หรือเมื่อถึงเวลาตามกำหนด
“ไร้เซิร์ฟเวอร์” ไม่ได้หมายความว่าไม่มีเซิร์ฟเวอร์เลย แต่หมายถึง Azure เป็นผู้จัดการโครงสร้างพื้นฐานให้ทั้งหมด ตั้งแต่การจัดเตรียม การปรับสเกล ไปจนถึงการบำรุงรักษาอยู่เบื้องหลัง
ในคู่มือนี้ จะอธิบายองค์ประกอบพื้นฐาน ได้แก่ ทริกเกอร์ ไบนดิง ตัวเลือกการโฮสต์ และตัวอย่างลงมือทำเพื่อเริ่มต้นได้ทันที
Azure Functions คืออะไร
Azure Function คือโค้ดชิ้นเล็กที่รันเมื่อถูกทริกเกอร์ด้วยเหตุการณ์ตามที่กำหนด เขียนลอจิกเพียงอย่างเดียว ส่วนที่เหลือ Azure จะจัดการให้
มีแนวคิดหลัก 3 ประการที่กำหนดโมเดลนี้
- การประมวลผลแบบขับเคลื่อนด้วยเหตุการณ์ ทำให้โค้ดรันเฉพาะเมื่อมีสิ่งเกิดขึ้น ไม่ได้รันตลอดเวลา
- การปรับสเกลอัตโนมัติ Azure จะเพิ่มหรือลดทรัพยากรคอมพิวต์ตามความต้องการ
- การคิดค่าบริการตามการใช้งานจริง ในบางแผนโฮสต์จะจ่ายเฉพาะเวลาที่โค้ดรันจริง ๆ
โดยทั่วไป ฟังก์ชันหนึ่งควรทำงานอย่างใดอย่างหนึ่ง เช่น ปรับขนาดรูปภาพหรือประมวลผลข้อความ Function App คือคอนเทนเนอร์ที่บรรจุฟังก์ชันหนึ่งรายการขึ้นไป และจัดการการตั้งค่าร่วม เช่น คอนฟิกและการดีพลอย สำหรับทุกฟังก์ชันภายใน
การทำงานของ Azure Functions
วงจรชีวิตของฟังก์ชันสามารถมองเป็นรูปแบบง่าย ๆ ดังนี้
- เกิดเหตุการณ์ เช่น อัปโหลดไฟล์หรือมีการเรียก HTTP
- ทริกเกอร์ตรวจจับเหตุการณ์และสตาร์ทฟังก์ชันทันที
- ฟังก์ชันรันโค้ดของตน
- ไบนดิงเชื่อมต่อฟังก์ชันกับบริการอื่นเพื่ออ่านอินพุตหรือส่งเอาต์พุตที่ต้องการ
- Azure จัดการทรัพยากรคอมพิวต์เบื้องหลังตามแผนโฮสต์ที่เลือก
โฟลว์นี้แทบไม่ต่างกันไม่ว่าภาษาโปรแกรมหรือทางเลือกการโฮสต์จะเป็นแบบใด ต่างกันแค่ทริกเกอร์ โค้ด และไบนดิง
ทริกเกอร์ของ Azure Functions
ทุกฟังก์ชันต้องมีทริกเกอร์เพียงตัวเดียว ทริกเกอร์กำหนดว่าฟังก์ชันเริ่มทำงานอย่างไร ต่อไปนี้คือประเภทที่พบบ่อยและควรรู้จัก:
- HTTP Trigger: รันฟังก์ชันเมื่อได้รับคำขอ HTTP นิยมใช้สร้าง API
- Timer Trigger: รันฟังก์ชันตามกำหนดเวลา เช่น ทุกชั่วโมงหรือวันละครั้ง
- Blob Storage Trigger: รันฟังก์ชันเมื่อมีการเพิ่มหรือแก้ไขไฟล์ใน Azure Blob Storage
- Queue Trigger: รันฟังก์ชันเมื่อมีข้อความใหม่มาถึงคิว
- Event Hub Trigger: รันฟังก์ชันเพื่อตอบสนองต่อสตรีมของเหตุการณ์ เหมาะกับข้อมูลปริมาณมาก
- Cosmos DB Trigger: รันฟังก์ชันเมื่อมีการสร้างหรืออัปเดตเอกสารในคอนเทนเนอร์ของ Cosmos DB โดยอาศัย Change Feed
- Service Bus Trigger: รันฟังก์ชันเพื่อตอบสนองต่อข้อความจากคิวหรือทอปิกของ Azure Service Bus มักใช้ในระบบเมสเซจจิงระดับองค์กรและการแยกระบบ
- Durable Functions: ส่วนขยายของ Azure Functions ที่ช่วยเขียนฟังก์ชันแบบมีสถานะในสภาพแวดล้อมไร้เซิร์ฟเวอร์เพื่อจัดลำดับเวิร์กโฟลว์หลายขั้นตอนที่ซับซ้อน
ไบนดิงของ Azure Functions
ทริกเกอร์กับไบนดิงมักถูกสับสน แม้จะดูคล้ายกันแต่ทำหน้าที่ต่างกันโดยสิ้นเชิง ทริกเกอร์ใช้เริ่มฟังก์ชัน ส่วนไบนดิงเชื่อมต่อฟังก์ชันกับข้อมูลโดยการอ่านหรือส่งออกข้อมูล
เป็นการป้อนข้อมูลให้ฟังก์ชันโดยไม่ต้องเขียนโค้ดอินทิเกรชันเอง ตัวอย่างเช่น ฟังก์ชันสามารถอ่านเรคอร์ดจากฐานข้อมูลได้อัตโนมัติ เพียงประกาศไบนดิง
Output bindings
ช่วยส่งผลลัพธ์ของฟังก์ชันไปที่อื่น เช่น ใช้เอาต์พุตไบนดิงเพื่อเขียนข้อความที่ประมวลผลแล้วลงในคิว
ตัวอย่างเพื่อให้เห็นภาพ: ทริกเกอร์ Blob Storage สตาร์ทฟังก์ชันเมื่อมีการอัปโหลดรูปภาพ จากนั้นเอาต์พุตไบนดิงจะบันทึกรูปที่ปรับขนาดแล้วไปยังคอนเทนเนอร์สตอเรจอื่น การเชื่อมต่อสตอเรจทั้งหมดจัดการโดยไบนดิง โดยไม่ต้องเขียนโค้ดไคลเอนต์สตอเรจเอง
วิธีสร้าง Azure Function แรก
ตัวอย่างง่าย ๆ ของฟังก์ชันที่ทริกเกอร์ด้วย HTTP และส่งคำทักทายกลับ มีโฟลว์ดังนี้
- สร้าง Function App ซึ่งเป็นคอนเทนเนอร์สำหรับฟังก์ชันบน Azure
- เลือกรันไทม์และภาษาที่ต้องการเขียนโค้ด
- เพิ่มฟังก์ชันใหม่ภายใน Function App
- เลือก HTTP trigger เพื่อให้ฟังก์ชันตอบสนองต่อคำขอเว็บ
- เพิ่มความสามารถง่าย ๆ เช่น อ่านชื่อจากคำขอแล้วส่งกลับว่า “Hello, [name].”
- รันและทดสอบฟังก์ชันด้วยเครื่องมือทดสอบในตัว หรือส่งคำขอจากเบราว์เซอร์ก็ได้
- ดีพลอยไปยัง Azure เพื่อให้พร้อมใช้งานจริง
ตัวอย่างนี้ตั้งใจให้เล็กเพื่อชี้ให้เห็นรูปแบบ แล้วต่อยอดด้วยไอเดียของตนเอง
ภาษาที่ Azure Functions รองรับ
Azure Functions รองรับหลายภาษา เช่น:
- C#
- JavaScript/TypeScript
- Python
- Java
- PowerShell
รูปแบบการรองรับและการพัฒนาจะแตกต่างกันตามภาษาและเวอร์ชัน ดังนั้นแนะนำให้ตรวจสอบ เอกสาร Azure ฉบับปัจจุบันก่อนเริ่มโครงการใหม่ เนื่องจากรายละเอียดเหล่านี้เปลี่ยนแปลงบ่อย
ตัวเลือกการโฮสต์ของ Azure Functions
ไม่ใช่ Azure Function ทุกตัวจะรันเหมือนกัน Azure มีแผนโฮสต์หลายแบบ ซึ่งมีข้อดีข้อเสียต่างกัน การเลือกที่เหมาะสมขึ้นอยู่กับเคสการใช้งาน ประเด็นหลักที่ต้องพิจารณา ได้แก่
- การปรับสเกล: บางแผนปรับสเกลอัตโนมัติและฉับไว ขณะที่บางแผนต้องควบคุมเพิ่มเติมด้วยตนเอง
- พฤติกรรมตอนสตาร์ท: บางแผนทำให้ฟังก์ชัน “อุ่น” อยู่ หมายถึงพร้อมรันทันที ขณะที่บางแผนสตาร์ทตามต้องการ
- เน็ตเวิร์ก: บางแผนรองรับฟีเจอร์เครือข่ายขั้นสูง เช่น การเชื่อมต่อกับเครือข่ายเสมือนส่วนตัว ขณะที่บางแผนไม่รองรับ
- ค่าใช้จ่าย: โมเดลราคาแตกต่างกันมาก ตั้งแต่จ่ายตามการเรียกใช้ ไปจนถึงค่ารายเดือนคงที่
การปรับสเกลและคอลด์สตาร์ทใน Azure Functions
มีอีกสองแนวคิดที่สำคัญเมื่อฟังก์ชันรันจริงในโปรดักชัน ได้แก่
การปรับสเกลอัตโนมัติ
Azure จะเฝ้าดูโหลดของฟังก์ชัน และเมื่อความต้องการเพิ่มขึ้นก็เพิ่มอินสแตนซ์คอมพิวต์ เมื่อความต้องการลดลงก็ลดอินสแตนซ์ ไม่ต้องจัดการเอง
คอลด์สตาร์ท
หากฟังก์ชันไม่ได้รันมาสักพัก อาจต้องใช้เวลาเล็กน้อยในการสตาร์ทก่อนจะรับคำขอใหม่ ความล่าช้านี้เรียกว่าคอลด์สตาร์ท บางแผนโฮสต์ลดหรือหลีกเลี่ยงได้ด้วยการทำให้อินสแตนซ์อุ่นอยู่ตามที่กล่าว
เคสการใช้งาน Azure Functions ที่พบบ่อย
โมเดลแบบขับเคลื่อนด้วยเหตุการณ์เหมาะกับปัญหาทั่วไปหลายอย่าง เช่น
API และเว็บฮุค
รองรับคำขอ HTTP ขาเข้าโดยไม่ต้องรันเว็บเซิร์ฟเวอร์ตลอดเวลา
การประมวลผลไฟล์และรูปภาพ
ทริกเกอร์ฟังก์ชันเมื่อมีไฟล์ลงในสตอเรจ แล้วปรับขนาด แปลงไฟล์ หรือสแกนได้ทันที
งานตามกำหนดเวลา
รันงานล้างข้อมูล รายงาน หรือการเตือนตามตัวตั้งเวลา โดยไม่ต้องมีเซิร์ฟเวอร์ที่เปิดตลอดเวลา
ไปป์ไลน์ประมวลผลข้อมูล
ประมวลผลข้อความหรือเหตุการณ์ตามที่เข้ามา ทีละขั้นอย่างเป็นลำดับ
IoT และการประมวลผลเหตุการณ์
รองรับข้อมูลจากเซนเซอร์หรืออุปกรณ์จำนวนมากที่สตรีมเข้ามา
งานเบื้องหลัง
ย้ายงานที่ช้า หรือทำเป็นครั้งคราว เช่น การส่งอีเมล ออกไป เพื่อไม่ให้บล็อกแอปหลัก
การมอนิเตอร์และการแก้ปัญหา Azure Functions
เมื่อฟังก์ชันออนไลน์แล้ว จำเป็นต้องมีมุมมองว่าประสิทธิภาพเป็นอย่างไร
สามารถดูล็อกที่บันทึกเหตุการณ์ของการรันแต่ละครั้ง ซึ่งมีประโยชน์ต่อการดีบัก และตรวจสอบ Application Insights ในเครื่องมือ Azure ที่ติดตามประสิทธิภาพ คำขอ และความล้มเหลวไว้ในที่เดียว
ควรติดตามความล้มเหลวในการเรียกใช้งาน (invocation) ด้วย เพื่อทราบว่าเมื่อใดและทำไมฟังก์ชันถึงไม่สมบูรณ์ การมอนิเตอร์ประสิทธิภาพยังช่วยให้เห็นฟังก์ชันที่ช้าก่อนจะกลายเป็นปัญหา และสามารถกำหนดพฤติกรรมการรีทรายให้การรันที่ล้มเหลวลองใหม่อัตโนมัติได้
สรุป
Azure Functions เปิดทางให้รันโค้ดเพื่อตอบสนองต่อเหตุการณ์ โดยไม่ต้องจัดการเซิร์ฟเวอร์เบื้องล่าง ทริกเกอร์กำหนดเวลาที่ฟังก์ชันเริ่มทำงาน ส่วนไบนดิงช่วยเชื่อมต่อฟังก์ชันกับบริการอื่นได้ง่าย โดยไม่ต้องเขียนโค้ดอินทิเกรชันเพิ่ม
เมื่อขยับจากฟังก์ชันทดลองเล็ก ๆ ไปสู่การใช้งานจริง ตัวเลือกการโฮสต์และการปรับสเกลจะยิ่งสำคัญ แผนที่เหมาะสมส่งผลต่อทั้งค่าใช้จ่าย ความเร็ว และความเชื่อถือได้
Azure Functions เป็นส่วนหนึ่งของบริการคอมพิวต์แบบไร้เซิร์ฟเวอร์ของ Microsoft ช่วยให้รันโค้ดขนาดเล็กเพื่อตอบสนองต่อเหตุการณ์ได้โดยไม่ต้องดูแลจัดการเซิร์ฟเวอร์เอง
ตัวอย่างเช่น ฟังก์ชันสามารถทำงานเมื่อมีคำขอ HTTP เข้ามา เมื่อมีการอัปโหลดไฟล์ไปยังสตอเรจ หรือเมื่อถึงเวลาตามกำหนด
“ไร้เซิร์ฟเวอร์” ไม่ได้หมายความว่าไม่มีเซิร์ฟเวอร์เลย แต่หมายถึง Azure เป็นผู้จัดการโครงสร้างพื้นฐานให้ทั้งหมด ตั้งแต่การจัดเตรียม การปรับสเกล ไปจนถึงการบำรุงรักษาอยู่เบื้องหลัง
ในคู่มือนี้ จะอธิบายองค์ประกอบพื้นฐาน ได้แก่ ทริกเกอร์ ไบนดิง ตัวเลือกการโฮสต์ และตัวอย่างลงมือทำเพื่อเริ่มต้นได้ทันที
Azure Functions คืออะไร
Azure Function คือโค้ดชิ้นเล็กที่รันเมื่อถูกทริกเกอร์ด้วยเหตุการณ์ตามที่กำหนด เขียนลอจิกเพียงอย่างเดียว ส่วนที่เหลือ Azure จะจัดการให้
มีแนวคิดหลัก 3 ประการที่กำหนดโมเดลนี้
โดยทั่วไป ฟังก์ชันหนึ่งควรทำงานอย่างใดอย่างหนึ่ง เช่น ปรับขนาดรูปภาพหรือประมวลผลข้อความ Function App คือคอนเทนเนอร์ที่บรรจุฟังก์ชันหนึ่งรายการขึ้นไป และจัดการการตั้งค่าร่วม เช่น คอนฟิกและการดีพลอย สำหรับทุกฟังก์ชันภายใน
การทำงานของ Azure Functions
วงจรชีวิตของฟังก์ชันสามารถมองเป็นรูปแบบง่าย ๆ ดังนี้
โฟลว์นี้แทบไม่ต่างกันไม่ว่าภาษาโปรแกรมหรือทางเลือกการโฮสต์จะเป็นแบบใด ต่างกันแค่ทริกเกอร์ โค้ด และไบนดิง
ทริกเกอร์ของ Azure Functions
ทุกฟังก์ชันต้องมีทริกเกอร์เพียงตัวเดียว ทริกเกอร์กำหนดว่าฟังก์ชันเริ่มทำงานอย่างไร ต่อไปนี้คือประเภทที่พบบ่อยและควรรู้จัก:
ไบนดิงของ Azure Functions
ทริกเกอร์กับไบนดิงมักถูกสับสน แม้จะดูคล้ายกันแต่ทำหน้าที่ต่างกันโดยสิ้นเชิง ทริกเกอร์ใช้เริ่มฟังก์ชัน ส่วนไบนดิงเชื่อมต่อฟังก์ชันกับข้อมูลโดยการอ่านหรือส่งออกข้อมูล
Input bindings
เป็นการป้อนข้อมูลให้ฟังก์ชันโดยไม่ต้องเขียนโค้ดอินทิเกรชันเอง ตัวอย่างเช่น ฟังก์ชันสามารถอ่านเรคอร์ดจากฐานข้อมูลได้อัตโนมัติ เพียงประกาศไบนดิง
Output bindings
ช่วยส่งผลลัพธ์ของฟังก์ชันไปที่อื่น เช่น ใช้เอาต์พุตไบนดิงเพื่อเขียนข้อความที่ประมวลผลแล้วลงในคิว
ตัวอย่างเพื่อให้เห็นภาพ: ทริกเกอร์ Blob Storage สตาร์ทฟังก์ชันเมื่อมีการอัปโหลดรูปภาพ จากนั้นเอาต์พุตไบนดิงจะบันทึกรูปที่ปรับขนาดแล้วไปยังคอนเทนเนอร์สตอเรจอื่น การเชื่อมต่อสตอเรจทั้งหมดจัดการโดยไบนดิง โดยไม่ต้องเขียนโค้ดไคลเอนต์สตอเรจเอง
วิธีสร้าง Azure Function แรก
ตัวอย่างง่าย ๆ ของฟังก์ชันที่ทริกเกอร์ด้วย HTTP และส่งคำทักทายกลับ มีโฟลว์ดังนี้
ตัวอย่างนี้ตั้งใจให้เล็กเพื่อชี้ให้เห็นรูปแบบ แล้วต่อยอดด้วยไอเดียของตนเอง
ภาษาที่ Azure Functions รองรับ
Azure Functions รองรับหลายภาษา เช่น:
รูปแบบการรองรับและการพัฒนาจะแตกต่างกันตามภาษาและเวอร์ชัน ดังนั้นแนะนำให้ตรวจสอบ เอกสาร Azure ฉบับปัจจุบันก่อนเริ่มโครงการใหม่ เนื่องจากรายละเอียดเหล่านี้เปลี่ยนแปลงบ่อย
ตัวเลือกการโฮสต์ของ Azure Functions
ไม่ใช่ Azure Function ทุกตัวจะรันเหมือนกัน Azure มีแผนโฮสต์หลายแบบ ซึ่งมีข้อดีข้อเสียต่างกัน การเลือกที่เหมาะสมขึ้นอยู่กับเคสการใช้งาน ประเด็นหลักที่ต้องพิจารณา ได้แก่
การปรับสเกลและคอลด์สตาร์ทใน Azure Functions
มีอีกสองแนวคิดที่สำคัญเมื่อฟังก์ชันรันจริงในโปรดักชัน ได้แก่
การปรับสเกลอัตโนมัติ
Azure จะเฝ้าดูโหลดของฟังก์ชัน และเมื่อความต้องการเพิ่มขึ้นก็เพิ่มอินสแตนซ์คอมพิวต์ เมื่อความต้องการลดลงก็ลดอินสแตนซ์ ไม่ต้องจัดการเอง
คอลด์สตาร์ท
หากฟังก์ชันไม่ได้รันมาสักพัก อาจต้องใช้เวลาเล็กน้อยในการสตาร์ทก่อนจะรับคำขอใหม่ ความล่าช้านี้เรียกว่าคอลด์สตาร์ท บางแผนโฮสต์ลดหรือหลีกเลี่ยงได้ด้วยการทำให้อินสแตนซ์อุ่นอยู่ตามที่กล่าว
เคสการใช้งาน Azure Functions ที่พบบ่อย
โมเดลแบบขับเคลื่อนด้วยเหตุการณ์เหมาะกับปัญหาทั่วไปหลายอย่าง เช่น
API และเว็บฮุค
รองรับคำขอ HTTP ขาเข้าโดยไม่ต้องรันเว็บเซิร์ฟเวอร์ตลอดเวลา
การประมวลผลไฟล์และรูปภาพ
ทริกเกอร์ฟังก์ชันเมื่อมีไฟล์ลงในสตอเรจ แล้วปรับขนาด แปลงไฟล์ หรือสแกนได้ทันที
งานตามกำหนดเวลา
รันงานล้างข้อมูล รายงาน หรือการเตือนตามตัวตั้งเวลา โดยไม่ต้องมีเซิร์ฟเวอร์ที่เปิดตลอดเวลา
ไปป์ไลน์ประมวลผลข้อมูล
ประมวลผลข้อความหรือเหตุการณ์ตามที่เข้ามา ทีละขั้นอย่างเป็นลำดับ
IoT และการประมวลผลเหตุการณ์
รองรับข้อมูลจากเซนเซอร์หรืออุปกรณ์จำนวนมากที่สตรีมเข้ามา
งานเบื้องหลัง
ย้ายงานที่ช้า หรือทำเป็นครั้งคราว เช่น การส่งอีเมล ออกไป เพื่อไม่ให้บล็อกแอปหลัก
การมอนิเตอร์และการแก้ปัญหา Azure Functions
เมื่อฟังก์ชันออนไลน์แล้ว จำเป็นต้องมีมุมมองว่าประสิทธิภาพเป็นอย่างไร
สามารถดูล็อกที่บันทึกเหตุการณ์ของการรันแต่ละครั้ง ซึ่งมีประโยชน์ต่อการดีบัก และตรวจสอบ Application Insights ในเครื่องมือ Azure ที่ติดตามประสิทธิภาพ คำขอ และความล้มเหลวไว้ในที่เดียว
ควรติดตามความล้มเหลวในการเรียกใช้งาน (invocation) ด้วย เพื่อทราบว่าเมื่อใดและทำไมฟังก์ชันถึงไม่สมบูรณ์ การมอนิเตอร์ประสิทธิภาพยังช่วยให้เห็นฟังก์ชันที่ช้าก่อนจะกลายเป็นปัญหา และสามารถกำหนดพฤติกรรมการรีทรายให้การรันที่ล้มเหลวลองใหม่อัตโนมัติได้
สรุป
Azure Functions เปิดทางให้รันโค้ดเพื่อตอบสนองต่อเหตุการณ์ โดยไม่ต้องจัดการเซิร์ฟเวอร์เบื้องล่าง ทริกเกอร์กำหนดเวลาที่ฟังก์ชันเริ่มทำงาน ส่วนไบนดิงช่วยเชื่อมต่อฟังก์ชันกับบริการอื่นได้ง่าย โดยไม่ต้องเขียนโค้ดอินทิเกรชันเพิ่ม
เมื่อขยับจากฟังก์ชันทดลองเล็ก ๆ ไปสู่การใช้งานจริง ตัวเลือกการโฮสต์และการปรับสเกลจะยิ่งสำคัญ แผนที่เหมาะสมส่งผลต่อทั้งค่าใช้จ่าย ความเร็ว และความเชื่อถือได้