AWS Lambda: Run Code Without Server
4 min read
- FaaS – Functions as a Service
- Serverless: chúng ta không cần quan tâm về vấn đề quản lý các servers thật
So sánh EC2 và Lambda
EC2 | Lambda |
---|
Là server ảo trên cloud | Là các functions |
Giới hạn về RAM và CPU | Giới hạn về thời gian chạy |
Thường sẽ chạy liên tục | Sẽ chỉ chạy khi được request (thường sẽ ngắn) |
Chỉ có thể scale bằng cách tăng giảm số lượng (scale theo chiều ngang) – Cần setup thủ công | Cho phép chạy song song (tự có phần scale mà ko cần setup) |
- Giá rất rẻ: tiền được tính theo số lần invoke và thời gian thực hiện yêu cầu
- Free 1M request đầu và 400K GBs thời gian tính toán trong
FREE TIER
- Thương thích với các services khác một cách dễ dàng
- Với mỗi 1GB RAM thì sẽ tăng thêm 1 CPU ảo ⇒ tăng khả năng xử lý
Synchronous Invocations
- Các request được tạo bởi CLI, SDK, API Gateway, ALB
- Kết quả sẽ được trả về ngay lập tức sau khi được tính toán xong
- Phía client sẽ cần phải handle các lỗi
Asynchronous Invocations
- Các request được tạo bởi S3, SNS, Cloudwatch Event, Event Bridge…..
- Các request được đưa vào trong
event queue
- Có thể áp dụng cơ chế
retry on error
⇒ có thể dẫn tới việc một request được xử lý 2 lần
- Có thể tích hợp thêm DLQ (cần config IAM role cho hợp lý)
- Tăng tốc quá trình xử lý ⇒ xử lý đồng thời nhiều request
mà KHÔNG cần chờ result
Event và Context
Event | Context |
---|
Chứa các thông tin về service đã invoke lambda | Chứa các thông tin về invocation của lambda, runtime env, các thông số cái đặt của lambda |
Chứa các thông tin về input, arguments, …. | |
Destination
- Kết quả của một lambda có thể được chuyển tới một thực thể nào đó khác
- Chỉ hoạt động với Async Invocation hoặc Stream Invoc
- Có thể là:
- SQS
- SNS
- Một lambda khác
- Event bridge
- DLQ cho các request lỗi
Execution Role
- Cấp quyền để lambda có thể access đến các service khác trong AWS như là (S3, Cloudwatch, SQS, SNS)
- Có thể sử dụng các policy trong các service để thay thế – tuỳ trường hợp
Resource Based Policies
- Tương tự như các service khác, dùng để cho phép service nào làm gì trên một lambda
Environment Variables
- Dynamic cho các môi trường một cách đơn giản hơn
CloudFront Function và Lambda Edge
Một số usecase hay gặp
CloudFront Function | Lambda Edge |
---|
Dùng một số giá trị trong headers, cookies để làm cache key | Time dài hơn, có cả CPU và RAM |
Thay đổi một số thông tin trong headers | Dùng được thư viện bên thứ 3 |
Redirect/Rewrite URLs | Thay đổi headers, body, cookies, ….. |
Tạo JWT để validate request | |
Lambda /tmp space
- Một vùng lưu trữ tạm thời
- Có thể được chia sẻ cho các lần invocation khác
- Dùng để làm một vùng checkpoint tạm thời (trong case đệ quy chẳng hạn)
Layers
File Systems Mounting
So sánh các dạng storage
Concurrency và Throttling
- Có tối đa 1000 concurrencies với mỗi account
- Các lambda chia chung concurrencies pool
- Có thể set số lượng concurrencies (X) cho mỗi lamda ⇒ lúc đó thì số lượng concurrencies trong pool sẽ giảm còn (1000-X)
- Có thể setup cơ chế retry, exponential backoff khi sử dụng Async Invoke
- 2 khái niệm quan trọng cần phân biệt:
Provisioned Concurrency | Reserved Concurrency |
---|
Số lượng lambda instance sẽ được tạo sẵn – dùng để tránh cold start | Số lượng tối đa instances của một lambda có thể chạy song song với nhau |
Tốn kha khá tiền để duy trì | Khi set cái này thì số lượng concurrencies trong pool sẽ bị giảm |
Cold start
- Khi một lambda instance mới được khởi tạo, sẽ mất thời gian để load code, load các dependencies, SDK, ……
- Sau khi một lambda được invoke, lambda sẽ bị ‘cold’ sau khoảng 45’ nếu ko được invoke lại
- Các giải pháp có thể được sử dụng:
- Pinging lambda: qua event bridge
- Sử dụng Provisoned Concurrency: luôn có một số lượng lambda instance được tạo sẵn, nên có một số các requests đầu sẽ không rơi vào Cold start
Lambda dependencies
- Có thể zip file cùng với code lambda để push thẳng lên lambda (NẾU dung lượng file nhỏ hơn 50 MB)
- Nếu dung lượng file code quá lớn sẽ cần push lên S3 ⇒ thường sẽ dùng CloudFormation để update lambda
- SDK mặc định là sẽ có trong mỗi lambda function
Alias và Version
Một số giới hạn
- RAM: từ 128GB tới 10GB (càng nhiều RAM thì có càng nhiều vCPU)
- Có thể có tối đa 6 vCPU
- Timeout: tối đa 900 secs – 15 phút
- Env variables: max 4 kbs
- /tmp space: 512 MBs to 10GBs
- Concurrencies: 1000 (có thể tăng thêm, cần liên hệ AWS supports)
📚 Tài liệu tham khảo AWS Lambda