0
0
Lập trình
Admin Team
Admin Teamtechmely

Xây Dựng & Triển Khai Web Server Nginx Trên AWS Với Terraform

Đăng vào 5 tháng trước

• 8 phút đọc

Hướng Dẫn Xây Dựng & Triển Khai Web Server Nginx Trên AWS Với Terraform

Giới Thiệu

Trong bài viết này, chúng ta sẽ cùng nhau khám phá cách thiết lập một web server Nginx trên AWS bằng cách sử dụng Terraform và GitHub. Đây là một điểm khởi đầu tuyệt vời nếu bạn đang học về DevOps hoặc mới bắt đầu với Infrastructure-as-Code (IaC). Việc sử dụng Terraform giúp bạn tự động hóa quy trình triển khai hạ tầng, tiết kiệm thời gian và công sức.

Điều Kiện Tiên Quyết

Trước khi bắt đầu, bạn cần chuẩn bị những điều kiện sau:

  • Tài khoản AWS (đã thiết lập thông tin xác thực)
  • Terraform được cài đặt trên máy tính cục bộ
  • Tài khoản GitHub

Bắt Đầu

Kiểm Tra Môi Trường Cục Bộ

Đầu tiên, hãy đảm bảo rằng môi trường cục bộ của bạn đã được thiết lập đúng cách. Kiểm tra xem AWS CLI đã được cài đặt và thông tin xác thực đã được thiết lập chính xác. Sử dụng các lệnh dưới đây để xác minh:

bash Copy
PS C:\> aws --version
aws-cli/2.28.16 Python/3.13.7 Windows/11 exe/AMD64

Tệp tin thông tin xác thực sẽ có dạng sau:

Copy
aws_access_key_id=************
aws_secret_access_key=************

Tiếp theo, hãy xác nhận xem Terraform đã được cài đặt hay chưa:

bash Copy
PS C:\> terraform version
Terraform v1.13.2
on windows_amd64

Tạo Kho Lưu Trữ GitHub

Sau khi môi trường cục bộ đã sẵn sàng, chúng ta sẽ tiến hành tạo một kho lưu trữ GitHub và sao chép nó vào không gian làm việc IDE cục bộ (trong trường hợp này, chúng ta sẽ sử dụng VS Code).

Cấu Trúc Tệp Tin
Dưới đây là cách chúng ta sẽ tổ chức các tệp tin:

Copy
sws-terraform/
├── provider.tf     # Định nghĩa nhà cung cấp Cloud
├── main.tf         # Tất cả tài nguyên AWS
├── data.tf         # Lấy thông tin về tài nguyên AWS
├── variables.tf    # Biến đầu vào
├── outputs.tf      # Giá trị đầu ra
├── scripts         # Tệp tin khởi động EC2
    └── userdata.sh # Tệp tin khởi động EC2

Chú ý: Tệp tin .tf là tệp cấu hình Terraform được viết bằng HashiCorp Configuration Language (HCL). Nó định nghĩa tài nguyên hạ tầng mà bạn muốn tạo, quản lý hoặc phá hủy bằng Terraform.

Giải Thích Mã Lệnh

provider.tf

Tệp tin này dùng để cấu hình nhà cung cấp cloud. Ở đây, chúng ta sẽ sử dụng AWS. Tệp này cho Terraform biết nền tảng cloud nào sẽ được sử dụng, vùng nào sẽ triển khai tài nguyên (trong trường hợp này là web server), và tùy chọn phiên bản của plugin nhà cung cấp sẽ được sử dụng.

hcl Copy
# Cài đặt AWS làm nhà cung cấp
terraform {
  required_providers {
    aws = {
        source = "hashicorp/aws"
        version = "5.40.0"
    }
  }
}

# Thiết lập vùng mặc định nơi web server sẽ được khởi chạy
provider "aws" {
  region = "us-east-1"
}

variables.tf

Tệp tin này cho phép chúng ta định nghĩa các tham số đầu vào, giúp mã hạ tầng linh hoạt, tái sử dụng và dễ quản lý hơn.

