การใช้งาน AWS Lambda และ Amazon API Gateway ร่วมกับโปรเจกต์ React

ในบทความครั้งนี้ ผมจะใช้โปรเจกต์ React ทำเป็นเว็บไซต์นำเสนอรูปภาพต่างๆ โดยดึงข้อมูลผ่านทาง AWS Lambda และ Amazon API Gateway ใช้หลักการ SPA(Single-page application) ผ่าน Axios library ของ JavaScript ซึ่งไฟล์รูปภาพจริงจะอยู่ใน Amazon S3

ข้อกำหนดเบื้องต้น

  • บทความนี้มีเนื้อหาที่ต่อยอดมาจากบทความ การ Deploy โปรเจกต์ React โดยใช้ Amazon S3 และ Amazon CloudFront เพราะฉะนั้นควรทำความเข้าใจเนื้อหาในบทความก่อนหน้าก่อนครับ
  • โดยในบทความนี้เราจะใช้โปรเจกต์ React ตาม ลิงก์ นี้แทน หากเข้าใจและเคยทดลองทำตามบทความก่อนหน้ามาแล้ว สามารถทำตาม Step 1 ของบทความก่อนหน้า เพื่อเปลี่ยนโปรเจกต์ React มาเป็นตัวนี้แทนได้ครับ

Step 1: เตรียมรูปภาพสำหรับใช้ในโปรเจกต์ React ไว้บน Amazon S3

ในส่วนของ Amazon S3 ทำการสร้างโฟลเดอร์ assets สำหรับเก็บรูปภาพไว้ในโฟลเดอร์นี้ โดยคลิกที่ Create folder

ในช่อง Folder name ใส่ assets แล้วคลิกที่ Create folder

อัปโหลดรูปภาพตามที่ต้องการไปที่โฟลเดอร์ assets โดยในบทความนี้ผมจะใช้เป็นรูปสายพันธุ์สุนัขต่างๆ จำนวน 9 รูปจาก pexels.com

ในกรณีที่ไม่ต้องการหารูปภาพมาใช้เอง ผมก็ได้อัปโหลดรูปภาพไว้ในโปรเจกต์ React ตามโฟลเดอร์ในรูปภาพด้านล่าง สามารถใช้คำสั่ง git clone (สามารถดูขั้นตอนได้จาก บทความก่อนหน้า) ให้ดาวน์โหลดรูปภาพแล้วนำไปอัปโหลดไว้ที่ Amazon S3 ได้เลยครับ

เราสามารถทดสอบได้โดยใช้ URL ของ Amazon CloudFront หรือ Amazon Route 53 จากบทความที่แล้ว ตามด้วย path ของไฟล์ที่อยู่ใน Amazon S3 ตามตัวอย่างด้านล่าง

https://[URL Amazon CloudFront หรือ Amazon Route 53]/assets/[ไฟล์รูปภาพ]

หากทำถูกต้องจะสามารถเข้าถึงไฟล์รูปภาพที่เราเพิ่งจะอัปโหลดไปได้ โดยใช้ URL ตามด้านบนไปวางที่ Browser

Step 2: สร้าง AWS Lambda

ใน AWS management console เข้าไปที่ AWS Lambda จากนั้นคลิก Create function

ในส่วนของ Function name สามารถใส่ชื่อได้ตามที่ต้องการ และในช่อง Runtime ปล่อยให้เป็น Node.js ไว้ จากนั้นคลิก Create function

เมื่อสร้าง AWS Lambda เรียบร้อยให้เลื่อนลงตรงส่วนของ Code source ให้คัดลอกโค้ด Node.js ที่อยู่ด้านล่างนี้ไปใส่ใน index.mjs โดยข้อความใน [URL] ให้ใส่เป็น URL ที่ใช้เข้าถึงไฟล์รูปภาพใน Amazon S3 และ [description] ให้ใส่เป็นคำบรรยายรูปภาพนั้นๆ

export const handler = async (event) => {
  const queryParams = event.queryStringParameters || {};
  const images = [
        {"id": 1,"url": "https://[URL]", "description": "[description]"},
    ]
  const imagesForResponse = images.slice((queryParams.page-1) * queryParams.perPage, queryParams.page * queryParams.perPage)
  return {
    statusCode: 200,
    body: JSON.stringify(imagesForResponse)
  }
};


จากนั้นคลิกมาที่ส่วนของ Test ในช่อง Event name ใส่ชื่อตามที่ต้องการ และในส่วนของ Event JSON ให้ใส่ {} จากนั้นคลิก Test และ Save ตามลำดับ

กลับมาที่หน้า Code คลิกที่ Test

จะปรากฏข้อความดังรูป การตั้งค่าในส่วนของ AWS Lambda จะมีเพียงเท่านี้

Step 3: สร้าง Amazon API Gateway

