ทดลองสร้าง RESTful API ด้วย Serverless Lambda (Python) + API Gateway
สวัสดีครับ POP จากบริษัท Classmethod (Thailand) ครับ
ครั้งนี้ผมจะมาแนะนำเกี่ยวกับการทดลองสร้าง RESTful API ด้วย Serverless Lambda(python) + API Gateway
RESTful API คืออะไร
REST
- ตัวย่อของ REST คือ Representational State Transfer
- หมายถึงการระบุทรัพยากร(Resource) ด้วย HTTPURI(Uniform Resource Identifier) และใช้ CRUD Operation กับทรัพยากรที่เกี่ยวข้องโดย HTTP Method(POST、GET、PUT、DELETE)
- REST ใช้ประโยชน์เทคโนโลยีที่มีอยู่ของเว็บและโปรโตคอล HTTP โดยพื้นฐานตามที่เป็นอยู่ ดังนั้นจึงเป็นรูปแบบสถาปัตยกรรมที่สามารถใช้ประโยชน์สูงสุดจากจุดแข็งของเว็บได้
RESTful API
- การทำให้ Service API บนแพลตฟอร์ม REST ใช้งานได้จริง
- ทุกวันนี้ บริษัทส่วนใหญ่ให้บริการ OpenAPI, Microservices และอื่นๆ เป็นการให้บริการ REST API
- OpenAPI: เป็น API ที่เผยแพร่เพื่อให้ทุกคนสามารถใช้งานได้
ตัวอย่างเช่น Google Maps, Public Data เป็นต้น - Microservices: เป็นสถาปัตยกรรมที่แบ่งแอปพลิเคชันขนาดใหญ่หนึ่งแอปพลิเคชันออกเป็นแอปพลิเคชันขนาดเล็กหลายๆแอปพลิเคชันโดยสามารถเปลี่ยนและผสมผสานกันได้
- OpenAPI: เป็น API ที่เผยแพร่เพื่อให้ทุกคนสามารถใช้งานได้
- การกระจายระบบบนแพลตฟอร์ม REST, เพิ่มความสามารถในการขยายและการนำกลับมาใช้ใหม่และการบำรุงรักษา/การนำมาใช้จริงได้อย่างสะดวก
- เนื่องจากมีการใช้REST ตามมาตรฐาน HTTP จึงสามารถใช้ Client และ Server ด้วยภาษาโปรแกรมที่รองรับ HTTP ได้
เป้าหมาย
เราจะดำเนินการ "Hello from Lambda!" โดยใช้ Lambda (Python) และ API Gateway
การสร้าง Lambda
เข้ามาที่ AWS Management Console แล้วเลือกรีเจี้ยน Singapore
ที่แท็บด้านขวาบน
เลือก Functions
จากเมนูด้านซ้าย
การตั้งค่า Create function มีดังนี้:
» เลือก Author from scratch ◎
หัวข้อ Basic information
» Function name: hello-world-python
(ป้อนชื่อตามต้องการ)
» Runtime: Python 3.9
» เมื่อตั้งค่าเสร็จแล้ว เลื่อนลงมาด้านล่างสุดและคลิก Create function
เมื่อสร้างเสร็จแล้วจะแสดงหน้าจอแบบนี้ แล้วคลิก + Add trigger
การตั้งค่า Add trigger มีดังนี้:
หัวข้อ Trigger configuration
» ค้นหาและเลือก API Gateway
» Intent: Create a new API
(เมื่อเลือกแล้ว API type จะปรากฏขึ้นมา)
API type
» เลือก ◎ REST API
» Security: Open
เมื่อเพิ่ม trigger เสร็จแล้วจะแสดงหน้าจอแบบนี้
จากนั้นให้เลื่อนลงมาด้านล่างแล้วเลือกแท็บ Code
ก็จะเห็น Code แสดงอยู่ในแท็บ lambda_function
import json def lambda_handler(event, context): # TODO implement return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') }
ต่อไปเราจะทดสอบคำสั่งโดยเลือกแท็บ Test
แล้วคลิกปุ่ม Test
แล้วให้คลิก ▶ Details
ก็จะแสดง "Hello from Lambda!" แบบนี้
การตั้งค่า API Gateway
ค้นหา API Gateway
และเลือก API Gateway
เมื่อเข้ามาแล้วก็จะเห็นชื่อ [your_name]-API
แบบนี้ เนื่องจากตอนที่เราเพิ่ม Trigger ใน Lambda จะทำให้ "[your_name]-API" ถูกสร้างขึ้นในนี้ด้วย
ให้เราคลิกเข้าไปที่ Name ของเรา
เมื่อเข้ามาแล้วให้คลิก Actions
แล้วเลือก Deploy API
แล้วจะมีหน้าจอ "Deploy API ◎" ปรากฏขึ้นมา ให้เลือก Deployment stage: default
และคลิก Deploy
แล้วคลิก "▶
default" แล้วเลือก GET
และคลิก Invoke URL: https://xxxxxxxxxx.execute-api.ap-southeast-1.amazonaws.com/default/hello-world-python
(Invoke URL จะแสดงอยู่ใน "DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT" โดย Invoke URL ที่อยู่ในตัวเลือกเหล่านี้จะแตกต่างกัน)
เมื่อเปิดลิงก์ขึ้นมาแล้วจะแสดงข้อความ "Hello from Lambda!"
แบบนี้
การลบ API Gateway และ Lambda
การลบ API Gateway
เราจะทำการลบ API Gateway แล้วดูผลลัพธ์หลังจากการลบกัน
กลับมาที่หน้าแรกของ Amazon API Gateway เลือก Name ของเรา แล้วคลิก Actions
และคลิก Delete
กลับมาที่หน้าเว็บเบราว์เซอร์ แล้วคลิก Reload จะเห็นว่าเมื่อลบ APIs ใน API Gateway แล้วก็จะไม่สามารถรันคำสั่งจาก Lambda มายัง Invoke URL ที่กำลังเปิดอยู่ได้
ทีนี้เราลองมาตรวจสอบ Triggers ที่สร้างใน AWS Lambda ดูบ้าง
เข้ามาที่หน้า Lambda ของเรา แล้วเลือกแท็บ Configuration
แล้วเลือก Triggers
จะเห็นว่า API Gateway แสดงเป็น ✕ The API with ID xxxxxxxxxx could not be found.
ซึ่งหมายความว่าถ้าเราลบ APIs ใน API Gateway ตัว Trigger ที่เราสร้างขึ้นใน Lambda นี้ก็จะหายไปด้วย
การลบ Lambda
หลังจากที่เราตรวจสอบ Triggers เสร็จแล้ว เรายังคงอยู่ที่แท็บ Configuration ในหน้า AWS Lambda นี้
จากนั้นเลือก Permissions
แล้วเลือก Role name: [your_name]-role-xxxxxx
(Role name นี้ถูกสร้างโดยอัตโนมัติหลังจากสร้าง Lambda เสร็จ)
คัดลอก Role name มาใส่ช่องด้านล่างตามคำแนะนำ และคลิก Delete
เลื่อนขึ้นมาด้านบนสุด แล้วคลิก Actions
และเลือก Delete function
ราคา
REST API ที่ใช้ API Gateway และ Lambda เป็นการทำงานที่ราคาถูกมากๆ เนื่องจาก Lambda คือเวลาที่ระบบทำงานและจำนวนการรันคำสั่ง และ API Gateway คือค่าใช้จ่ายสำหรับการเรียก API หนึ่งครั้ง
ตัวอย่างเช่น:
・กรณีที่ไม่มีการเรียกใช้ API แม้แต่ครั้งเดียวใน 1 เดือนก็จะไม่มีค่าใช้จ่าย
・กรณีที่เวลาการรันคำสั่งของ Lambda คือ 0.1 วินาทีโดยเฉลี่ยด้วยการเรียกใช้ API 10,000 ครั้งใน 1 เดือน จะเป็นดังนี้
บริการ | ราคา |
---|---|
Lambda | 0.0186667 |
API Gateway | 0.0425 |
จากตัวอย่างในตารางด้านบนนี้ ก็จะเป็นราคาประมาณ 2 บาท
แต่ในความเป็นจริง ราคาจะถูกกว่านี้เพราะมี Free Tier
เราจะสามารถเผยแพร่ Web ได้ในราคาที่ถูกมากๆ ด้วยการใช้โครงสร้างแบบ Serverless(API Gateway + Lambda) นี้
หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับราคาให้ดูที่ลิงก์ด้านล่างนี้
สรุป
URL นี้ยังเป็น Open อยู่ ดังนั้นทุกคนสามารถมองเห็นได้ เมื่อทุกคนสามารถมองเห็นได้และถ้ามีการเชื่อมต่อด้วย URL นี้จากเบราว์เซอร์ไปยัง API Gateway ก็จะมาที่ Lambda และ Lambda ก็ดำเนินการรันโปรแกรมนี้
'statusCode': 200
จะใช้เป็น 200 เมื่อ HTTP สำเร็จ ถ้าตั้งค่าไว้ที่ 200 ก็จะแสดงแบบนี้
'body'
เป็นเนื้อหาที่แสดงบนเว็บเบราว์เซอร์ โดย body จะแสดงเป็น "Hello from Lambda!"
lambda_function
import json
def lambda_handler(event, context):
# TODO implement
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
ผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ
POP จากบริษัท Classmethod (Thailand) ครับ !