hcl Copy
variable "ec2instancetype" {
  default = "t2.micro"
}

variable "http_port" {
  default = "80"
}

variable "tcp_protocol" {
  default = "tcp"
}

variable "allow_all" {
  default = "0.0.0.0/0"
}

data.tf

Tệp tin này trong Terraform rất quan trọng vì nó định nghĩa các nguồn dữ liệu, cho phép chúng ta lấy và tham chiếu hạ tầng hiện có, ngăn ngừa lãng phí công sức vào việc sao chép tài nguyên.

hcl Copy
# Lấy thông tin chi tiết VPC
data "aws_vpc" "main" {
  default = true
}

# Lấy thông tin subnet cho một vùng khả dụng cụ thể & VPC
data "aws_subnet" "subnet_id" {
  filter {
    name = "availability-zone"
    values = ["${data.aws_region.current.name}a"]
  }

  filter {
      name = "vpc-id"
      values = [data.aws_vpc.main.id]
    }
}

# Lấy thông tin AMI cho Ubuntu
data "aws_ami" "ubuntu" {
  most_recent = true
  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*"]
  }
   owners = ["099720109477"] # Canonical
}

main.tf

Đây là tệp nơi chúng ta tạo các tài nguyên cần thiết và phục vụ như tệp cấu hình trung tâm. Đây là trái tim của dự án Terraform của chúng ta.

