Use Lambda Layer to reduce lambda function size
Bối cảnh
- Khi deploy 1 function lên lambda, nếu function đó có sử dụng code của thư viện ngoài, thì ta sẽ cần push cả code của thư viện đó lên. (Ví dụ khi deploy Nodejs function mà có sử dụng lib A thì ta sẽ cần push cả folder
node_modules
chứa lib A lên Lambda)
Problems
Lambda cho phép mình edit function trực tiếp trên Lambda Console. Tuy nhiên, nếu size của
source_code.zip
> 3MB thì Lambda sẽ không cho phép edit trực tiếp. => Nếu function sử dụng lib nào đó nặng (vd sharp ~ 21MB), thì dù có zip lại file size cũng > 3MB => Không edit trên Lambda được.Một số thư viện sử dụng binary files, được compile theo hệ điều hành đang sử dụng. Nếu bạn đang dùng MacOS, chạy npm install thì nó sẽ tải binary file dùng cho MacOS. Nếu dùng Ubuntu thì npm sẽ tải binary file dùng cho Ubuntu. Lambda sử dụng môi trường Linux để execute function. Nên nếu ở local mình dùng MacOS, cài thư viện, sau đó package thành zip file rồi upload lên Lambda thì thư viện đó có thể không chạy được.
Solution
- Lambda hỗ trợ layer. Đại ý là ta có thể tách phần thư viện, dependencies ra, sau đó build, đóng gói rồi push phần đó lên AWS. Trong code chính của function thì chỉ cần require vào. => Sử dụng layer sẽ giảm thời gian cho quá trình upload, deploy, có thể tái sử dụng cho nhiều lambda function. Ngoài ra do lúc này các thư viện nặng đã được tách ra, nên code function chính sẽ nhỏ hơn => Có thể edit trực tiếp trên Lambda Console được. Notes: Lambda layers chỉ dùng được cho lambda function, không dùng được cho lambda@edge.
Refer: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html https://aws.amazon.com/blogs/compute/using-lambda-layers-to-simplify-your-development-process/