กลับมาที่ AWS management console ค้นหาและเข้าไปที่ Amazon API Gateway จากนั้นคลิก Create API

คลิก Build ในหัวข้อ HTTP API

ในช่อง Integrations เลือก Lambda และถัดมาที่ช่อง Lambda function เลือก Lambda ที่เราสร้างไว้ ส่วนของ API name ให้ตั้งชื่อ API Gateway ที่เราต้องการ จากนั้นคลิก Next

เลือก Method เป็น GET และในช่อง Resource path ตั้งชื่อตามที่ต้องการ จากนั้นคลิก Next

ส่วนนี้จะเป็นการตั้งชื่อ Stage name ก็ให้ตั้งชื่อตามที่ต้องการเช่นกัน จากนั้นคลิก Next

ในส่วนสุดท้ายจะเป็นหน้า Review เมื่อตรวจสอบความถูกต้องเรียบร้อยแล้ว สามารถกด Create ได้เลยครับ

เมื่อสร้าง Amazon API Gateway ให้มาที่แถบด้านซ้ายตรงหัวข้อ Develop กดตรงคำว่า CORS จากนั้นคลิก Configure ที่มุมบนขวา และให้ใส่ * ตรงช่อง Access-Control-Allow-Origin เป็นการให้สิทธิทุกเว็บไซต์สามารถนำ API endpoint ของ Amazon API Gateway ไปใช้งานได้ หรือหากต้องการจำกัดสิทธิก็ใส่เฉพาะ URL ของเว็บไซต์ที่ต้องการนำไปใช้ ตัวอย่างเช่น URL ของ Amazon CloudFront และ Amazon Route 53 จากนั้นกด Save

กลับมาที่ AWS Lambda ส่วน Configuration จะเห็นว่ามี Amazon API Gateway เชื่อมกับ AWS Lambda เรียบร้อยแล้ว ให้ทำการคัดลอก API endpoint เพื่อนำไปใช้ในขั้นตอนต่อไป

Step 4: Deploy โปรเจกต์ React ขึ้น Amazon S3

ใช้ VSCode ทำการ Extention Remote – SSH ไปยัง EC2 และทำการ git clone โปรเจกต์ React ตาม ลิงก์ นี้ (สำหรับผู้ที่ทำตาม Step 1 ที่ใช้คำสั่ง git clone เพื่อดาวน์โหลดรูปภาพมาใช้แล้ว สามารถข้ามคำสั่งนี้ได้เลยครับ)
จากนั้นให้แก้ไข URL ในส่วนนี้แทนที่ด้วย URL ของ Amazon API Gateway ที่เราสร้างไว้ และผมได้กำหนดจำนวนรูปภาพเอาไว้ที่ 3 รูป ต่อการเรียกใช้ 1 ครั้ง หากต้องการเรียกใช้รูปภาพมากกว่านี้ ก็สามารถเปลี่ยนตัวเลขตรง const perPage ได้ครับ

หลังจากที่เรา Deploy โปรเจกต์ React ไปที่ Amazon S3 เรียบร้อยแล้ว (ขั้นตอนการทำอยู่ในบทความก่อนหน้า) ลองนำ URL ของ Amazon CloudFront หรือ Amazon Route 53 ไปเปิดใน Browser ก็จะได้เว็บไซต์ตามภาพด้านล่าง
และเมื่อเรากดปุ่ม Show More โปรเจกต์ React จะดึงรูปภาพมาตามลิงก์ทีละ 3 รูปตามที่ตั้งค่าไว้ในโปรเจกต์จนกว่าจะไม่มีข้อมูลให้ดึงอีก และเมื่อเราเพิ่ม URL รูปภาพใน AWS Lambda หรือเขียนคำสั่งบน AWS Lambda ให้ส่ง URL รูปภาพมาทุกครั้งที่มีการอัปโหลดรูปใหม่มายัง Amazon S3 เว็บไซต์ก็สามารถแสดงรูปภาพใหม่ได้ โดยที่เราไม่ต้องไปแก้ไขโค้ดในโปรเจกต์ React

สรุป

ในบทความนี้เป็นการนำ AWS Lambda และ Amazon API Gateway ซึ่งเป็นบริการของ AWS มาใช้ร่วมกับ SPA(Single-page application) ซึ่งจะทำให้เว็บไซต์ของเราใช้งานได้สะดวกมากยิ่งขึ้นเมื่อมีข้อมูลใหม่ๆเพิ่มขึ้นมา โดยที่ไม่ต้องไปแก้ไขโปรเจกต์ React ทุกครั้งที่มีการอัพเดทข้อมูล ซึ่งนี่ก็เป็นอีกหนึ่งจากหลายหลายฟังก์ชันที่ AWS Lambda สามารถทำได้ครับ

บทความที่เกี่ยวข้อง