EC2: Tạo Máy Chủ Ảo Đầu Tiên và Chạy Web Server

K
Kai··6 min read

Trong bài này chúng ta sẽ tạo một máy chủ ảo trên AWS, đăng nhập vào nó qua SSH, cài một web server và mở được trang web từ trình duyệt. Dịch vụ ta dùng là EC2.

EC2 (Elastic Compute Cloud) là dịch vụ cho thuê máy chủ ảo. Mỗi máy chủ gọi là một instance. Bạn chọn cấu hình (CPU, RAM), chọn hệ điều hành, và AWS cấp cho bạn một máy chạy trên hạ tầng của họ, tính tiền theo thời gian chạy.

Mục tiêu

  1. Tạo một EC2 instance chạy Amazon Linux.
  2. SSH vào instance từ máy của bạn.
  3. Cài nginx và mở trang mặc định từ trình duyệt.
  4. Dọn dẹp để không bị tính tiền sau khi học xong.

Chi phí dự kiến

Bài này tạo một EC2 instance loại t2.micro (hoặc t3.micro tùy region) và một ổ đĩa EBS đi kèm.

  • Tài khoản dùng mô hình credit (tạo sau 15/07/2025): chi phí instance được trừ vào 100 USD credit được tặng, không mất tiền thật. Một t2.micro/t3.micro tốn khoảng 0,01–0,02 USD mỗi giờ, nên một buổi học chỉ trừ vài cent credit. Ngoài ra, việc dùng thử EC2 còn nằm trong nhóm hoạt động giúp kiếm thêm credit.
  • Tài khoản dùng mô hình cũ (tạo trước 15/07/2025): t2.micro/t3.micro được miễn phí 750 giờ mỗi tháng trong 12 tháng đầu, đủ chạy liên tục một instance; EBS miễn phí tới 30 GB.

Dù theo mô hình nào, đây vẫn là loại resource hay bị quên và âm thầm tiêu credit hoặc tiền. Làm xong bài, nhớ chạy phần dọn dẹp ở cuối.

Bước 1: Tạo key pair để SSH

Để đăng nhập vào instance qua SSH, ta cần một cặp khóa (key pair): AWS giữ khóa công khai, bạn giữ khóa riêng tư. Khi SSH, máy bạn dùng khóa riêng để chứng minh danh tính, không cần mật khẩu.

  1. Mở dịch vụ EC2 (gõ "EC2" ở thanh tìm kiếm). Kiểm tra region ở góc trên bên phải đang là region bạn chọn ở Bài 1 (ví dụ ap-southeast-1).
  2. Menu trái, mục Network & Security > Key Pairs, chọn Create key pair.
  3. Đặt tên, ví dụ devops-key. Loại khóa để RSA, định dạng chọn .pem (cho macOS/Linux và Windows hiện đại).
  4. Bấm tạo. Trình duyệt tự tải về file devops-key.pem. File này chỉ tải được một lần, mất là phải tạo key mới.

Trên macOS/Linux, đặt quyền cho file khóa để SSH chấp nhận nó:

chmod 400 ~/Downloads/devops-key.pem

SSH từ chối dùng file khóa nếu quyền của nó quá mở (người khác trên máy cũng đọc được). Lệnh trên giới hạn chỉ mình bạn đọc được.

Bước 2: Tạo instance

  1. Trong EC2, bấm Launch instance.
  2. Name: đặt tên, ví dụ web-server.
  3. Application and OS Images: chọn Amazon Linux 2023 (đây là bản Linux do AWS bảo trì, nằm trong Free Tier).
  4. Instance type: chọn t2.micro hoặc t3.micro — loại nhỏ và rẻ nhất, đủ cho bài học. Nếu tài khoản dùng mô hình cũ, để ý nhãn "Free tier eligible" trên đúng loại này.
  5. Key pair: chọn devops-key vừa tạo ở Bước 1.
  6. Network settings: bấm Edit và cấu hình Security Group. Đây là phần quan trọng:
    • Tạo rule cho phép SSH (port 22), nhưng Source chọn My IP — chỉ máy có IP hiện tại của bạn mới SSH được. Đừng để 0.0.0.0/0 (mọi nơi) cho SSH, vì như vậy cả thế giới đều thử đăng nhập được.
    • Thêm một rule cho phép HTTP (port 80), Source để Anywhere (0.0.0.0/0) — vì ta muốn ai cũng xem được trang web.
  7. Configure storage: để mặc định (8 GB là đủ và nằm trong Free Tier).
  8. Bấm Launch instance.

