Amazon EC2 là gì?
Amazon Elastic Compute Cloud (EC2) là dịch vụ điện toán đám mây của AWS, cung cấp máy chủ ảo (virtual machine) theo mô hình Infrastructure-as-a-Service (IaaS). Ra mắt năm 2006, EC2 là một trong những dịch vụ cốt lõi và phổ biến nhất của AWS.
EC2 cho phép bạn thuê năng lực tính toán theo nhu cầu – từ một instance nhỏ để chạy web cá nhân đến hàng nghìn instance để xử lý dữ liệu khổng lồ – chỉ trả tiền cho những gì thực sự sử dụng.
Đặc điểm cốt lõi
So sánh EC2 với máy chủ vật lý truyền thống
| Tiêu chí | Máy chủ vật lý | Amazon EC2 |
|---|---|---|
| Thời gian triển khai | Tuần – tháng | Vài phút |
| Chi phí ban đầu | CapEx cao (mua phần cứng) | OpEx, không CapEx |
| Co giãn | Giới hạn bởi phần cứng | Không giới hạn |
| Độ sẵn sàng | Cần tự xây dự phòng | SLA 99.99% với Multi-AZ |
| Quản lý phần cứng | Tự chịu trách nhiệm | AWS quản lý |
| Thanh toán | Trả trước toàn bộ | Theo giờ/giây thực dùng |
Kiến trúc EC2
EC2 được tổ chức theo một kiến trúc phân cấp rõ ràng, từ Region (vùng địa lý) cho đến từng instance cụ thể.
Các khái niệm cơ bản
| Khái niệm | Mô tả |
|---|---|
| Region | Vùng địa lý độc lập (vd: ap-southeast-1 là Singapore). Dữ liệu không tự động chuyển giữa Region. |
| Availability Zone (AZ) | Data center độc lập trong một Region. Mỗi Region có 2–6 AZ. Dùng Multi-AZ để tăng tính sẵn sàng. |
| VPC | Mạng ảo riêng tư, cô lập về mặt logic trong AWS Cloud. |
| Subnet | Phân đoạn mạng trong VPC. Public subnet có route ra Internet, Private subnet thì không. |
| Instance | Máy chủ ảo cụ thể đang chạy trong AWS. |
| AMI | Amazon Machine Image – template để tạo instance (chứa OS + cấu hình ban đầu). |
| EBS | Elastic Block Store – ổ đĩa ảo gắn vào instance. |
Instance Types
EC2 cung cấp hơn 600 loại instance, được nhóm theo gia đình (family) dựa trên use case tối ưu. Tên instance tuân theo cú pháp: [family][generation][attributes].[size]
m7g.xlarge: m = General Purpose, 7 = thế hệ 7, g = chip Graviton (ARM), xlarge = kích thước 4 vCPU / 16 GB RAM.
Các gia đình instance
| Gia đình | Ký hiệu | Tối ưu cho | Ví dụ |
|---|---|---|---|
| General Purpose | M, T | Web server, ứng dụng vừa, dev/test, database nhỏ | t3.medium, m7g.xlarge |
| Compute Optimized | C | HPC, game server, batch processing, ML inference | c7g.2xlarge, c6i.4xlarge |
| Memory Optimized | R, X, z | In-memory DB, SAP HANA, real-time analytics, Redis | r7g.4xlarge, x2iezn.2xlarge |
| Storage Optimized | I, D, H | NoSQL DB, data warehouse, Hadoop, log processing | i4i.4xlarge, d3en.8xlarge |
| Accelerated Computing | P, G, Inf, Trn | ML training, deep learning, video rendering, GPU | p4d.24xlarge, g5.xlarge |
| High Performance Net. | Hpc | Tính toán khoa học, mô phỏng phân tán | hpc7g.16xlarge |
Kích thước (Size) instance
| Size | vCPU | RAM (GB) | Ghi chú |
|---|---|---|---|
| nano | 2 | 0.5 | Dùng cho dev/test siêu nhỏ, eligible Free Tier |
| micro | 2 | 1 | Free Tier: 750 giờ/tháng với t2/t3.micro |
| small | 2 | 2 | Web nhỏ, staging environment |
| medium | 2 | 4 | Ứng dụng trung bình |
| large | 2 | 8 | Workload sản xuất thông thường |
| xlarge | 4 | 16 | Database, ứng dụng tải cao |
| 2xlarge | 8 | 32 | Cache layer, processing nặng |
| 4xlarge | 16 | 64 | Analytics, data warehouse |
| …metal | 192+ | 1536+ | Bare metal, không có hypervisor overhead |
T-series: Burstable Performance
Instance T3, T4g dùng cơ chế CPU Credits – rất phù hợp cho workload không đều (burst). Khi CPU thấp, instance tích lũy credits; khi cần tải cao, dùng credits đó để burst lên 100% CPU.
AMI – Amazon Machine Image
AMI là template để tạo EC2 instance, bao gồm: thông tin OS, cấu hình phần mềm, dữ liệu khởi tạo và quyền truy cập (launch permissions). AMI là snapshot bất biến – bạn có thể tạo hàng trăm instance giống hệt nhau từ một AMI.
Thành phần của AMI
- Root volume template: OS (Linux, Windows, macOS) và các phần mềm cài sẵn
- Block device mapping: Danh sách volume EBS sẽ gắn vào instance khi launch
- Launch permissions: Ai có quyền dùng AMI này (account cụ thể, public, hay private)
- Virtualization type: HVM (Hardware Virtual Machine) – loại hiện đại nhất
Nguồn AMI
Storage cho EC2
EC2 hỗ trợ nhiều loại storage với đặc tính và use case khác nhau. Hiểu rõ từng loại giúp tối ưu chi phí và hiệu năng.
1. EBS – Elastic Block Store
EBS là ổ đĩa ảo persistent – dữ liệu tồn tại ngay cả khi instance bị stop. Một EBS volume chỉ gắn được vào một instance tại một thời điểm (trừ Multi-Attach).
| Loại EBS | IOPS tối đa | Throughput | Use case |
|---|---|---|---|
| gp3 (General Purpose SSD) | 16,000 | 1,000 MB/s | Mặc định cho hầu hết workload |
| gp2 (General Purpose SSD) | 16,000 | 250 MB/s | Legacy, nên migrate sang gp3 |
| io2 Block Express | 256,000 | 4,000 MB/s | SAP HANA, Oracle DB, SQL Server |
| io1 | 64,000 | 1,000 MB/s | I/O-intensive database |
| st1 (Throughput HDD) | 500 | 500 MB/s | Big Data, log processing, Kafka |
| sc1 (Cold HDD) | 250 | 250 MB/s | Archive, infrequent access |
2. Instance Store
Storage ephemeral nằm trên ổ đĩa vật lý của host server. Hiệu năng cực cao (NVMe) nhưng mất dữ liệu khi instance stop/terminate. Phù hợp cho buffer, cache, temporary data.
3. EFS – Elastic File System
Hệ thống file NFS fully managed, có thể mount vào nhiều EC2 instance đồng thời. Tự động co giãn, không cần provision capacity. Phù hợp cho shared storage trong ứng dụng phân tán.
4. S3 (qua mount hoặc SDK)
Object storage có thể mount bằng S3 Mountpoint hoặc truy cập bằng AWS SDK/CLI. Không phải block storage – không phù hợp cho database.
- Boot volume của OS
- Database (MySQL, PostgreSQL)
- File cần persist sau khi restart
- Cần snapshot và backup
- Cache layer (Redis self-hosted)
- Temporary processing data
- Buffer/queue trung gian
- Khi cần IOPS tối đa, cost thấp
Networking
Elastic Network Interface (ENI)
Mỗi instance có ít nhất một ENI (Elastic Network Interface) – card mạng ảo với địa chỉ IP private, địa chỉ MAC, và Security Group. Bạn có thể gắn thêm ENI hoặc chuyển ENI giữa các instance.
Địa chỉ IP
| Loại IP | Đặc điểm | Lưu ý |
|---|---|---|
| Private IP | Cố định trong vòng đời instance, dùng nội bộ VPC | Giữ nguyên sau stop/start |
| Public IP (dynamic) | Cấp khi launch, mất khi stop | Thay đổi sau mỗi lần start |
| Elastic IP (EIP) | IP public tĩnh, giữ nguyên khi stop/start | Phí phát sinh nếu không gắn vào instance đang chạy |
Security Group
Security Group là firewall ảo ở tầng instance, kiểm soát traffic vào/ra theo rules dựa trên port, protocol, và source/destination IP. Security Group là stateful – traffic được phép vào sẽ tự động được phép ra.
# Inbound Rules Port 22 (SSH) ← Your IP only # Không mở 0.0.0.0/0! Port 80 (HTTP) ← 0.0.0.0/0 # Allow all Port 443 (HTTPS) ← 0.0.0.0/0 # Allow all # Outbound Rules All traffic ← 0.0.0.0/0 # Allow all outbound (default)
0.0.0.0/0 trong môi trường production. Chỉ cho phép IP cụ thể hoặc dùng AWS Systems Manager Session Manager thay thế SSH.
Placement Groups
Kiểm soát cách AWS đặt instance trên phần cứng vật lý:
- Cluster: Gom tất cả instance vào cùng rack → latency thấp nhất, phù hợp HPC
- Spread: Mỗi instance trên rack riêng biệt → giảm thiểu correlated failure
- Partition: Nhóm instance theo partition, mỗi partition trên rack khác nhau → Hadoop, Cassandra
Bảo mật EC2
IAM Role cho EC2
Thay vì lưu AWS credentials trực tiếp trên instance, gắn IAM Role vào instance để cấp quyền truy cập AWS services. Credentials được tự động rotate thông qua Instance Metadata Service.
# Bước 1: Lấy token IMDSv2 (bắt buộc – v2 bảo mật hơn v1) TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" \ -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") # Bước 2: Truy vấn metadata curl -H "X-aws-ec2-metadata-token: $TOKEN" \ http://169.254.169.254/latest/meta-data/iam/security-credentials/
Key Pairs
EC2 dùng key pair (RSA hoặc ED25519) để xác thực SSH. AWS lưu public key, bạn giữ private key. Mất private key = không thể SSH vào instance (trừ khi dùng Session Manager).
AWS Systems Manager – Session Manager
Kết nối vào instance không cần SSH port, không cần key pair, không cần Bastion host. Mọi session được log vào CloudTrail và S3. Đây là best practice hiện đại.
EBS Encryption
Bật encryption cho EBS volume bằng AWS KMS. Encryption at-rest và in-transit (giữa instance và volume). Bật mặc định cho toàn account để tránh vô tình tạo volume không mã hóa.
Pricing Models
EC2 cung cấp 5 mô hình thanh toán khác nhau. Chọn đúng mô hình có thể tiết kiệm tới 90% chi phí.
Khi nào dùng mô hình nào?
| Tình huống | Nên dùng |
|---|---|
| Workload production ổn định, chạy 24/7 | Reserved Instances hoặc Savings Plans |
| Dev/test, workload ngắn hạn, không đoán được | On-Demand |
| Batch processing, CI/CD, training ML, stateless app | Spot Instances |
| Kết hợp: nền tảng RI + burst On-Demand/Spot | Mixed strategy |
| License Oracle/SQL Server BYOL, financial compliance | Dedicated Hosts |
Khởi chạy EC2 Instance
Hướng dẫn từng bước tạo EC2 instance đầu tiên qua AWS CLI.
# 1. Tạo Key Pair aws ec2 create-key-pair \ --key-name MyEC2Key \ --query 'KeyMaterial' \ --output text > MyEC2Key.pem chmod 400 MyEC2Key.pem # 2. Tạo Security Group aws ec2 create-security-group \ --group-name my-sg \ --description "My Security Group" \ --vpc-id vpc-xxxxxxxx # Cho phép SSH từ IP cụ thể aws ec2 authorize-security-group-ingress \ --group-id sg-xxxxxxxx \ --protocol tcp --port 22 \ --cidr 1.2.3.4/32 # 3. Launch instance Amazon Linux 2023 aws ec2 run-instances \ --image-id ami-0df7a207adb9748c7 \ # Amazon Linux 2023, ap-southeast-1 --instance-type t3.micro \ --key-name MyEC2Key \ --security-group-ids sg-xxxxxxxx \ --subnet-id subnet-xxxxxxxx \ --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=MyServer}]' \ --user-data file://userdata.sh # 4. Lấy Public IP aws ec2 describe-instances \ --filters "Name=tag:Name,Values=MyServer" \ --query 'Reservations[0].Instances[0].PublicIpAddress' # 5. SSH vào instance ssh -i MyEC2Key.pem ec2-user@<PUBLIC_IP>
Auto Scaling
EC2 Auto Scaling tự động thêm/bớt instance dựa trên metrics hoặc lịch định sẵn, đảm bảo luôn có đủ capacity mà không lãng phí tài nguyên.
Các thành phần
- Launch Template: Định nghĩa cấu hình instance (AMI, type, SG, user data...)
- Auto Scaling Group (ASG): Quản lý tập hợp instance, định nghĩa min/max/desired capacity
- Scaling Policy: Khi nào và bao nhiêu instance cần scale
Các loại Scaling Policy
| Loại | Cách hoạt động | Use case |
|---|---|---|
| Target Tracking | Giữ metric ở mức target (vd: CPU = 60%) | Đơn giản nhất, khuyến nghị cho hầu hết cases |
| Step Scaling | Scale nhiều bước tùy mức vi phạm alarm | Cần scale nhanh và agressive khi tải tăng đột biến |
| Scheduled Scaling | Scale theo lịch cố định (cron) | Traffic có pattern rõ ràng (peak giờ cao điểm) |
| Predictive Scaling | ML dự đoán tải tương lai, scale trước | Workload có pattern tuần hoàn |
# Tạo Launch Template aws ec2 create-launch-template \ --launch-template-name my-lt \ --launch-template-data '{"ImageId":"ami-0df7a207adb9748c7","InstanceType":"t3.medium","SecurityGroupIds":["sg-xxx"]}' # Tạo Auto Scaling Group aws autoscaling create-auto-scaling-group \ --auto-scaling-group-name my-asg \ --launch-template LaunchTemplateName=my-lt \ --min-size 2 \ --max-size 20 \ --desired-capacity 4 \ --vpc-zone-identifier "subnet-aaa,subnet-bbb" \ --target-group-arns arn:aws:elasticloadbalancing:... # Gắn Target Tracking Policy – giữ CPU ở 60% aws autoscaling put-scaling-policy \ --auto-scaling-group-name my-asg \ --policy-name cpu-tracking \ --policy-type TargetTrackingScaling \ --target-tracking-configuration '{"TargetValue":60.0,"PredefinedMetricSpecification":{"PredefinedMetricType":"ASGAverageCPUUtilization"}}'
Monitoring với CloudWatch
EC2 tích hợp sâu với Amazon CloudWatch để theo dõi metrics, thiết lập alarm, và phân tích log.
Metrics mặc định (Basic Monitoring – miễn phí, 5 phút)
- CPUUtilization: % CPU đang dùng
- NetworkIn / NetworkOut: Bytes vào/ra qua network interface
- DiskReadOps / DiskWriteOps: IOPS đọc/ghi (chỉ với Instance Store)
- StatusCheckFailed: System hoặc instance check thất bại
Detailed Monitoring (Phí thêm, 1 phút)
Bật để có metrics granularity 1 phút, cần thiết cho Auto Scaling phản ứng nhanh.
Custom Metrics (CloudWatch Agent)
Cài CloudWatch Agent để thu thập metrics mà EC2 không tự báo cáo: RAM usage, disk space, process count, custom application metrics.
aws cloudwatch put-metric-alarm \ --alarm-name cpu-high \ --metric-name CPUUtilization \ --namespace AWS/EC2 \ --dimensions Name=InstanceId,Value=i-xxxxxxxxxxxxxxxxx \ --statistic Average \ --period 300 \ # 5 phút --threshold 80 \ --comparison-operator GreaterThanThreshold \ --evaluation-periods 2 \ # 2 lần liên tiếp mới trigger --alarm-actions arn:aws:sns:... \ # Gửi thông báo qua SNS --ok-actions arn:aws:sns:...
Best Practices
🏗 Kiến trúc & Độ sẵn sàng cao
- Triển khai instance trên ít nhất 2 Availability Zone
- Đặt instance sau Application Load Balancer (ALB) để phân tải
- Dùng Auto Scaling Group với min ≥ 2 để tự động phục hồi khi instance fail
- Thiết kế ứng dụng stateless – session lưu ở ElastiCache, không trên instance
💰 Tối ưu chi phí
- Dùng AWS Cost Explorer và Compute Optimizer để phát hiện instance oversized
- Tắt instance dev/test ngoài giờ làm việc (tiết kiệm ~70%)
- Ưu tiên Graviton (ARM) instances – hiệu năng/giá tốt hơn x86 ~20%
- Dùng Spot Instances cho batch job, CI/CD, worker queue
🔐 Bảo mật
- Tuân theo Least Privilege – IAM Role chỉ cấp quyền thực sự cần
- Bật IMDSv2, vô hiệu hóa IMDSv1 trên toàn account
- Dùng AWS Systems Manager Session Manager thay vì SSH trực tiếp
- Bật Amazon GuardDuty để phát hiện hành vi bất thường
- Cập nhật bản vá OS thường xuyên bằng AWS Systems Manager Patch Manager
📊 Hiệu năng
- Dùng gp3 thay gp2 cho EBS – hiệu năng tốt hơn, giá thấp hơn
- Bật ENA (Elastic Network Adapter) – hỗ trợ tới 100 Gbps network
- Dùng Placement Group Cluster cho HPC, low-latency workload
- Bật Enhanced Networking và EBS-Optimized nếu instance hỗ trợ
AWS CLI Cheat Sheet
## ── INSTANCES ────────────────────────────────── # Liệt kê tất cả instances aws ec2 describe-instances --query 'Reservations[].Instances[].[InstanceId,State.Name,PublicIpAddress,Tags[?Key==`Name`].Value|[0]]' --output table # Start / Stop / Reboot / Terminate aws ec2 start-instances --instance-ids i-xxxx aws ec2 stop-instances --instance-ids i-xxxx aws ec2 reboot-instances --instance-ids i-xxxx aws ec2 terminate-instances --instance-ids i-xxxx ## ── IMAGES (AMI) ──────────────────────────────── # Tạo AMI từ instance đang chạy aws ec2 create-image \ --instance-id i-xxxx \ --name "MyGoldenImage-$(date +%Y%m%d)" \ --no-reboot # Tìm AMI Amazon Linux 2023 mới nhất aws ec2 describe-images \ --owners amazon \ --filters "Name=name,Values=al2023-ami-*-x86_64" \ --query 'sort_by(Images, &CreationDate)[-1].ImageId' ## ── VOLUMES (EBS) ─────────────────────────────── # Tạo và gắn EBS volume aws ec2 create-volume --volume-type gp3 --size 100 --availability-zone ap-southeast-1a aws ec2 attach-volume --volume-id vol-xxxx --instance-id i-xxxx --device /dev/sdf # Tạo snapshot EBS aws ec2 create-snapshot --volume-id vol-xxxx --description "Backup $(date)" ## ── NETWORKING ────────────────────────────────── # Cấp Elastic IP và gắn vào instance aws ec2 allocate-address --domain vpc aws ec2 associate-address --instance-id i-xxxx --allocation-id eipalloc-xxxx ## ── AUTO SCALING ──────────────────────────────── # Thay đổi desired capacity aws autoscaling set-desired-capacity \ --auto-scaling-group-name my-asg \ --desired-capacity 6 ## ── MONITORING ────────────────────────────────── # Lấy CPU metrics 1 giờ qua aws cloudwatch get-metric-statistics \ --namespace AWS/EC2 \ --metric-name CPUUtilization \ --dimensions Name=InstanceId,Value=i-xxxx \ --start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ) \ --end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \ --period 300 --statistics Average