มาอัพโหลด File เข้า S3 ด้วย API Gateway + Lambda ด้วย Nodejs กัน

บทความเดิมจากตอนที่แล้ว มาทำความรู้จักและข้อเปรียบเทียบ Firebase Functions vs AWS Lambda สามารถทำความรู้จักกับ Lambda ได้ใน Link นี้เลยนะครับ

จากรูป เราจะไม่สามารถเรียกใช้งาน Function ตรงๆ ผ่าน Lambda จากภายนอกได้ จึงต้องผ่าน Service ที่มีชื่อว่า API Gateway ซึ่งมันคือตัวที่จะไปเรียกใช้ Api ที่เราสร้างใน Lambda เพื่อให้เราเข้าถึง Lambda จากภายนอกได้ และเป็นตัวควบคุมความปลอดภัยข้อมูลขาเข้า ก่อนถึง Function ใน Lambda ด้วย ปลอดภัยทั้งก่อนเข้าและฝั่ง ที่เราทำ Security Code ใน Lambda

โดยในครั้งนี้ผมจะ Serverless Framework มาเพื่อจัดการ Code และ การ Deploy ขึ้น Lambda

ขั้นแรกเลยติดตั้ง Serverless ลงในเครื่องของตัวเองก่อน

npm install -g serverless

หลังจากนั้นให้ Serverless เชื่อมต่อกับ AWS เรา

sls config credentials --provider aws --key PUBLIC_KEY --secret SECRET_KEY

หลังจากนั้นเข้าไปที่ AWS Console เพื่อเอา PUBLIC_KEY, SECRET_KEY

หลังจากเข้า Console แล้วให้มาที่ IAM เข้า Menu Users แล้วคลิกที่ชื่อ Account เรา แล้วเลือก Tab Security credentials แล้วกดสร้าง Access Key เราจะได้ PUBLIC_KEY, SECRET_KEY มา

หลังจากนั้นสร้าง Folder Code ของเราได้เลย

mkdir lambda-demo && cd lambda-demo

จากนั้นติดตั้ง Serverless ใน Folder Code ของเรา

sls create -t aws-nodejs -n lambda-demo

หลังจากนั้นเราก็ทำการติดตั้ง Nodejs ปกติลงใน Folder ของเรา

npm init -y
npm install serverless-http
npm install express express-multipart-file-parser cors body-parser

หลังจากเข้ามาเราก็ทำการโหลด Libraries ต่างๆเข้ามา หลักๆผมจะใช้ Express ในการทำ RESTful API ใช้ express-multipart-file-parser เพื่อทำการจัดการ File Upload ต่างๆ และใช้ Cors เพื่อให้เข้าถึงจากภายนอกได้ ส่วน body-parser เอาไว้เวลาส่ง body เป็น json เข้ามา แต่เราจะพูดถึงแค่ตัวอัพโหลด File เท่านั้นในครั้งนี้

หลังจากเสร็จสิ้นเราจะได้หน้าตาออกมาแบบนี้

เปลี่ยนชื่อ handler.js เป็น app.js จะได้ดูสวยกว่า 555

หลังจากนั้นเราก็กลับไปที่ AWS Console แล้วไปที่ S3 กลับไป Create Bucket ชื่อในโลกนี้จะเป็น Primary Key จะไม่สามารถซ้ำกับใครได้

เลือกที่ใกล้ที่สุดก็ต้องเป็น ap-southeast-1

หลังจากนั้นผมเอา Block all public access ออกไปก่อนเพื่อที่จะได้ง่ายต่อการแสดงตัวอย่าง

หลังจากสร้างเสร็จจะได้ออกมาแบบนี้ให้เราเข้าไปใน Folder เพื่อปรับให้มีเวลาอัพรูปแล้วให้เป็น public เพื่อนำไปแสดงจากภายนอกได้ โดยเข้าไปที่ Tab Permission จริงๆมันมีการเข้าถึงแบบ Private ได้นะครับ แต่วันนี้ผมทำแบบ Public ก่อน ไว้จะทำ Code สำหรับ เข้าถึง File แบบ Private นะครับ

ทำการแก้ edit bucket policy

หลังจากทำขั้นนี้แล้วเราก็สามารถนำรูปไปใช้ภายนอกเพื่อแสดงได้แล้ว

