Lambda, ECS và Elastic Beanstalk: chọn đúng mô hình compute
Chào bạn, bài đầu tiên của module này là bài "định hình tư duy". Trong đề DVA-C02, các câu hỏi compute hiếm khi hỏi "Lambda là gì", chúng hỏi: "Với tình huống này, chọn dịch vụ nào và tại sao?". Bài này luyện cho bạn đúng phản xạ đó.
Mục tiêu học tập
- Phân biệt được ba mô hình compute: Lambda (serverless function), ECS (container orchestration) và Elastic Beanstalk (PaaS).
- Nhận diện từ khoá trong đề bài để chọn đúng dịch vụ chỉ trong vài giây đọc.
- Giải thích được lý do chọn, không chỉ nêu tên dịch vụ, vì đáp án đúng thường kèm lý do.
- Tránh bốn bẫy kinh điển: Lambda quá 15 phút, Lambda trong VPC mất internet, nhầm task role với task execution role, và xoá Beanstalk kéo theo mất database.
Ôn tập nhanh
Trước khi vào bài, bạn chỉ cần nhớ hai điều cơ bản: AWS Region chứa nhiều Availability Zone, và IAM role là cách cấp quyền cho một dịch vụ AWS mà không cần lưu access key. Mọi thứ còn lại của IAM sẽ học ở bài 1.3, ở đây ta chỉ dùng role như một khái niệm.
Lý thuyết
Lambda: chạy code, không nghĩ tới server
Lambda chạy một function theo sự kiện. Bạn trả tiền theo số request và thời gian chạy (GB-giây), không trả khi rảnh. Ba con số phải thuộc lòng:
| Thông số | Giá trị |
|---|---|
| Timeout tối đa | 15 phút (900 giây) |
| Memory | 128 MB đến 10.240 MB |
| /tmp | Cấu hình được, tối đa 10 GB |
Có ba cách Lambda được gọi:
1. Synchronous (đồng bộ): API Gateway, Application Load Balancer gọi và chờ kết quả.
2. Asynchronous (bất đồng bộ): S3, SNS, EventBridge đẩy event, Lambda tự retry 2 lần rồi mới bỏ.
3. Event source mapping: Lambda tự poll SQS, Kinesis, DynamoDB Streams theo batch, có DLQ để giữ message lỗi.
Hai khái niệm hay bị hỏi: cold start (độ trễ khi khởi tạo môi trường thực thi) giảm bằng provisioned concurrency; và reserved concurrency dùng để giới hạn số invocation đồng thời của một function, tránh nó "ăn" hết quota của region.
ECS: container orchestration
ECS gồm ba thành phần: cluster, task definition (giống bản thiết kế container) và service (giữ số task luôn chạy và gắn với load balancer). Image thường lưu trong ECR.
Có hai launch type:
- EC2: bạn tự quản lý instance, kiểm soát được loại máy, GPU, dùng Spot để tiết kiệm.
- Fargate: bạn không quản lý instance, trả tiền theo vCPU và GB bộ nhớ mỗi giây.
Điểm ăn điểm lớn nhất của ECS trong đề thi là phân biệt hai IAM role: ==task execution role và task role là hai thứ khác nhau==. Task execution role cho ECS agent dùng để pull image từ ECR và ghi log lên CloudWatch. Task role là quyền mà code ứng dụng bên trong container dùng để gọi S3, DynamoDB hay service khác.
Elastic Beanstalk: PaaS cho ứng dụng truyền thống
Beanstalk nhận code (zip, war, hoặc Dockerfile), chọn platform (Java, Node.js, Python, .NET, PHP, Ruby, Go, Docker), rồi tự dựng EC2, Auto Scaling Group và Elastic Load Balancer. Bạn vẫn thấy và kiểm soát được tài nguyên bên dưới, nhưng không phải cấu hình từng bước.
Hai điều cần nhớ: Beanstalk không thu phí nền tảng, bạn chỉ trả cho tài nguyên nó tạo ra; và khi tạo RDS bên trong environment, xoá environment sẽ xoá luôn database, nên với production hãy dùng RDS bên ngoài.
Bảng chọn nhanh
| Tín hiệu trong đề | Chọn |
|---|---|
| Event-driven, chạy ngắn, không muốn quản lý gì | Lambda |
| Container, không muốn quản lý EC2 | ECS + Fargate |
| Container, cần GPU, Spot, kiểm soát instance | ECS + EC2 |
| Ứng dụng monolith có sẵn, deploy nhanh, ít sửa code | Elastic Beanstalk |
| Xử lý job nền từ SQS | Beanstalk worker environment hoặc Lambda |
flowchart TD
Start["Câu hỏi compute"] --> Q1{"Chạy dưới 15 phút<br/>và event-driven?"}
Q1 -->|Có| Lambda["⚡<br/>Lambda"]
Q1 -->|Không| Q2{"Đóng gói bằng container?"}
Q2 -->|Có| Q3{"Cần quản lý EC2,<br/>GPU hoặc Spot?"}
Q3 -->|Không| Fargate["📦<br/>ECS Fargate"]
Q3 -->|Có| ECSEC2["🖥️<br/>ECS EC2"]
Q2 -->|Không| EB["🌱<br/>Elastic Beanstalk"]
Ví dụ có lời giải
Ví dụ 1. Ứng dụng cho phép user upload ảnh lên S3, cần tạo thumbnail trong vài giây, lưu lượng thất thường, team muốn chi phí gần bằng 0 khi không có ai upload.
- Bước 1: "upload lên S3" là tín hiệu event-driven.
- Bước 2: "vài giây" nằm xa giới hạn 15 phút.
- Bước 3: "chi phí gần 0 khi rảnh" loại bỏ mọi phương án chạy server 24/7.
- Kết luận: S3 event notification kích hoạt Lambda tạo thumbnail.
Ví dụ 2. Một ứng dụng .NET monolith đang chạy trên EC2, team không muốn viết lại code, cần load balancing và auto scaling, muốn deploy bằng cách upload gói zip.
- "Không muốn viết lại code" loại bỏ Lambda và container hoá.
- "Load balancing, auto scaling, upload zip" đúng mô tả PaaS.
- Kết luận: Elastic Beanstalk, environment load balanced, deployment policy Immutable.
Ví dụ 3. Hệ microservices đóng gói Docker, mỗi service gọi DynamoDB, team không muốn quản lý EC2, cần scale theo lưu lượng.
- Bước 1: có Docker, nên phải là ECS, không phải Beanstalk.
- Bước 2: không muốn quản lý EC2, chọn Fargate.
- Bước 3: service gọi DynamoDB, cấp quyền qua task role, không phải task execution role.
- Kết luận: ECS Fargate, task definition có task role chứa quyền DynamoDB.
Thảo luận và suy ngẫm
- Với ứng dụng chạy 24/7, tải đều và lớn, Lambda hay ECS EC2 rẻ hơn? Bạn cần thêm dữ kiện gì để trả lời chắc chắn?
- Nếu đề nói "giảm cold start" mà không cho phép tăng chi phí, bạn xử lý thế nào?
- Vì sao Elastic Beanstalk vẫn còn chỗ đứng khi đã có container?
Góc chuyên gia
Bốn bẫy mình gặp nhiều nhất khi luyện đề:
- Thời gian chạy vượt 15 phút. Bất cứ phương án nào nhắc Lambda đều sai ngay. Đáp án thường là ECS Fargate hoặc Beanstalk worker.
- Lambda trong VPC không gọi được API bên ngoài. Nguyên nhân là private subnet thiếu route ra NAT Gateway, không phải do thiếu IAM.
- Nhầm hai role của ECS. Lỗi "CannotPullContainerError" là task execution role; lỗi "AccessDenied" khi code gọi DynamoDB là task role.
- Beanstalk và RDS. Đề hỏi "dữ liệu phải còn khi xoá environment" thì đáp án là tạo RDS bên ngoài.
Quy tắc ngón tay: đọc đề, gạch chân các cụm về thời lượng, cách đóng gói, ai quản lý hạ tầng và loại dữ liệu vào. Bốn thông tin đó quyết định gần như toàn bộ đáp án compute.
Ôn tập cuối bài
Điền khuyết nhanh: Lambda có timeout tối đa {{c1::15 phút (900 giây)}}. Trong ECS, role dùng để pull image từ ECR và ghi log là {{c2::task execution role}}. Elastic Beanstalk không thu phí nền tảng, bạn chỉ trả cho {{c3::các tài nguyên AWS bên dưới}}. Lambda nằm trong private subnet cần {{c4::NAT Gateway}} để gọi được internet. Deployment policy an toàn nhất của Beanstalk là {{c5::Immutable}}.
[
{ "front": "Timeout tối đa của một Lambda function là bao nhiêu?", "back": "15 phút (900 giây)." },
{ "front": "Lambda tính phí theo đơn vị nào?", "back": "Số request và thời gian chạy tính bằng GB-giây." },
{ "front": "Task execution role trong ECS dùng để làm gì?", "back": "Cho ECS agent pull image từ ECR và ghi log lên CloudWatch." },
{ "front": "Task role trong ECS dùng để làm gì?", "back": "Cấp quyền cho code ứng dụng bên trong container gọi các dịch vụ AWS." },
{ "front": "Hai launch type của ECS là gì?", "back": "EC2 (tự quản lý instance) và Fargate (serverless container)." },
{ "front": "Elastic Beanstalk thu phí nền tảng như thế nào?", "back": "Miễn phí, chỉ trả cho tài nguyên bên dưới như EC2, ELB, RDS." },
{ "front": "Deployment policy nào của Beanstalk tạo môi trường tạm rồi chuyển traffic, an toàn nhất?", "back": "Immutable." },
{ "front": "Lambda trong VPC cần gì để gọi được internet?", "back": "NAT Gateway trong public subnet cùng route table phù hợp." },
{ "front": "Cơ chế nào giảm cold start cho Lambda?", "back": "Provisioned concurrency, giữ sẵn môi trường thực thi." },
{ "front": "Event source mapping áp dụng cho những nguồn nào?", "back": "SQS, Kinesis và DynamoDB Streams; Lambda tự poll theo batch." },
{ "front": "Khi nào chọn ECS EC2 thay vì Fargate?", "back": "Khi cần GPU, dùng Spot, hoặc kiểm soát và tối ưu chi phí instance ở tải cao." },
{ "front": "Ba thành phần cơ bản của ECS là gì?", "back": "Cluster, task definition và service (hoặc task)." },
{ "front": "Beanstalk worker environment dùng để làm gì?", "back": "Xử lý job bất đồng bộ từ SQS queue, không phục vụ HTTP trực tiếp." },
{ "front": "Dung lượng /tmp tối đa của Lambda là bao nhiêu?", "back": "Cấu hình được, tối đa 10 GB." }
]
Tóm tắt và bước tiếp theo
Ba câu chốt: Lambda khi sự kiện ngắn và bạn không muốn quản lý gì; ECS khi đã có container và cần kiểm soát cách chạy; Elastic Beanstalk khi có ứng dụng truyền thống cần deploy nhanh mà ít sửa code. Trong cả ba, câu hỏi phụ luôn xoay quanh quyền, mạng và chi phí.
Bài tiếp theo chuyển sang phần dữ liệu: S3 và DynamoDB, mô hình dữ liệu và pattern truy cập. Bạn sẽ thấy các quyết định compute ở bài này liên quan trực tiếp thế nào tới cách chọn kho dữ liệu phía sau.