Bỏ qua để đến nội dung

Các dịch vụ Compute khác

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:

  • Docker Hub (hub.docker.com) — kho công khai (public), chứa rất nhiều image nền (base image) sẵn có cho nhiều công nghệ/hệ điều hành khác nhau, ví dụ Ubuntu, MySQL, NodeJS, Java. Đây là nơi hầu hết các image “gốc” mà bạn dùng làm điểm bắt đầu (ví dụ: FROM node:18) được lưu.
  • Amazon ECR (Elastic Container Registry) — kho riêng tư (private) trên AWS. Đây là nơi bạn lưu các Docker image của riêng công ty/dự án mình, để sau đó các dịch vụ AWS như ECS hoặc Fargate có thể lấy image từ đây và chạy chúng.

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:

  • Mô hình Virtual Machine: Hạ tầng vật lý → Host OS → Hypervisor (phần mềm ảo hóa) → nhiều Guest OS (từng máy ảo), mỗi Guest OS chạy ứng dụng riêng của nó. Mỗi VM phải “cõng” theo cả một hệ điều hành đầy đủ, khá nặng và khởi động chậm (vài phút).
  • Mô hình Docker: Hạ tầng vật lý → Host OS (ví dụ chạy trên một EC2 Instance) → Docker Daemon → nhiều Container chạy trực tiếp, không cần Guest OS riêng cho mỗi container. Vì vậy container nhẹ hơn nhiều, khởi động chỉ trong vài giây, và bạn có thể nhồi được nhiều container hơn trên cùng một server so với số lượng VM.

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:

  • Giá dễ hiểu (Easy Pricing): trả tiền theo số lượng request và thời gian tính toán (compute time); có free tier gồm 1.000.000 request và 400.000 GB-giây (GB-seconds) thời gian tính toán mỗi tháng.
  • Tích hợp với toàn bộ hệ sinh thái AWS — Lambda có thể được gọi từ hầu như mọi dịch vụ AWS khác.
  • Event-Driven (theo sự kiện): hàm chỉ được gọi (invoke) khi AWS phát hiện có sự kiện cần xử lý.
  • Hỗ trợ nhiều ngôn ngữ lập trình.
  • Giám sát dễ dàng thông qua CloudWatch.
  • Dễ dàng có thêm tài nguyên cho hàm — có thể cấp tới 10GB RAM cho một hàm Lambda. Tăng RAM cũng đồng thời tăng năng lực CPU và network được cấp cho hàm.

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:

  • Trả theo số lượng request (Pay per calls): 1.000.000 request đầu tiên miễn phí mỗi tháng; sau đó $0.20 cho mỗi 1 triệu request.
  • Trả theo thời lượng chạy (Pay per duration): tính theo bước 1ms. Có 400.000 GB-giây (GB-seconds) thời gian tính toán miễn phí mỗi tháng — con số này tương đương 400.000 giây nếu hàm cấp 1GB RAM, hoặc tương đương 3.200.000 giây nếu hàm chỉ cấp 128MB RAM. Sau khi vượt hạn mức free tier, giá là $1.00 cho mỗi 600.000 GB-giây.

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 APIWebSocket 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:

  • Ứng dụng web đơn giản (Simple web applications) — có sẵn template cho LAMP, Nginx, MEAN, Node.js.
  • Website — có sẵn template cho WordPress, Magento, Plesk, Joomla.
  • Môi trường Dev/Test.

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.

  • Docker: công nghệ container để đóng gói và chạy ứng dụng nhất quán trên mọi môi trường.
  • ECS: chạy Docker container trên các EC2 instance do bạn quản lý.
  • Fargate: chạy Docker container mà không cần cấp phát hạ tầng, hoàn toàn serverless, không có EC2 nào để quản lý.
  • ECR: kho lưu trữ Docker image riêng tư (private) trên AWS.
  • EKS: chạy Kubernetes (mã nguồn mở, cloud-agnostic) được quản lý trên AWS, trên EC2 hoặc Fargate.
  • Serverless: mô hình bạn chỉ triển khai code/hàm, không quản lý server (S3, DynamoDB, Fargate, Lambda là các ví dụ).
  • Lambda: Function as a Service, tự động scale, trả tiền theo số lần gọi và thời gian x RAM sử dụng, thời gian thực thi tối đa 15 phút mỗi lần, hỗ trợ nhiều ngôn ngữ (trừ Docker tùy ý).
  • API Gateway: công bố Lambda (hoặc backend khác) dưới dạng HTTP API/WebSocket API, có bảo mật, throttling, giám sát.
  • AWS Batch: chạy các job xử lý theo lô trên các EC2 instance được AWS quản lý tự động, không giới hạn thời gian chạy, đóng gói bằng Docker image.
  • Lightsail: giải pháp đơn giản, giá thấp và dễ dự đoán, thay thế gộp cho EC2/RDS/ELB/EBS/Route 53, phù hợp người mới với cloud.