กลับมาส่วนของ Code ตอนนี้ เราสามารถที่จะทำการอัพโหลดผ่าน Local ของเราได้แล้ว ทำการติดตั้ง SDK ของ AWS ใน Code เรา

npm install aws-sdk

หน้าตาของ Code เป็นการทำ RESTful API สำหรับ Upload รูป จะได้ประมาณนี้ bucketName คือที่ผมสร้าง folder ไว้ใน AWS S3 และ region ก็ตามตอนที่เราเลือกตอนสร้าง bucket

หลังจากนั้นเราลองทดสอบยิง API ผ่าน local โดยใช้ Post Man

node app.js

ก็จะเข้าบน AWS ตอนนี้แสดงว่าการ Upload ของเรา Work แล้ว

ก็จะมี File เข้ามาใน bucket ที่เราสร้างไว้ หลังจากนั้นเราจะมาทำการ Deploy ขึ้น AWS Lambda กัน

หลังจากนั้นกลับมาที่ Code ไปดูที่ File serverless.yml ของเรา

Copy ไปเปลี่ยนแปลงตามที่ต้องการได้เลยผม Comment อธิบายไว้บางส่วน หลังจากนั้นทำการ deploy

sls deploy

หลัง deploy เสร็จก็เป็นอันเสร็จสิ้น แต่ยังไม่ท้ายสุดถ้าเป็น api ธรรมดาที่ไม่ได้อัพโหลดเข้า S3 ก็สามารถใช้ API ได้เลย หลังจาก deploy เสร็จให้กลับไป AWS Console แล้วเข้าไปที่ API GATEWAY

คลิกไปที่ API ชื่อที่เรา deploy แล้วไปที่ Settings

หลังกด Settings เข้ามา แล้วมาเพิ่ม multipart/form-data ตรง Binary Media แล้วกด Save

หลังจากนั้นเราจะอยู่ที่ AWS Console อยู่ แล้วทำการไป Services ที่ชื่อว่า Lambda เข้าไปตัว Lambda ที่เราทำการ Deploy

หลังจากเข้ามาแล้ว เข้า Tab Configuration แล้วกด Role name เพื่ออนุญาติให้ตัว Lambda เข้าถึง S3

หลังจากกดเข้ามาแล้วทำการ Attach เพื่อเข้าไปเพิ่ม Policy ให้เข้าถึง S3

ค้นหาคำว่า S3 เลือก FullAccess เพื่อให้ Lambda เข้าถึง S3 ได้ทุกอย่างเป็นอันเสร็จสิ้น แล้วเรามาลองยิง API กัน โดยใช้ Post Man

หลังจากยิง API ก็จะได้ Response ตามที่เราทำไว้ใน Code

เราสามารถปรับ Timeout ของตัว Lambda ได้เช่นกันเผื่อบางงานต้องใช้การประมวลผลขนาดใหญ่

*ทดสอบกันเสร็จอย่าลืมไปปิด File ให้กลับเป็น Private กันนะครับ เพราะตัวอย่างผมทำเป็น Public ไว้เดียวผมจะวนมาเขียนการเข้าถึง File ที่เป็น Private นะครับ

บทความนี้เป็นตัวอย่างการทำ API Upload รูปเข้า S3 ผ่าน API Gateway + Lambda โดยที่เราไม่ต้องตั้ง Server เองใช้แค่ไหนจ่ายแค่นั้น โดยเจ้าตัว S3 มันยังมีประโยชน์มหาศาลมากกว่าแค่การ Upload ยกตัวอย่าง อย่างเช่นเรามีระบบ CRM แล้วลูกค้าอยากเอาข้อมูลบางส่วนของระบบเขาเข้ามาที่ CRM เรา แล้วเขาไม่มี API ส่งแต่ Excel มา เราก็ใช้ประโยชน์จากเจ้าตัว S3 โดย Upload Excel เข้าไป แล้วเขียน Function Lambda ไว้อ่าน File แล้วประมวลผลเข้า Database CRM ของเรา เพราะ Lambda อ่าน S3 หลักล้าน ROW ภายในไม่กี่นาที อันนี้เป็นแค่การยกตัวอย่างนะครับ

GIT ตัวอย่าง Code Upload S3

บทความเดิมจากตอนที่แล้ว มาทำความรู้จักและข้อเปรียบเทียบ Firebase Functions vs AWS Lambda

( CR. ธำรงค์ ไชยวงค์ )