hcl Copy
# Nhóm bảo mật cho web server
resource "aws_security_group" "mysg" {
  vpc_id = data.aws_vpc.main.id
  name = "sws-sg"
  description = "nhóm bảo mật cho web server truy cập công khai"
  ingress {
    from_port   = var.http_port
    to_port     = var.http_port
    protocol    = var.tcp_protocol
    cidr_blocks = ["${var.allow_all}"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["${var.allow_all}"]
  }
}

resource "aws_instance" "sws" {
  ami = data.aws_ami.ubuntu.id
  instance_type = var.ec2instancetype
  user_data = file("./scripts/userdata.sh")
  subnet_id = data.aws_subnet.subnet_id.id
  vpc_security_group_ids = [aws_security_group.mysg.id]
  associate_public_ip_address = true
  tags = {
    Name = "sws"
    Environment = "test"
  }
}

outputs.tf

Tệp tin này được sử dụng để lấy thông tin về các tài nguyên mà chúng ta vừa tạo trong tệp cấu hình trung tâm.

hcl Copy
output "sws_url" {
  value = aws_instance.sws.public_dns
}

userdata.sh

Tệp tin này được sử dụng như một script khởi động khi EC2 được khởi chạy và cài đặt web server Nginx.

bash Copy
#!/bin/bash
# Cài đặt và khởi động NGINX đơn giản

sudo apt-get update -y
sudo apt-get install nginx -y
sudo systemctl enable nginx
sudo systemctl start nginx

echo "<h1>Chào mừng đến với NGINX Server từ Terraform</h1>" | sudo tee /var/www/html/index.html

Triển Khai Mã Lệnh

Sau khi hoàn tất phần mã lệnh, hãy xuất bản mã lên GitHub và tiếp tục khởi tạo và thực hiện tệp cấu hình Terraform.

Mở command prompt hoặc shell, tùy thuộc vào hệ điều hành (Windows hoặc Linux), và chạy các lệnh sau:

terraform init

Lệnh này được sử dụng để khởi tạo thư mục làm việc và thiết lập mọi thứ mà Terraform cần để quản lý hạ tầng.

bash Copy
PS C:\Apps\Infra\sws-terraform> terraform init
Initializing the backend...
Initializing provider plugins...
- Finding hashicorp/aws versions matching "5.40.0"...
- Installing hashicorp/aws v5.40.0...
- Installed hashicorp/aws v5.40.0 (signed by HashiCorp)
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above.

terraform validate

Lệnh này được sử dụng để kiểm tra cú pháp và tính nhất quán nội bộ của các tệp cấu hình Terraform mà không cần truy cập vào bất kỳ dịch vụ từ xa nào như AWS.

bash Copy
PS C:\Apps\Infra\sws-terraform> terraform validate
Success! The configuration is valid.

terraform plan

Lệnh này được sử dụng để xem trước các thay đổi mà Terraform sẽ thực hiện đối với hạ tầng của chúng ta trước khi thực sự áp dụng chúng.

bash Copy
PS C:\Apps\Infra\sws-terraform> terraform plan

terraform apply

Đây là bước cuối cùng thực sự cấp phát hạ tầng cần thiết từ mã của chúng ta. Nó cũng yêu cầu sự xác nhận của chúng ta trước khi tiếp tục tạo các tài nguyên. Chúng ta phải nhập “yes” để tiếp tục hoặc chấp thuận các thay đổi; nếu không, quá trình sẽ dừng lại.

bash Copy
PS C:\Apps\Infra\sws-terraform> terraform apply

Truy Cập Web Server

Cuối cùng, chúng ta đã tạo thành công web server, và chúng ta đã nhận được URL DNS công khai như là đầu ra. Hãy thử truy cập nó từ trình duyệt. Chúng ta đã truy cập thành công web server và nhận được trang chủ mặc định của Nginx — tất cả chỉ trong chưa đầy 30 phút. 🎉

Phá Hủy Tài Nguyên

Lệnh terraform destroy được sử dụng để xóa tất cả hạ tầng mà Terraform đã tạo và hiện đang quản lý. Tương tự như lệnh terraform apply, chúng ta cần cung cấp sự chấp thuận của mình trước khi tiếp tục xóa các tài nguyên.

bash Copy
PS C:\Apps\Infra\sws-terraform> terraform destroy

Thực Hành Tốt Nhất

  • Sử Dụng Mã Nguồn Tái Sử Dụng: Tái sử dụng mã nguồn giúp tiết kiệm thời gian và công sức. Đảm bảo mã của bạn có thể sử dụng lại cho các dự án khác.
  • Theo Dõi Biến Số: Sử dụng biến để quản lý các giá trị khác nhau mà bạn có thể cần thay đổi giữa các môi trường khác nhau.

Những Cạm Bẫy Thường Gặp

  • Quên Xóa Tài Nguyên: Đôi khi bạn có thể quên xóa tài nguyên sau khi hoàn tất thử nghiệm, điều này có thể dẫn đến chi phí cao.
  • Cấu Hình Sai Tệp Terraform: Đảm bảo cấu hình chính xác để tránh gặp lỗi trong quá trình triển khai.

Mẹo Tối Ưu Hiệu Suất

  • Chọn Loại Instance Phù Hợp: Sử dụng loại EC2 phù hợp với yêu cầu của ứng dụng để đảm bảo hiệu suất tốt nhất.
  • Cấu Hình Nhóm Bảo Mật: Đảm bảo nhóm bảo mật được cấu hình đúng để bảo vệ tài nguyên của bạn khỏi các mối đe dọa bên ngoài.

Câu Hỏi Thường Gặp (FAQ)

1. Terraform có thể sử dụng cho những dịch vụ nào?
Terraform hỗ trợ nhiều dịch vụ cloud như AWS, Azure, Google Cloud, và nhiều dịch vụ khác.
2. Làm thế nào để kiểm tra cấu hình Terraform?
Sử dụng lệnh terraform validate để kiểm tra cấu hình của bạn trước khi áp dụng.

Kết Luận

Chúng ta đã hoàn thành việc xây dựng và triển khai một web server Nginx trên AWS bằng Terraform. Việc sử dụng Infrastructure as Code giúp bạn tiết kiệm thời gian và công sức, đồng thời tạo ra mã nguồn có thể tái sử dụng cho các dự án trong tương lai. Hãy theo dõi để không bỏ lỡ các dự án DevOps tiếp theo — và tiếp tục học hỏi, chia sẻ và phát triển nhé! 🙌

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào