Review AWS Serverless stack in Production

Pao Payungsak Klinchampa
Next-Hop Co., Ltd.
Published in
4 min readJul 5, 2020

ในบทความนี้ผมจะเเนะนำ AWS Lambda ซึ่งเป็นบริการประเภท Function as a Service เราสามารถเขียนโปรเเกรมบน AWS ได้เลย โดยไม่ต้องเตรียม EC2 ขึ้นมารันเเละติดตั้งโปรเเกรมอะไรให้วุ่นวาย และจะใช้ AWS DynamoDB ซึ่งก็เป็น Database ประเภทไม่ต้องสร้าง Instance สามารถ add table เเละ add data ต่างๆลงไปได้เลย

เรามีสองอย่างนี้เเล้ว ก็ยังไม่เพียงพอครับ การที่เราจะเรียกใช้งาน Lambda ได้นั้น เราต้องเอาอะไรซักอย่างมาเรียกใช้มัน ซึ่งในที่นี้ เราจะใช้ AWS API Gateway มาเรียกใช้มันครับ

มาดูกันเลยว่ามีอะไรยังไงบ้าง

ในที่นี้ ผมจะขอยกตัวอย่าง API ง่ายๆ ที่มีเฉพาะ Method GET นะครับ โดยจะยกตัวอย่าง Stack ที่ผมใช้งานอยู่จริงๆ ซึ่งเป็นหน้าเว็บที่ผมใช้เเสดง Certificate ที่ผมได้รับมา (certificate.payungsakpk.xyz)

มาดูที่ AWS DynamoDB กันเลย

ของผมมีอยู่ 2 Table เเต่ที่ใช้ใน Project นี้จะชื่อ CertCatalog นะครับ มาดูกันว่าข้างในเป็นยังไง

พอเรากดเข้าไป เราจะเจอสิ่งที่เรียกว่า Item ครับ ลองกดเข้าไปดูซักอันกันเถอะ

โครสร้างด้านในจะเป็น JSON ครับ ของผมจะมีข้อมูลอยู่ไม่กี่อย่าง ก็คือ

Id : ใช้ในการอ้างอิง Certificate เเต่ละใบ

Name : ซื่อ Certificate ที่ได้รับ

Url : เป็น Url ของ Certificate นั้นๆ ในที่นี้ของผมจะเป็น file รูปภาพ เเละเก็บลง AWS S3 ครับ

ส่วนการ Add item ลงไป เราสามารถกดปุ่ม Add ได้ง่ายๆเลย แบบนี้

และก็กรอกข้อมูลต่างๆที่จำเป็นลงไป

ส่วนท่านที่ใช้ aws cli ได้ ก็สามารถ import item เข้าไปได้ครับ โดยมันรองรับการ import จาก file ด้วย

สำหรับ DynamoDB ผมขอรีวิวเพียงเท่านี้นะครับ ตัวมันยังทำอะไรได้อีกเยอะเลย ลองศึกษากันเองดู

มาต่อกันด้วย stack ตัวต่อไป ก็คือ AWS Lambda ครับ

ในที่นี้ จะใช้ Function ชื่อ getCertFromDDB นะครับ กดเข้าไปดูกัน !!!

อันนี้คือตัวอย่าง Code ที่ผมเขียนขึ้นมา เพื่อดึงข้อมูลจาก DynamoDB อันนี้จะเขียนกับ Java Script นะครับ

และเราต้องกำหนดค่า Role ให้มันนิดหน่อย ไม่งั้นมันจะติดต่อกับ DynamoDB ไม่ได้

กดเข้าไปดูที่ Role ที่มันสร้างมาให้ เราก็จะเจอ เเบบนี้

โดยผมจะเพิ่ม Policy ชื่อ AmazonDynamoDBReadOnlyAccess ลงไปครับ เพื่อให้มันอ่านข้อมูลออกมาได้ ส่วนถ้าจะเขียนข้อมูลด้วย ก็เลือกเป็น FullAccess ก็ได้ หรืแจะสร้าง Policy ด้วยตัวเอง ที่มีความรัดกุมก็ได้เช่นกันครับ

มาดู AWS API Gateway กันต่อ ซึ่งเจ้านี่จะเป็นตัวที่คอยรับ Request เข้ามา เเละส่งต่อไปให้ Lambda ประมวลผล

ผมมีอยู่ 2 API เเต่ในที่นี้จะใช้ pao-api นะครับ ลองกดเข้าไปดูกัน !!!

เราสามารถ Add resource เข้าไปได้ (ก็คือ Path นี่ล้ะครับ) กับ Method (HTTP Method) และเราก็กำหนดได้ว่า เเต่ะ Path / Method จะยิง request ไปที่ไหนต่อ ซึ่งมันก็รองรับทั้ง HTTP / Lambda / AWS Services / VPC Link

สำหรับ Project นี้ ผมใช้ชื่อ Resource ว่า getcert เเละใช้ Method GET ครับ กดเข้าไปดูกันต่อ