Quay lại danh sách instance, chờ tới khi cột Instance state chuyển sang RunningStatus check báo đủ. Bấm vào instance để xem chi tiết, ghi lại Public IPv4 address — đây là địa chỉ để SSH và để mở trên trình duyệt.

Ta vừa chạm tới Security Group mà chưa giải thích kỹ. Tạm hiểu nó là tường lửa của instance, quyết định cổng nào mở và ai được vào. Bài 3 sẽ đi sâu vào VPC và Security Group.

Bước 3: SSH vào instance

Với Amazon Linux, user đăng nhập mặc định là ec2-user. Thay <PUBLIC_IP> bằng địa chỉ IP vừa ghi:

ssh -i ~/Downloads/devops-key.pem ec2-user@<PUBLIC_IP>

Lần đầu kết nối, SSH hỏi xác nhận tính xác thực của host, gõ yes. Nếu vào được, dấu nhắc terminal đổi thành dạng [ec2-user@ip-... ~]$. Bạn đang đứng trong máy chủ trên AWS.

Nếu lệnh bị treo rồi timeout, thường là do Security Group chưa mở port 22 cho IP của bạn, hoặc IP của bạn đã đổi (mạng nhà hay đổi IP). Vào lại Security Group của instance, sửa rule SSH cho khớp IP hiện tại.

Bước 4: Cài nginx và chạy web server

nginx là một web server phổ biến. Ta cài nó để phục vụ một trang web. Các lệnh sau chạy bên trong instance (sau khi đã SSH vào):

# Cập nhật danh sách gói
sudo dnf update -y

# Cài nginx
sudo dnf install nginx -y

# Khởi động nginx
sudo systemctl start nginx

# Cho nginx tự chạy lại mỗi khi máy khởi động
sudo systemctl enable nginx

sudo nghĩa là chạy lệnh với quyền quản trị. systemctl là công cụ quản lý dịch vụ trên Linux: start để chạy ngay, enable để dịch vụ tự bật lại sau mỗi lần reboot.

Giờ mở trình duyệt và truy cập http://<PUBLIC_IP> (nhớ là http, không phải https). Bạn sẽ thấy trang chào mặc định của nginx. Trang này đang được phục vụ từ máy chủ bạn vừa tạo.

Thử đổi nội dung trang cho rõ là nó thật sự chạy từ máy của bạn:

echo "<h1>Server dau tien cua toi tren AWS</h1>" | sudo tee /usr/share/nginx/html/index.html

Tải lại trang trên trình duyệt, nội dung đã đổi. tee ghi nội dung vào file; ta cần sudo vì file này thuộc quyền quản trị.

exit để thoát khỏi phiên SSH, quay về terminal máy mình.

🧹 Dọn dẹp

Đây là phần bắt buộc. Bài này tạo hai thứ tính tiền: instance EC2 và ổ EBS gắn theo nó. Khi terminate instance, ổ EBS mặc định cũng bị xóa cùng, nên chỉ cần terminate là đủ.

Qua giao diện:

  1. Vào EC2 > Instances, chọn instance web-server.
  2. Menu Instance state > Terminate (delete) instance, xác nhận.
  3. Sau một lúc, state chuyển sang Terminated. Instance ở trạng thái này không còn tính tiền và sẽ tự biến mất khỏi danh sách sau vài giờ.

Hoặc qua CLI (lấy instance id ở cột Instance ID):

aws ec2 terminate-instances --instance-ids <INSTANCE_ID>

Vài thứ còn lại nhưng không tính tiền, bạn có thể giữ để dùng cho bài sau:

  • Key pair devops-key: giữ lại để các bài sau khỏi tạo mới. (Muốn xóa thì vào Key Pairs, nhưng nhớ là xóa trên AWS không xóa file .pem trên máy bạn.)
  • Security Group vừa tạo: giữ cũng được, không tốn tiền.

Kiểm tra lại không còn instance nào đang chạy:

aws ec2 describe-instances \
  --query "Reservations[].Instances[].{ID:InstanceId,State:State.Name}" \
  --output table

Nếu kết quả rỗng hoặc tất cả đều terminated, bạn đã dọn sạch phần tốn tiền.

Tổng kết

Bạn vừa tạo một máy chủ trên AWS, đăng nhập vào nó, cài web server và phục vụ một trang web ra Internet — rồi dọn dẹp lại. Đây là vòng đời cơ bản của một resource trên cloud: tạo, dùng, xóa.

Trong lúc làm, ta đã chạm tới Security Group khi mở port 22 và 80. Bài 3 sẽ giải thích kỹ phần mạng: VPC, subnet, và vì sao cấu hình Security Group đúng lại quan trọng cho bảo mật.