BÀI 3: Bài lab cơ bản về Terraform với EC2 – Tạo máy chủ ảo AWS bằng mã Chuyên mục Devops 2025-05-15 7 Lượt xem 7 Lượt thích 0 Bình luận
Sau khi đã làm quen với Terraform qua việc tạo S3 Bucket, giờ là lúc bạn tiếp cận một thành phần quan trọng hơn trong hạ tầng cloud: máy chủ EC2. EC2 là trung tâm của rất nhiều hệ thống backend, web server, API…
🎯 Mục tiêu bài lab
- 
Tạo một instance EC2 
- 
Gán vào subnet cụ thể 
- 
Gán SSH key để truy cập 
- 
Mở cổng 22 để SSH vào máy 
- 
Gán public IP để có thể SSH từ bên ngoài 
🛠️ Yêu cầu trước
- 
Tài khoản AWS và access key + secret key (cấu hình qua aws configure) 
- 
Đã cài đặt Terraform 
- 
Có 1 VPC default và ít nhất 1 subnet public 
- 
Có file .pem (SSH key) đã tạo trước trong EC2 hoặc tạo mới qua lệnh: 
ssh-keygen -t rsa -b 2048 -f dev-key
aws ec2 import-key-pair \
  --key-name "dev-key" \
  --public-key-material fileb://dev-key.pub📁 Cấu trúc dự án
terraform-ec2-lab/
├── main.tf
├── variables.tf
├── terraform.tfvars
├── outputs.tf🧱 Bước 1: Khai báo provider và resource (main.tf)
provider "aws" {
  region = var.region
}
data "aws_vpc" "default" {
  default = true
}
data "aws_subnet" "public" {
  id = var.subnet_id
}
resource "aws_security_group" "allow_ssh" {
  name        = "allow_ssh"
  description = "Allow SSH inbound traffic"
  vpc_id      = data.aws_vpc.default.id
  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}
resource "aws_instance" "web" {
  ami                         = var.ami_id
  instance_type               = var.instance_type
  subnet_id                   = data.aws_subnet.public.id
  vpc_security_group_ids      = [aws_security_group.allow_ssh.id]
  key_name                    = var.key_name
  associate_public_ip_address = true
  tags = {
    Name = "Terraform-EC2"
  }
}⚙️ Bước 2: Khai báo biến (variables.tf)
variable "region" {
  default = "us-east-1"
}
variable "ami_id" {
  description = "Amazon Machine Image ID (Ubuntu, Amazon Linux...)"
  type        = string
}
variable "instance_type" {
  description = "Loại máy EC2"
  default     = "t2.micro"
}
variable "key_name" {
  description = "Tên SSH key đã import vào AWS"
  type        = string
}
variable "subnet_id" {
  description = "ID của subnet nơi đặt máy chủ"
  type        = string
}📝 Bước 3: Gán giá trị cho biến (terraform.tfvars)
ami_id        = "ami-026c39f4021df9abe"
key_name      = "liveapp-dev-key"
instance_type = "t2.micro"
subnet_id     = "subnet-07c430403014d1538"📌 Bạn có thể tìm subnet_id và ami_id trong AWS Console (EC2 & VPC)
📌 AMI ID trên vùng us-east-1 thường dùng: ami-026c39f4021df9abe (Amazon Linux 2023)
📤 Bước 4: Xuất thông tin máy chủ (outputs.tf)
output "public_ip" {
  value = aws_instance.web.public_ip
}
output "instance_id" {
  value = aws_instance.web.id
}🚀 Bước 5: Chạy Terraform
terraform init
terraform plan
terraform applyNhập yes để xác nhận.
🔍 Bước 6: Kiểm tra và SSH vào máy chủ
Sau khi apply thành công:
ssh -i liveapp-dev-key ec2-user@<public_ip>Lưu ý:
- 
Amazon Linux dùng ec2-user 
- 
Ubuntu dùng ubuntu 
🧹 Bước 7: Dọn dẹp
terraform destroy💡 Tổng kết bài lab
✅ Tạo EC2 instance với Terraform
✅ Sử dụng data để lấy VPC/subnet có sẵn
✅ Tự tạo security group mở port SSH
✅ Gán SSH key để truy cập
✅ Gán IP công khai để truy cập từ Internet
👉 Tiếp theo: [Bài 4 – Hiểu về hướng viết theo dạng Module trong Terraform: cấu trúc, chia nhỏ, tái sử dụng]
 
                        
                                         
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                    
Bình luận (0)