Tìm hiểu về container hóa (Docker, ECS, Fargate, ECR, EKS) và các mô hình compute serverless (Lambda, API Gateway, AWS Batch, Lightsail) trên AWS.
Docker là một nền tảng phát triển phần mềm (software development platform) dùng để triển khai ứng dụng. Ý tưởng cốt lõi: ứng dụng được đóng gói vào các container — một "hộp" chứa toàn bộ code, thư viện, cấu hình mà ứng dụng cần để chạy — và container này có thể chạy được trên bất kỳ hệ điều hành nào có Docker, mà không cần lo về việc máy đích có cài đúng phiên bản Python/Node/Java hay không.
Lợi ích lớn nhất của Docker: ứng dụng chạy giống nhau bất kể chạy ở đâu — trên máy laptop của bạn, trên server công ty, hay trên AWS — không có vấn đề tương thích (compatibility issues), hành vi có thể dự đoán được (predictable behavior), giảm công sức bảo trì/triển khai. Docker hoạt động với hầu như bất kỳ ngôn ngữ, hệ điều hành, hay công nghệ nào. Một điểm mạnh khác: bạn có thể scale số lượng container lên/xuống rất nhanh — chỉ trong vài giây — vì container nhẹ hơn nhiều so với máy ảo truyền thống.
Docker image (bản đóng gói ứng dụng) được lưu trữ trong các "Docker Repository" (kho lưu image). Có hai loại kho chính:
FROM node:18) được lưu.Docker là công nghệ có tính chất "ảo hóa" (virtualization) nhưng không hoàn toàn giống với máy ảo (Virtual Machine) truyền thống. Điểm khác biệt căn bản: các container Docker chia sẻ tài nguyên với hệ điều hành máy chủ (host), cho phép chạy nhiều container trên cùng một server mà không cần mỗi container có một hệ điều hành riêng.
So sánh hai mô hình:
ECS (Elastic Container Service) là dịch vụ giúp bạn khởi chạy các container Docker trên AWS. Với ECS, bạn phải tự cấp phát và duy trì hạ tầng — cụ thể là các EC2 instance sẽ đóng vai trò "máy chủ" chạy container. AWS sẽ lo việc khởi động/dừng container trên các instance đó theo cấu hình bạn khai báo, nhưng bạn vẫn chịu trách nhiệm quản lý các EC2 instance bên dưới (số lượng, loại instance, patch OS...). ECS có tích hợp tốt với Application Load Balancer để phân phối traffic tới các container.
Fargate cũng là dịch vụ để khởi chạy container Docker trên AWS, nhưng khác biệt cốt lõi so với ECS truyền thống: bạn không cần cấp phát hạ tầng — không có EC2 instance nào để bạn phải quản lý. Đây là một offering serverless hoàn toàn — bạn chỉ cần khai báo lượng CPU/RAM mà container cần, và AWS tự động chạy container đó cho bạn ở phía sau. Điều này giúp việc vận hành đơn giản hơn rất nhiều so với việc tự quản lý một fleet EC2 để chạy ECS.
EKS (Elastic Kubernetes Service) cho phép bạn khởi chạy các cluster Kubernetes được quản lý trên AWS. Kubernetes là một hệ thống mã nguồn mở dùng để quản lý, triển khai, và scale các ứng dụng đóng gói dạng container (Docker) — về bản chất, Kubernetes giải quyết bài toán tương tự ECS (điều phối container), nhưng là một tiêu chuẩn mở, được dùng rộng rãi trên nhiều nền tảng cloud khác nhau.
Với EKS, các container có thể được host trên EC2 instance hoặc trên Fargate (chế độ serverless). Điểm đặc biệt của Kubernetes: nó là công nghệ cloud-agnostic — nghĩa là bạn có thể dùng Kubernetes trên bất kỳ nền tảng cloud nào (AWS, Azure, GCP) mà không bị "khóa" (lock-in) vào một nhà cung cấp cụ thể. Đây là điểm khác biệt so với ECS — ECS là công nghệ riêng của AWS, chỉ chạy trên AWS.
Ba dịch vụ này thường gây nhầm lẫn cho người mới vì đều liên quan tới việc chạy container Docker. Bảng dưới đây tóm tắt sự khác biệt:
| Dịch vụ | Công nghệ điều phối | Có phải quản lý EC2? | Đặc điểm |
|---|---|---|---|
| ECS | AWS tự phát triển (proprietary) | Có (chạy trên EC2 do bạn quản lý) | Chỉ chạy trên AWS, tích hợp chặt với ALB |
| Fargate | Là "launch type" của ECS (hoặc EKS) | Không — serverless hoàn toàn | Chỉ cần khai báo CPU/RAM, AWS tự vận hành hạ tầng |
| EKS | Kubernetes (mã nguồn mở, chuẩn công nghiệp) | Có thể chạy trên EC2 hoặc trên Fargate | Cloud-agnostic — dùng được trên AWS, Azure, GCP |
Nói ngắn gọn: bạn chọn ECS khi muốn dùng công nghệ điều phối riêng của AWS và không phiền quản lý EC2; chọn Fargate (kết hợp với ECS hoặc EKS) khi muốn bỏ hẳn việc quản lý server; chọn EKS khi tổ chức đã đầu tư vào Kubernetes hoặc cần khả năng di chuyển linh hoạt giữa các cloud.
Serverless là một mô hình mới, trong đó developer không còn phải quản lý server nữa — bạn chỉ cần triển khai code, triển khai các hàm (function)! Ban đầu, "Serverless" chủ yếu đồng nghĩa với FaaS (Function as a Service), được AWS Lambda mở đường (pioneer). Ngày nay, khái niệm "serverless" đã mở rộng ra để chỉ bất cứ dịch vụ nào được quản lý hoàn toàn (managed) — bao gồm cả database, messaging, storage.
Cần lưu ý: "serverless" không có nghĩa là không có server nào cả — nó có nghĩa là bạn không cần quản lý, cấp phát, hay nhìn thấy các server đó; AWS lo toàn bộ phần đó phía sau. Trong khóa học này, các dịch vụ bạn đã học như Amazon S3, DynamoDB, Fargate, Lambda đều là các ví dụ điển hình của mô hình serverless/managed.
Để hiểu vì sao Lambda ra đời, hãy so sánh với EC2: EC2 là các server ảo trên cloud, bị giới hạn bởi RAM/CPU đã chọn, chạy liên tục (continuously running) dù có request hay không, và muốn scale thì cần có sự can thiệp để thêm/xóa server (dù Auto Scaling Group có tự động hóa phần này, vẫn cần cấu hình trước).
AWS Lambda hoạt động theo cách hoàn toàn khác: nó là các "hàm ảo" (virtual functions) — không có server nào để bạn quản lý. Lambda bị giới hạn bởi thời gian (dành cho các tác vụ thực thi ngắn), chỉ chạy khi có nhu cầu (on-demand — không tốn tiền khi không ai gọi tới), và khả năng scale được tự động hoàn toàn — Lambda tự nhân bản để xử lý hàng nghìn request đồng thời mà bạn không cần làm gì.
Các lợi ích chính của AWS Lambda:
Về ngôn ngữ hỗ trợ, Lambda có hỗ trợ chính thức (native) cho: Node.js, Python, Java, C# (.NET Core)/PowerShell, Ruby. Ngoài ra còn có Custom Runtime API để cộng đồng hỗ trợ thêm các ngôn ngữ khác (ví dụ Rust, Golang). Lambda cũng hỗ trợ triển khai dưới dạng Lambda Container Image (đóng gói hàm bằng Docker image) — nhưng image đó phải cài đặt đúng Lambda Runtime API; nếu bạn muốn chạy một Docker image tùy ý (arbitrary) không theo chuẩn Lambda, thì ECS/Fargate sẽ là lựa chọn phù hợp hơn.
Một ảnh mới được tải lên (push) vào S3 → sự kiện này kích hoạt (trigger) một hàm AWS Lambda → hàm tạo ra một Thumbnail (ảnh thu nhỏ) → hàm đẩy thumbnail mới này lên lại S3, kèm theo các metadata (tên ảnh, kích thước, thời gian tạo...) được lưu vào DynamoDB.
CloudWatch Events / Amazon EventBridge kích hoạt một hàm AWS Lambda mỗi 1 giờ để thực hiện một tác vụ định kỳ nào đó — ví dụ dọn dẹp dữ liệu tạm, gửi báo cáo tổng hợp, đồng bộ dữ liệu.
Lambda tính phí theo hai thành phần:
Vì cách tính phí này, chi phí chạy Lambda thường rất rẻ đối với các workload không liên tục — đây là lý do Lambda trở nên rất phổ biến cho các tác vụ xử lý theo sự kiện, xử lý ngắn hạn.
Amazon API Gateway là dịch vụ được quản lý hoàn toàn, giúp developer dễ dàng tạo, công bố (publish), duy trì, giám sát và bảo mật các API. API Gateway là dịch vụ serverless và có khả năng scale tự động, hỗ trợ cả RESTful API và WebSocket API. Dịch vụ này có sẵn các tính năng bảo mật, xác thực người dùng (user authentication), giới hạn tốc độ gọi API (API throttling), quản lý API key, và giám sát.
Một use-case rất phổ biến là xây dựng một serverless API hoàn chỉnh: Client (ví dụ ứng dụng mobile hoặc web) gửi request tới API Gateway (đóng vai trò như một "cổng proxy" nhận và định tuyến request REST) → API Gateway chuyển tiếp request tới Lambda để xử lý logic nghiệp vụ → Lambda đọc/viết dữ liệu vào DynamoDB (thực hiện các thao tác CRUD: Create, Read, Update, Delete).
AWS Batch là dịch vụ xử lý theo lô (batch processing) được quản lý hoàn toàn, có thể chạy ở bất kỳ quy mô nào — từ vài job tới hàng trăm nghìn job tính toán theo lô một cách hiệu quả. Một "batch job" là một tác vụ có điểm bắt đầu và điểm kết thúc rõ ràng (khác với các dịch vụ chạy liên tục không ngừng).
AWS Batch tự động khởi chạy (dynamically) các EC2 instance hoặc Spot Instance để xử lý job, tự tính toán và cấp đúng lượng compute/memory cần thiết. Bạn chỉ cần submit/lên lịch (schedule) các batch job, còn AWS Batch lo toàn bộ phần còn lại. Về bản chất kỹ thuật, các batch job được định nghĩa dưới dạng Docker image và được chạy trên nền ECS phía dưới. AWS Batch giúp tối ưu chi phí và giảm bớt việc phải quan tâm tới hạ tầng.
Luồng xử lý điển hình: một sự kiện Trigger khởi động → AWS Batch tự động cấp phát EC2/Spot Instance (qua ECS) → job xử lý dữ liệu đọc từ S3 → kết quả sau xử lý được ghi (insert) trở lại S3.
| Tiêu chí | AWS Lambda | AWS Batch |
|---|---|---|
| Giới hạn thời gian chạy | Có (tối đa 15 phút mỗi lần chạy) | Không giới hạn thời gian chạy |
| Runtime | Giới hạn theo các runtime AWS hỗ trợ | Bất kỳ runtime nào, chỉ cần đóng gói thành Docker image |
| Dung lượng đĩa tạm | Giới hạn (temporary disk space nhỏ) | Dựa vào EBS/Instance Store, có thể lớn tùy ý |
| Hạ tầng phía dưới | Serverless hoàn toàn | Dựa trên EC2 (có thể được AWS quản lý tự động) |
Amazon Lightsail cung cấp máy chủ ảo (virtual servers), lưu trữ (storage), database, và networking với mức giá thấp và dễ dự đoán (low & predictable pricing) — tức là bạn trả một mức phí cố định hàng tháng, không cần lo về việc bị "hoá đơn bất ngờ tăng vọt" như khi dùng các dịch vụ tính phí theo mức sử dụng chi tiết.
Lightsail được xem như một phiên bản đơn giản hóa để thay thế cho việc phải kết hợp riêng lẻ EC2, RDS, ELB, EBS, Route 53 — rất phù hợp cho những người ít có kinh nghiệm với cloud nhưng vẫn muốn triển khai nhanh một ứng dụng. Lightsail hỗ trợ thiết lập thông báo (notifications) và giám sát (monitoring) cho các resource của bạn.
Các use-case điển hình:
Lightsail có tính sẵn sàng cao (high availability) nhưng không có auto-scaling, và mức độ tích hợp với các dịch vụ AWS khác cũng hạn chế hơn so với việc dùng EC2/RDS/ELB trực tiếp.