มาอัพโหลด 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 ภายในไม่กี่นาที อันนี้เป็นแค่การยกตัวอย่างนะครับ
บทความเดิมจากตอนที่แล้ว มาทำความรู้จักและข้อเปรียบเทียบ Firebase Functions vs AWS Lambda
( CR. ธำรงค์ ไชยวงค์ )