AWS EC2 Public
sg • eip • ssh • web

Cách đưa app ra Internet bằng AWS EC2 và Elastic IP

Hướng dẫn thực tế để tạo EC2 trên AWS, hiểu Security Group, gắn Elastic IP và đưa app ra Internet theo cách dễ làm nhưng an toàn hơn.

10 phút đọc16/06/2026

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ở 80 cho HTTP
  • mở 443 cho HTTPS
  • không nên mở 3306, 5432, 6379 ra 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:

  1. EC2 có public route ra internet
  2. Security Group mở đúng cổng
  3. OS firewall không chặn
  4. 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-ec2
  • AMI: Ubuntu Server 24.04 LTS
  • Instance type: t3.micro hoặc t3.small
  • Key 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ổng
  • Storage: 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:

  1. key có đúng file không
  2. Security Group có mở cổng 22 không
  3. source của cổng 22 có đúng IP hiện tại của bạn không
  4. 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/0 nế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:

  • 80
  • 443

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:

  1. vào DNS provider
  2. tạo bản ghi A
  3. 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.1 thay vì 0.0.0.0
  • Ubuntu đang bật ufw và 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 22 mở đúng
  • nhưng cổng 80 hoặc 443 chư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:

  1. tạo EC2 với Ubuntu
  2. mở 22 cho IP của bạn
  3. SSH vào máy
  4. chạy app và kiểm tra app listen 0.0.0.0
  5. production thì public qua Nginx bằng 80/443
  6. 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.