RDS: Chạy Database PostgreSQL do AWS Quản Lý
Trong bài này chúng ta tạo một database PostgreSQL bằng RDS, đặt nó ở vị trí an toàn trong mạng, rồi kết nối tới nó từ một instance EC2. Đây là bài áp dụng trực tiếp bài học về private subnet và Security Group từ Bài 3.
RDS (Relational Database Service) là dịch vụ chạy database quan hệ (PostgreSQL, MySQL, MariaDB, SQL Server...) do AWS quản lý. Bạn không phải tự cài đặt, vá lỗi, sao lưu hay xử lý sự cố phần cứng — AWS lo những việc đó. Bạn tập trung vào dữ liệu và truy vấn.
Mục tiêu
- Tạo một RDS PostgreSQL
db.t3.microkhông cho truy cập từ Internet. - Cấu hình Security Group để chỉ EC2 của bạn kết nối được tới database.
- Kết nối từ EC2 và chạy thử vài câu lệnh SQL.
- Dọn dẹp đúng cách — phần quan trọng nhất của bài này.
Chi phí dự kiến
RDS là dịch vụ dễ phát sinh chi phí lớn nhất trong series, vì database thường được thiết kế để chạy liên tục và có nhiều tùy chọn đắt tiền.
- Tài khoản mô hình credit (tạo sau 15/07/2025): chi phí
db.t3.microtrừ vào credit; dùng thử RDS cũng nằm trong nhóm hoạt động kiếm thêm credit. - Tài khoản mô hình cũ (tạo trước 15/07/2025): miễn phí 750 giờ
db.t3.microSingle-AZ, 20 GB storage và 20 GB backup mỗi tháng trong 12 tháng đầu.
Hai cái bẫy tốn tiền cần tránh khi tạo:
- Multi-AZ: tạo thêm một bản sao dự phòng ở AZ khác, nhân đôi chi phí. Để học thì chọn Single-AZ.
- Instance lớn: chỉ chọn
db.t3.micro, không chọn loại to hơn.
Và quan trọng: RDS bị dừng (stop) tối đa 7 ngày rồi tự khởi động lại, nên "tắt cho đỡ tốn" không phải cách dọn dẹp. Học xong phải xóa hẳn instance, xem phần cuối bài.
Vì sao dùng RDS thay vì tự cài database trên EC2
Bạn hoàn toàn có thể SSH vào EC2 và tự cài PostgreSQL. Nhưng khi đó bạn nhận luôn mọi việc vận hành đi kèm:
- Sao lưu: tự dựng cơ chế backup định kỳ và kiểm tra khôi phục được.
- Vá lỗi: tự theo dõi và cập nhật bản vá bảo mật cho PostgreSQL.
- Khôi phục sau sự cố: nếu máy hỏng, tự lo dựng lại và phục hồi dữ liệu.
- Mở rộng: tự xử lý khi cần tăng dung lượng hay cấu hình.
RDS làm sẵn những việc này: backup tự động, vá lỗi theo lịch, khôi phục về một thời điểm (point-in-time recovery), và nâng cấu hình chỉ bằng vài thao tác. Đổi lại, bạn trả phí cao hơn một chút so với tự chạy. Với gần như mọi hệ thống thật, đây là đánh đổi xứng đáng — đó là lý do RDS phổ biến.
Chuẩn bị: một EC2 để kết nối tới database
Database trong bài này sẽ nằm trong private subnet và không nhận kết nối từ Internet. Để truy cập nó, ta cần một EC2 nằm cùng VPC làm điểm kết nối.
Nếu bạn đã dọn EC2 ở các bài trước, dựng lại nhanh một instance như Bài 2 (Amazon Linux 2023, t2.micro, key devops-key, Security Group mở SSH cho IP của bạn). Ghi lại Security Group ID của instance này — ta cần nó ở bước sau. Có thể lấy nhanh bằng CLI:
# Lấy SG id của instance đang chạy (giả sử chỉ có 1 instance)
EC2_SG=$(aws ec2 describe-instances \
--filters Name=instance-state-name,Values=running \
--query "Reservations[0].Instances[0].SecurityGroups[0].GroupId" \
--output text)
echo $EC2_SG
Bước 1: Tạo Security Group cho database
Database chỉ nên nhận kết nối từ EC2 của bạn, không từ đâu khác. Ta tạo một Security Group cho RDS, mở port PostgreSQL (5432) chỉ cho Security Group của EC2 — đúng kiểu "source là một SG khác" đã nói ở Bài 3.
VPC_ID=$(aws ec2 describe-vpcs --filters Name=isDefault,Values=true \
--query "Vpcs[0].VpcId" --output text)
# Tạo SG cho RDS
RDS_SG=$(aws ec2 create-security-group \
--group-name rds-postgres-sg \
--description "Cho phep EC2 ket noi toi RDS" \
--vpc-id $VPC_ID \
--query "GroupId" --output text)
# Mở port 5432 chỉ cho SG của EC2
aws ec2 authorize-security-group-ingress \
--group-id $RDS_SG \
--protocol tcp --port 5432 \
--source-group $EC2_SG
echo "RDS SG: $RDS_SG"
Như vậy chỉ instance thuộc Security Group $EC2_SG mới mở được kết nối tới database. Kể cả ai đó biết địa chỉ database, không nằm trong SG đó thì cũng không vào được.
Bước 2: Tạo RDS PostgreSQL
Với database, dùng giao diện sẽ rõ ràng hơn cho lần đầu. Vào dịch vụ RDS > Create database.
- Engine: chọn PostgreSQL.
- Templates: chọn Free tier nếu có (tài khoản cũ), hoặc Dev/Test rồi tự chỉnh cho nhỏ.
- Availability: chọn Single-AZ (không bật Multi-AZ).
- DB instance identifier: ví dụ
devops-db. - Master username / password: đặt và ghi lại. Ví dụ user
postgres, và một mật khẩu mạnh. - Instance configuration: chọn
db.t3.micro. - Storage: để mặc định 20 GB, tắt tùy chọn storage autoscaling cho đỡ phát sinh.
- Connectivity:
- Public access: chọn No. Đây là điểm mấu chốt: database không nhận kết nối trực tiếp từ Internet.
- VPC security group: chọn Choose existing, bỏ default, chọn
rds-postgres-sgvừa tạo.
- Additional configuration: đặt Initial database name, ví dụ
appdb, để RDS tạo sẵn một database trống. - Bấm Create database.
RDS mất vài phút để khởi tạo. Khi Status chuyển sang Available, mở instance và copy Endpoint (dạng devops-db.xxxx.ap-southeast-1.rds.amazonaws.com). Đây là địa chỉ để kết nối.
Bước 3: Kết nối từ EC2
SSH vào EC2 (như Bài 2). Cài PostgreSQL client để có lệnh psql:
sudo dnf install postgresql15 -y
Kết nối tới database, thay <ENDPOINT> bằng endpoint vừa copy:
psql -h <ENDPOINT> -U postgres -d appdb
Nhập mật khẩu master. Nếu vào được, dấu nhắc đổi thành appdb=>. Thử vài câu lệnh:
CREATE TABLE notes (id SERIAL PRIMARY KEY, content TEXT);
INSERT INTO notes (content) VALUES ('Ghi chu dau tien tren RDS');
SELECT * FROM notes;
Bạn vừa tạo bảng, ghi một dòng và đọc lại nó từ một database chạy trên RDS. Gõ \q để thoát psql.
Nếu lệnh psql treo rồi timeout, thường do Security Group: kiểm tra rds-postgres-sg đã mở port 5432 cho đúng SG của EC2 đang dùng chưa.
🧹 Dọn dẹp
Đây là phần quan trọng nhất của bài. Một RDS instance để quên có thể tốn nhiều hơn hẳn EC2. Nhớ là stop không đủ — RDS tự bật lại sau tối đa 7 ngày — nên ta xóa hẳn.
Xóa RDS instance qua CLI (lưu ý hai cờ quan trọng):
aws rds delete-db-instance \
--db-instance-identifier devops-db \
--skip-final-snapshot \
--delete-automated-backups
--skip-final-snapshot: không tạo snapshot cuối. Snapshot chiếm dung lượng và vẫn tính tiền, nên với dữ liệu học thì bỏ.--delete-automated-backups: xóa luôn các bản backup tự động.
Việc xóa mất vài phút. Theo dõi tới khi instance biến mất:
aws rds describe-db-instances \
--query "DBInstances[].{ID:DBInstanceIdentifier,Status:DBInstanceStatus}" \
--output table
Khi danh sách rỗng, database đã được xóa. Kiểm tra thêm không còn snapshot thủ công nào sót lại (snapshot cũng tính tiền lưu trữ):
aws rds describe-db-snapshots --snapshot-type manual \
--query "DBSnapshots[].DBSnapshotIdentifier" --output table
Sau khi RDS đã xóa, xóa Security Group của nó:
aws ec2 delete-security-group --group-id $RDS_SG
Cuối cùng, nếu EC2 chỉ được dựng để làm bài này, terminate nó như phần dọn dẹp Bài 2.
Tổng kết
Bạn vừa tạo một database có quản lý, đặt nó trong mạng riêng không phơi ra Internet, và chỉ cho EC2 của mình kết nối tới qua Security Group. Đây là mô hình chuẩn cho tầng dữ liệu: database ở private, chỉ ứng dụng truy cập, không mở ra ngoài.
Tới đây bạn đã có đủ các mảnh hạ tầng cơ bản: compute (EC2), mạng (VPC/SG), lưu trữ (S3), database (RDS). Từ Bài 6, ta chuyển sang phần đóng gói và tự động hóa: Docker hóa một ứng dụng và đẩy image lên ECR, để chuẩn bị cho CI/CD ở Bài 7.