Hướng Dẫn Sử Dụng EC2 Làm Bastion Host + SSH Tunnel Để Truy Cập RDS Private Từ Máy Local Chuyên mục Devops 2025-04-08 12 Lượt xem 12 Lượt thích 0 Bình luận
Trong quá trình phát triển hệ thống trên AWS, việc đặt RDS trong private subnet là một biện pháp bảo mật tốt để tránh các kết nối trực tiếp từ internet. Tuy nhiên, điều này lại gây khó khăn cho developer khi cần kết nối tới RDS từ máy local để debug hoặc phát triển.
Trong bài viết này, mình sẽ hướng dẫn cách dùng một EC2 làm Bastion Host (hay còn gọi là Jump Host) để thiết lập SSH Tunnel, giúp bạn kết nối được với RDS từ local một cách an toàn, nhanh chóng và không cần mở public access cho RDS.
✅ Mô hình kết nối
[Máy local của Developer]
|
| SSH Tunnel (port forward)
↓
[EC2 Bastion Host (có public IP)]
|
↓
[RDS Instance (nằm trong private subnet)]
📦 Giả sử hệ thống như sau:
-
RDS: PostgreSQL, nằm trong private subnet.
-
EC2: Nằm trong public subnet, trong cùng VPC với RDS.
-
Developer: Muốn connect RDS từ máy local qua code Laravel (hoặc app backend khác).
🏗️ Bước 1: Chuẩn bị EC2 Bastion Host
1.1 Tạo EC2
-
Chọn AMI: Amazon Linux 2 hoặc Ubuntu đều được.
-
Gán vào public subnet cùng VPC với RDS.
-
Cấp Elastic IP (tĩnh) nếu cần ổn định.
-
Attach keypair để SSH.
-
Gắn Security Group:
-
Inbound: cho phép port 22 từ IP developer (hoặc dải IP nội bộ công ty).
-
Outbound: giữ nguyên default (cho phép tất cả).
-
1.2 Đảm bảo EC2 có thể ping RDS
-
EC2 và RDS cần có routing thông nhau (qua VPC route table).
-
RDS's Security Group cần cho phép kết nối từ EC2's security group.
🛡️ Bước 2: Cấu hình Security Group cho RDS
-
Vào security group của RDS.
-
Thêm rule:
Type: PostgreSQL (hoặc MySQL nếu dùng MySQL) Source: <security group của EC2> hoặc IP cụ thể nếu dùng SSH từ public IP
🔐 Bước 3: Thiết lập SSH Tunnel từ máy local
Giả sử:
-
ec2-user@13.215.123.123: public IP của EC2
-
rds-private.xxxx.ap-southeast-1.rds.amazonaws.com: endpoint của RDS
-
RDS port: 5432 (PostgreSQL)
Chạy command:
ssh -i "~/.ssh/your-key.pem" \
-N -L 5432:rds-private.xxxx.ap-southeast-1.rds.amazonaws.com:5432 \
ec2-user@13.215.123.123
Giải thích:
-N: không mở shell, chỉ tunnel.
-L 5432:...: chuyển hướng localhost:5432 của bạn tới RDS thông qua EC2.
🧪 Bước 4: Test kết nối từ code
Ví dụ với Laravel .env:
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=your_db
DB_USERNAME=your_user
DB_PASSWORD=your_pass
Sau đó:
php artisan migrate
Hoặc test với một script Python, Node.js, Go, v.v... miễn là trỏ DB_HOST về localhost.
💡 Mẹo & Lưu ý
-
Tunnel cần mở suốt trong thời gian sử dụng. Có thể dùng tool như autossh để giữ tunnel luôn sống.
-
Đừng quên chmod 400 file .pem để tránh lỗi SSH.
-
Bạn có thể thay port local nếu bị xung đột:
-L 15432:rds-endpoint:5432
📌 Kết luận
Sử dụng EC2 làm Bastion Host và thiết lập SSH Tunnel là một cách vừa nhanh chóng, vừa bảo mật để developer kết nối đến RDS private mà không cần làm RDS public hoặc cấu hình VPN phức tạp.
Đây là giải pháp lý tưởng cho:
-
Team phát triển cần debug nhanh từ local.
-
Môi trường staging/dev với hạn chế kết nối.
Bình luận (0)