ก็จะมีแผนผังหน้าตาเเบบนี้เเสดงขึ้นมา เพื่อบอกเราว่า request / responce จะวิ่งไปไหนบ้าง โดยในที่นี้ ที่เราจะสนใจก็คือ Integration Request ครับ กดเข้าไปดูกัน

การเชื่อมต่อกับ Lambda เพียงเเค่เลือก Lambda function กำหนด region เเละเลือกชื่อ function ที่เราต้องการได้เลย

มาดูที่ Method request กันบ้างครับ ตรงส่วนนี้เราสามารถทำ Authentication / Validator ได้ด้วย เเต่ของผมไม่ได้ทำเอาไว้นะ

มาดูที่ Stage กันบ้าง ในหน้านี้จะเเสดง URL ที่เราจะเอาไปใช้ เเต่ของผมใช้ Custom Domain Name ซึ่งมันสั้นกว่ากันเยอะ 555+

เราสามารถ Limit rate ได้ กำหนด WAF Rule ได้ เเละกำหนด Client Certificate ได้

เเต่ Client Certificate จะใช้กับ Lambda ไม่ได้นะ ต้องใช้กับพวก HTTP นู่น

อันนี้ตัวอย่างหน้า Custom Domain ครับ โดยมันจะมี API Gateway domain name ให้ 2 เเบบให้เราเลือก ก็คือ เเบบ Region กับ Global ซึ่งอันนี้มันจะใช้ Cloudfront

มาลองเรียกใช้ API กันดูบ้างนะครับ

เราก็จะได้ข้อมูลจาก DynamoDB ที่ Lambda ไปอ่านมา เเล้ว responce กลับมาที่ AWS API Gateway อีกรอบ (จริงๆของผมจะใช้ Cloudflare ทำ WAF + Limit Rate ไว้อีกชั้นนึงด้วยนะ)

อันนี้เป็นหน้าเว็บ Production นะครับ ผมเขียนกับ React เเล้วใช้ fetch มาเรียกใช้ API เอาค่าที่ได้มาเก็บลง state เเล้ว render ออกมา

ตัวหน้าเว็บผมใช้ NGINX + AWS ALB นะครับ เพราะต้องใช้อยู่เเล้วกับหน้าเว็บอื่นๆ เเละใช้ทำเเล็บด้วย เเต่ประหยัดด้วยการใช้ Spot instance เเทน เพราะถ้าหน้าเว็บนี้ตาย ผมก็ไม่ได้เดือดร้อนอะไร 555 เเต่ระวังการเอาไปใช้ใน Production ด้วย เพราะ spot จะโดน aws terminate ทิ้งเมื่อไรก็ไม่รู้ เเต่ EBS ไม่ได้หายไปด้วยนะ ผมก็จะเอา EBS ไป Provision เป็น EC2 เครื่องใหม่อีกก็ได้ ส่วน Data ก็อยู่ใน EFS ไม่กลัวหาย เเต่ถ้าจะประหยัดอีก เก็บลง S3 ก็ได้นะครับ

ก็เป็นหน้าเว็บง่ายๆที่ผมเขียนขึ้น ซึ่งก็ปรับปรุงจากครั้งก่อน ตอนนั้นไม่ได้เรียกใช้ API อะไรเลย เป็น static web ธรรมดาๆ เมื่อผมได้ Cert เพิ่ม ก็ต้องเเก้ Code เเละ Build ใหม่ และก็ต้อง Deploy ใหม่อีก

พอใช้ Stack นี้ ก็เเค่ไปเพิ่ม Item ลง AWS DynamoDB เท่านั้น ก็ช่วยประหยัดเวลาลงไปได้ เเต่มันก็อาจจะโหลดช้าหน่อย หากผมมี Certificate มากขึ้น ตรงนี้ค่อยปรับให้มันโหลดหน้านึงไม่เกิน 10 ใบก็เเล้วกัน 555+

หวังว่าทุกๆท่าน คงพอได้ไอเดียนะครับ ว่าเราจะเอา stack พวกนี้ไปใช้อะไร

อีกเรื่องก็คือลดรายจ่ายด้วย เว็บง่ายๆของผมที่เเทบไม่มีใครเข้า ใช้ stack นี้เเทบไม่เสียตังค์เลย อาจมีเสียค่า Cloudfront บ้างนิดๆหน่อยๆ

แต่ถ้าเราสร้าง EC2 ขึ้นมา ใช้ t3.nano ที่เป็นตัวเล็กๆเเล้ว อย่างน้อยในเเต่ละเดือนต้องจ่ายๆ ราวๆ 8 USD เเน่ๆครับ และถ้าจะลง Database อีกด้วย ใช้ spec เเค่นี้คงช้าไป อาจต้องใช้ instance ที่ใหญ่ขึ้นอีกนิดอย่าง t3.micro ก็ต้องเพิ่มรายจ่ายเข้าไปอีก

ยังมีอีกหลายๆอย่างที่ผมใช้เป็นเเบบ Serverless นะครับ เเล้วค่อยมารีวิวกันอีกรอบ สวัสดีครับ :D

--

--