Nếu bạn mới dùng AWS, phần dễ rối nhất thường không phải tạo EC2 mà là sau đó phải mở cổng nào, khi nào cần Elastic IP, và làm sao để app truy cập được từ bên ngoài mà không mở bừa. Bài này đi theo đúng flow đó: tạo máy, SSH vào, cấu hình Security Group, gắn Elastic IP và public app theo cách thực dụng.
Khi nào nên dùng EC2?
EC2 phù hợp khi bạn cần một máy Linux chạy liên tục để:
- deploy backend
- chạy database hoặc Redis nội bộ
- dựng môi trường test
- host web app, API hoặc worker
Nếu bạn chỉ cần chạy một app nhỏ mà không muốn quản lý server, ECS Fargate, App Runner hoặc Lightsail có thể đơn giản hơn. Nhưng nếu bạn muốn hiểu cách hạ tầng AWS hoạt động từ gốc, EC2 vẫn là điểm bắt đầu dễ học nhất.
4 khái niệm cần nắm trước khi bấm Launch
EC2 là gì trong bài toán này?
Hiểu đơn giản, EC2 là một máy ảo chạy trong AWS. Bạn chọn:
- hệ điều hành như Ubuntu
- loại máy như
t3.micro,t3.small - ổ đĩa EBS
- rule mạng để quyết định ai được vào máy
Security Group là gì?
Security Group là firewall ở mức instance. Nó quyết định:
- cổng nào được mở
- IP nào được phép truy cập
- lưu lượng nào được đi ra ngoài
Ví dụ:
- mở
22để SSH - mở
80cho HTTP - mở
443cho HTTPS - không nên mở
3306,5432,6379ra public nếu không thực sự cần
Elastic IP là gì?
Public IPv4 mặc định của EC2 có thể đổi khi bạn stop rồi start instance. Elastic IP là IP public tĩnh để:
- trỏ domain ổn định
- không bị đổi IP sau khi restart kiểu stop/start
- dùng cho server chạy lâu dài
Public app ra ngoài nghĩa là gì?
Nghĩa là người dùng từ internet có thể truy cập app của bạn qua:
- IP public
- Elastic IP
- hoặc domain trỏ vào IP đó
Để làm được việc này, không chỉ app phải chạy, mà còn phải đúng cả 4 lớp:
- EC2 có public route ra internet
- Security Group mở đúng cổng
- OS firewall không chặn
- app đang listen đúng địa chỉ như
0.0.0.0
Bước 1: Tạo EC2 instance đầu tiên
Vào AWS Console -> EC2 -> Instances -> Launch instance.
Thiết lập tối thiểu:
Name: ví dụmy-first-ec2AMI:Ubuntu Server 24.04 LTSInstance type:t3.microhoặct3.smallKey pair: tạo key mới nếu chưa cóNetwork settings: cho phép SSH từ IP của bạn, chưa cần mở quá nhiều cổngStorage: 20 GB là đủ cho máy test hoặc web app nhỏ
Với máy mới học AWS, nên bắt đầu bằng:
- chỉ mở
SSH - source để
My IP
Không nên tick sẵn quá nhiều cổng nếu bạn chưa biết chính xác app sẽ dùng gì.
Bước 2: SSH vào EC2
Sau khi instance chạy, copy public IP rồi SSH:
chmod 400 my-key.pem
ssh -i my-key.pem ubuntu@YOUR_EC2_PUBLIC_IP
Nếu SSH lỗi, kiểm tra lần lượt:
- key có đúng file không
- Security Group có mở cổng
22không - source của cổng
22có đúng IP hiện tại của bạn không - subnet / route table của instance có internet gateway không
Bước 3: Hiểu rule Security Group theo cách dễ nhớ
Một cấu hình phổ biến cho web app:
| Mục đích | Port | Source nên dùng |
|---|---|---|
| SSH | 22 |
IP của bạn |
| HTTP | 80 |
0.0.0.0/0 |
| HTTPS | 443 |
0.0.0.0/0 |
Với app backend chạy ở port 3000, 8000 hoặc 8080:
- môi trường test nhanh: có thể mở trực tiếp port đó ra ngoài
- production: nên để app chạy nội bộ rồi dùng Nginx reverse proxy qua
80/443
Những cổng thường không nên public trực tiếp:
- MySQL
3306 - PostgreSQL
5432 - Redis
6379 - MongoDB
27017
Nếu cần kết nối các service này, ưu tiên:
- chỉ mở cho private IP nội bộ
- hoặc mở theo Security Group khác
- hoặc dùng SSH tunnel / bastion / VPN
Bước 4: Gắn Elastic IP khi nào?
Nếu đây là máy chạy lâu dài, có domain hoặc bạn không muốn IP đổi sau này, hãy gắn Elastic IP.
Vào:
EC2 -> Elastic IPs -> Allocate Elastic IP -> Associate Elastic IP
Gắn vào đúng instance vừa tạo.
Khi nào nên gắn Elastic IP:
- server production
- app cần gắn domain
- cần whitelist IP ở bên thứ ba
Khi nào chưa cần:
- máy test ngắn hạn
- lab dùng vài giờ rồi xóa
Lưu ý: Elastic IP không gắn vào instance vẫn có thể bị tính phí. Allocate xong mà không dùng thì nên release.
Bước 5: Public app ra ngoài theo cách ít lỗi
Cách nhanh để test
Giả sử app Node.js đang chạy ở port 3000:
ss -tulpn | grep 3000
Nếu app chỉ bind vào 127.0.0.1:3000, bên ngoài sẽ không vào được. App phải listen 0.0.0.0.
Ví dụ với Express:
app.listen(3000, "0.0.0.0");
Sau đó mở inbound rule:
TCP 3000- source
0.0.0.0/0nếu chỉ test tạm
Lúc này bạn có thể truy cập:
http://YOUR_ELASTIC_IP:3000
Cách nên dùng cho production
Đừng public thẳng app port 3000 lâu dài. Nên dùng Nginx:
sudo apt update
sudo apt install nginx -y
Tạo file config:
server {
listen 80;
server_name _;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Enable config rồi reload:
sudo nginx -t
sudo systemctl reload nginx
Security Group lúc này chỉ cần public:
80443
App backend giữ ở nội bộ:
127.0.0.1:3000
Mô hình này gọn hơn vì:
- ít cổng public hơn
- dễ gắn SSL
- dễ đổi app phía sau
- dễ log và rate limit bằng reverse proxy
Cách public domain ra ngoài
Sau khi có Elastic IP:
- vào DNS provider
- tạo bản ghi
A - trỏ domain hoặc subdomain về Elastic IP
Ví dụ:
api.example.com -> 3.25.xx.xx
Nếu dùng Nginx, sau đó có thể gắn HTTPS bằng Let's Encrypt hoặc đưa qua Cloudflare.
Các lỗi hay gặp khi public EC2
Mở Security Group rồi nhưng vẫn không vào được
Thường là do một trong các lỗi sau:
- app đang listen
127.0.0.1thay vì0.0.0.0 - Ubuntu đang bật
ufwvà chưa allow cổng - Nginx chưa reload hoặc config sai
- bạn mở nhầm Security Group của instance khác
Kiểm tra nhanh:
sudo ufw status
ss -tulpn
curl http://127.0.0.1:3000
curl http://YOUR_ELASTIC_IP
SSH đang vào được nhưng HTTP không vào được
Điều này thường có nghĩa là:
- cổng
22mở đúng - nhưng cổng
80hoặc443chưa mở trong Security Group - hoặc web server chưa chạy
Stop rồi start EC2 xong IP bị đổi
Đó là lúc bạn cần Elastic IP. Public IP mặc định không phải IP cố định lâu dài.
Kết luận nhanh
Nếu chỉ cần nhớ một flow ngắn:
- tạo EC2 với Ubuntu
- mở
22cho IP của bạn - SSH vào máy
- chạy app và kiểm tra app listen
0.0.0.0 - production thì public qua Nginx bằng
80/443 - gắn Elastic IP nếu cần IP cố định hoặc gắn domain
Nếu bạn làm theo flow này, phần lớn các lỗi kiểu “EC2 chạy rồi mà bên ngoài không vào được” sẽ dễ debug hơn rất nhiều.