ทดลองสร้าง RESTful API ด้วย Serverless Lambda (Python) + API Gateway

การใช้โครงสร้างแบบ Serverless(API Gateway + Lambda) จะทำให้เราสามารถเผยแพร่ Web ได้ในราคาที่ถูกมากๆ โดยในบทความนี้จะมาแสดงวิธีการใช้งานเหล่านี้

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

สวัสดีครับ 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: เป็นสถาปัตยกรรมที่แบ่งแอปพลิเคชันขนาดใหญ่หนึ่งแอปพลิเคชันออกเป็นแอปพลิเคชันขนาดเล็กหลายๆแอปพลิเคชันโดยสามารถเปลี่ยนและผสมผสานกันได้
  • การกระจายระบบบนแพลตฟอร์ม REST, เพิ่มความสามารถในการขยายและการนำกลับมาใช้ใหม่และการบำรุงรักษา/การนำมาใช้จริงได้อย่างสะดวก
  • เนื่องจากมีการใช้REST ตามมาตรฐาน HTTP จึงสามารถใช้ Client และ Server ด้วยภาษาโปรแกรมที่รองรับ HTTP ได้

เป้าหมาย

เราจะดำเนินการ "Hello from Lambda!" โดยใช้ Lambda (Python) และ API Gateway

การสร้าง Lambda

เข้ามาที่ AWS Management Console แล้วเลือกรีเจี้ยน Singapore ที่แท็บด้านขวาบน

ค้นหา Lambda และเลือก Lambda

เลือก Functions จากเมนูด้านซ้าย

คลิก Create function

การตั้งค่า 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

» คลิก Add

เมื่อเพิ่ม 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

คลิก 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 เสร็จ)

คลิก Delete

คัดลอก Role name มาใส่ช่องด้านล่างตามคำแนะนำ และคลิก Delete

เลื่อนขึ้นมาด้านบนสุด แล้วคลิก Actions และเลือก Delete function

คลิก Delete

ราคา

REST API ที่ใช้ API Gateway และ Lambda เป็นการทำงานที่ราคาถูกมากๆ เนื่องจาก Lambda คือเวลาที่ระบบทำงานและจำนวนการรันคำสั่ง และ API Gateway คือค่าใช้จ่ายสำหรับการเรียก API หนึ่งครั้ง

ตัวอย่างเช่น:
・กรณีที่ไม่มีการเรียกใช้ API แม้แต่ครั้งเดียวใน 1 เดือนก็จะไม่มีค่าใช้จ่าย
・กรณีที่เวลาการรันคำสั่งของ Lambda คือ 0.1 วินาทีโดยเฉลี่ยด้วยการเรียกใช้ API 10,000 ครั้งใน 1 เดือน จะเป็นดังนี้

Region: Asia Pacific (Singapore)
บริการ ราคา
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) ครับ !

Link อ้างอิง