> For the complete documentation index, see [llms.txt](https://www.saladpuk.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://www.saladpuk.com/cloud/azure101/function-app.md).

# มาสร้าง Function App กัน

คนที่เคยเขียนแอพที่มีการทำงานหนักหน่วง เล่นประมวลผลวีดีโอ ย่อขนาดรูป หรืออะไรก็แล้วแต่ น่าจะเคยมีประสบการณ์อันเลวร้ายกับเรื่องเซิฟเวอร์ เช่นมันไม่สามารถทำงานได้จนจบแล้วทำให้เซิฟเวอร์ล่มไปอะไรทำนองนี้กัน ในรอบนี้เราจะมาดูตัวที่ทำให้ developer ไม่ต้องมากังวลปัญหาที่ว่ามานี้อีกต่อไปด้วยสิ่งที่เรียกว่า **Function App** กันครับซึ่งมันเป็นส่วนหนึ่งของสิ่งที่เรียกว่า **Serverless** งับ

{% hint style="info" %}
**Azure Portal**\
จะทำตามในรอบนี้ให้เข้าไปที่ <https://portal.azure.com> เน่อ\
ส่วนถ้าใครยังไม่ได้สมัครก็ไปสมัครให้เรียบร้อยแซ๊ร [(วิธีสมัครจิ้มตรงนี้)](https://saladpuk.gitbook.io/learn/cloud/azure101/register)
{% endhint %}

## 🤔 Serverless คืออะไร ?

หนึ่งใน Concept ที่อยู่บน Microsoft Azure คือตัวที่เรียกว่า **Serverless** หรือพูดง่ายๆคือ **Developer ทั้งหลายเอ๋ยจง focus กับเรื่องโค้ดซะ ส่วนเรื่อง Server ข้าจะจัดการให้เจ้าเองงงงงง** หรือพูดเป็นภาษาคนคือ เราไม่ต้องสนใจเรื่องเซิฟเวอร์เลยนั่นเอง ดังนั้นเราก็ไม่ต้องมี Admin มาคอยนั่งจัด spec server อะไรพวกนี้อีกแล้ว เราแค่เขียนโค้ด แล้วก็โยนขึ้นคลาว์ เพียงเท่านี้มันก็จะพร้อมให้เราใช้งานได้นั่นเอง

## 🤔 อยากได้ Function App ยังไง ?

1.ที่เมนูด้านซ้ายมือให้เลือก Resource groups ซะ แล้วในหน้าตรงกลางให้เลือกชื่อ Resource group ที่เราสร้างไว้

![](/files/-LnNAau0ioJEOLFOqK82)

2.หลังจากที่เข้ามาใน Resource group แล้วให้กดปุ่ม + ที่มุมบนซ้ายของเมนู

![](/files/-LnNB9KzR8PabMbxNE-O)

3.ระบบจะพาเราไปที่หน้า **Marketplace** ซึ่งในหน้า marketplace นี้เป็นหน้าหลักในการเลือก service ที่เราจะทำการสร้าง ซึ่งในรอบนี้เราจะพิมพ์ในช่องค้นหาว่า **Function App** แล้วกด Enter เลย

![](/files/-LzbqiiPlZDJeGJcFXAX)

4.ถัดมาเขาก็จะบอกรายละเอียดเกี่ยวกับ Function App ว่ามันคืออะไร จะไปศึกษาลองเล่นต่อได้ยังไง ราคาที่ต้องจ่ายต่อเดือนคิดยังไง บลาๆ ก็ถ้าอ่านจนหนำใจแล้วก็จิ้มปุ่ม **Create** เบาๆไป 1 ทีงับ

![](/files/-Lw3q1el-HY0JdnWLZ2F)

5.ในขั้นตอนถัดมาเขาก็จะถามรายละเอียดของ Function App ของเรา ซึ่งในส่วนนี้ก็ค่อยๆเลือกใส่ทีละอันเลย แล้วพอใส่เสร็จก็กดปุ่ม **Create** โลด

| ชื่อ              | รายละเอียด                                                                   |
| ----------------- | ---------------------------------------------------------------------------- |
| **App name**      | ชื่อ Function App ที่จะสร้าง                                                 |
| **Hosting Plan**  | รูปแบบการเก็บเงิน                                                            |
| **Location**      | ตัว Service นี้จะตั้งอยู่ที่ไหน (ทดสอบในไทยก็เลือก Southeast Asia นะ)        |
| **Runtime Stack** | เราจะเขียน function ด้วยภาษาอะไร ในที่นี้ผมใช้ C# ครับ ส่วนเพื่อนๆแล้วแต่เลย |
| **Storage**       | จะให้มันเก็บบันทึกๆการทำงานต่างๆที่เกิดขึ้นกับ Function App นี้ไว้ที่ไหน     |

![](/files/-LpsVER389Y9nWKG-Hh_)

{% hint style="info" %}
**Hosting Plan**\
รูปแบบการเก็บเงินของ Function App มี 2 แบบตามด้านล่างนี้นะครับ\
**1.Consumption Plan** - จะเก็บเงินทุกๆครั้งที่มีการเรียกใช้งาน แยกออกมาต่างหาก แล้วไปจ่ายตอนสิ้นเดือน\
**2.App Service Plan** - จะไม่ได้เก็บเงินเพิ่ม เพราะมันจะเอาตัว Function App ไปทำงานบน App Service ที่เราสร้างไว้อยู่แล้ว ซึ่งสิ้นเดือน App Service Plan เราคิดเท่าไหร่เขาก็จะชาร์จตามนั้น แต่ข้อเสียคือแอพอื่นๆที่อยู่บน Service Plan นั้นอาจจะมีผลกระทบ เพราะ Function App ก็จะไปใช้ Resource ของ Server ด้วย
{% endhint %}

{% hint style="success" %}
ถ้าไม่อยากให้การทำงานของ Function App ไปกระทบกับแอพอื่นๆให้เลือกเป็น Consumption Plan นะครับมันจะได้ไม่ยุ่งกับคนอื่นเลย หรืออีกกรณีคือสร้าง App Service Plan ที่เป็นตัวแชร์ให้ตัวที่เป็น Background process มาทำงานเล่นกันที่ App Service Plan ตัวนี้เลยก็ใช้ได้ในระดับนึงครับ แล้วค่อยทำ **Scaling** เอาอีกที
{% endhint %}

6.รอจนกว่าจะเสร็จก็เป็นอันเสร็จพิธี

![](/files/-LnNDWdnC_ChnvlxLvlE)

## 🤔 สร้างเสร็จแล้วไงต่อ ?

จากขั้นตอนด้านบน มันเป็นการสร้าง service ที่เรียกว่า Function App ขึ้นมาเฉยๆ ซึ่งขั้นตอนถัดไปเราก็จะทำการลองเขียนโค้ดเพื่อเอาไปให้มัน Run เล่นกันบ้างตามขั้นตอนด้านล่างนี้เลย

1.เข้าไปที่ resource group ที่สร้างไว้ แล้วจะเห็น Function App กับผองเพื่อนของมันโผล่ขึ้นมาละ ให้จิ้มสัมผัสมันเบาๆอย่างอ่อนโยน 1 ที

![](/files/-LoQMP3j-WKZhbphsfPN)

2.ถัดมาเขาก็จะโชว์รายการ Function ต่างๆที่เรามี ซึ่งกรณีนี้เราพึ่งสร้างเสร็จ มันเลยไม่มี function อะไรให้เราเลย ดังนั้นเราก็จะทำการสร้าง function กันละโดยการกดปุ่ม + เลยจ๊า

![](/files/-LnNZxb_AKCS9purL761)

3.ในการสร้าง function เราจะต้องเลือกว่าเราจะเขียนโค้ดด้วยวิธีไหน ซึ่งปรกติมีทั้ง 4 แบบ แต่ในรอบนี้เราจะใช้แบบที่เรียกว่า **In-portal** ครับ

| **me**                      | ชื่อ Logic App ที่จะสร้าง                                      |
| --------------------------- | -------------------------------------------------------------- |
| **Visual Studio**           | เขียนโค้ดบน Visual Studio IDE แล้วค่อยเอามาขึ้น Function App   |
| **VS Code**                 | เขียนโค้ดบน Visual Studio Code แล้วค่อยเอามาขึ้น Function App  |
| **Any editor + Core Tools** | เขียนโค้ดบน IDE อื่นๆที่เราถนัด แล้วค่อยเอามาขึ้น Function App |
| **In-portal**               | เขียนโค้ดบนคลาว์เลย                                            |

![](/files/-LtpHLpDBJXMVcxiwkun)

4.ถัดมาเขาจะถามว่าตัว function ของเราจะให้มันทำงานเมื่อไหร่ ซึ่งตัวหลักจะมี 3 แบบ แต่ในกรณีนี้เราจะเลือก Webhook + API ครับ

| **tudio**          | เขียนโค้ดบน Visual Studio IDE แล้วค่อยเอามาขึ้น Function App                          |
| ------------------ | ------------------------------------------------------------------------------------- |
| **Webhook + API**  | เราจะได้ลิงค์มา 1 ตัว ซึ่งเมื่อใครก็ตามเปิดลิงค์นี้ มันจะทำให้ function เราทำงานทันที |
| **Timer**          | ตั้งเวลาไว้ ซึ่งเมื่อถึงเวลาที่กำหนด มันจะทำให้ function เราทำงานทันที                |
| **More templates** | เลือกใช้ template แบบอื่นๆ (ลองกดเล่นดูได้นะ)                                         |

![](/files/-LshUHpxO7gTpZdD1WkD)

5.เป็นอันเรียบร้อย ตอนนี้เราก็จะได้ function มา 1 ตัวพร้อมกับโค้ดตัวอย่างพื้นฐานมาให้ด้วย คราวนี้เราก็จะลอง copy ลิงค์ที่ได้เพื่อเตรียมสั่งให้มันทำงาน โดยการกดปุ่ม **Get function URL** ตามรูปเบย

![](/files/-LpwHDjwCiu8m1OaqFIq)

![เสร็จแล้วก็กดปุ่ม Copy ครับ](/files/-LurvNqaLkdbOBeVB3ml)

> **อธิบายโค้ด**\
> โค้ดตัวอย่างที่เขาเตรียมให้ไว้คือ เมื่อมีใครเรียก URL นี้มา มันก็จะไปหาค่า name มาเก็บไว้โดยขึ้นอยู่กับวิธีเรียก\
> \[เรียกมาแบบ GET] ตัวโปรแกรมจะไปอ่าน query string เพื่อหาค่า name มาเก็บไว้ในตัวแปร name\
> \[เรียกมาแบบ POST] ตัวโปรแกรมจะไปหาใน request body เพื่ออ่านค่า name มาเก็บไว้ในตัวแปร name\
> ถัดมาเขาก็จะตอบกลับว่า Hello แล้วตามด้วยค่า name ที่เราใส่เข้ามา แต่ถ้าเราไม่ได้ใส่เขาก็จะบอกว่า ให้เราใส่ค่า name เข้ามาด้วย

6.หลังจากที่เรา copy แล้วถัดไปเราก็จะเอาไปลองเรียกดูผ่าน web browser ครับ ซึ่งพอลองเรียกเราก็จะได้ผลลัพท์แบบนี้

![](/files/-Lu0xaRbxXhDljt6YVeu)

7.สาเหตุที่เป็นแบบนี้ก็เพราะว่าเรายังไม่ได้ส่งค่า name เข้าไปด้วย ดังนั้นเราก็จะลองส่ง name เข้าไปใน query string นะครับ โดยการเรียก URL ผ่าน web browser เหมือนเดิมนั่นแหละแต่ต่อท้ายมันด้วย `&name=Saladpuk`ลงไปครับ ซึ่งก็จะได้ผลลัพท์แบบนี้

![](/files/-LrB9ou8b7cIA_J7aQGH)

8.นอกจากนี้เรายังสามารถลองเรียกใช้งานพร้อมดูผลลัพท์การทำงานแบบ real time ได้ด้วย โดยการกดปุ่ม Test ด้านขวาแล้วสั่งให้มัน Run ตามรูปเลยครับ

![](/files/-LoCglDFUW0smoSUxSMs)

![ผลลัพท์จากการ Run ก็จะออกมาในโซนสีแดงครับ](/files/-Lq6ojpVO6Th1nvVeGUq)

เป็นอันเสร็จเรียบร้อยแล้ว จากตัวอย่างก็จะเห็นว่าเราไม่ต้องไปยุ่งกับเซิฟเวอร์เลยว่าจะเลือก server แบบไหน CPU เท่าไหร่ Ram เท่าไหร่ ไรงี้ เรามีหน้าที่เขียนโค้ดเพื่อให้โปรแกรมมันทำงานตามที่เราอยากให้เป็นก็พอ ส่วนเรื่องเซิฟเวอร์ล่มหรือไม่ล่มทาง Microsoft จะดูแลรับผิดชอบให้เราเองไงล่ะ

## 🎥 ตัวอย่างการทำ Function App

{% embed url="<https://www.youtube.com/watch?v=rUWAE-toyWU&list=PLUjAn8nwWniiReiOqUqYwxG7ny2bhENMg&index=12>" %}

## 🎯 บทสรุป

เพียงแค่ใช้ Function App ก็จะทำให้ Developer ไม่ต้องมาคอยปวดหัวเรื่องเซิฟเวอร์ล่มอีกต่อไป เนื่องจากคลาว์จะเป็นคนดูแลทุกอย่างของเซิฟเวอร์ให้เรานั่งเอง ดังนั้นก็สามารถ focus กับการเขียนโค้ดได้สบ่ายสบายอุราแล้ว

{% hint style="warning" %}
ข้อควรระวัง\
ถ้าเราสร้าง Function App โดยใช้ App Service Plan เราต้องบริหารจัดการเรื่องทรัพยากรเครื่องเหมือนเดิมนะครับ ดังนั้นควรทำความเข้าใจเรื่องพวกนี้ดีๆก่อนค่อยสร้างนะครับ
{% endhint %}
