0
0
Lập trình
NM

Tự động triển khai website trên AWS bằng Terraform

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

• 9 phút đọc

Tự động triển khai website trên AWS bằng Terraform

Giới thiệu

Bạn có bao giờ thắc mắc làm thế nào để triển khai một trang web trên đám mây mà không cần phải nhấp hàng trăm nút? Trong bài viết này, tôi sẽ hướng dẫn bạn cách sử dụng Terraform, một công cụ tuyệt vời cho phép bạn viết mã để xây dựng cơ sở hạ tầng trên các dịch vụ như AWS. Chúng ta sẽ triển khai một máy chủ web đơn giản, chạy một mẫu website đẹp và học hỏi một số khái niệm chính trong quá trình này.

Những gì bạn cần chuẩn bị

Trước khi bắt đầu, hãy đảm bảo bạn đã thiết lập một số thứ sau:

  • Terraform: Đây là công cụ chính mà chúng ta sẽ sử dụng. Bạn có thể tải xuống từ trang web chính thức.
  • AWS CLI: Công cụ này cho phép máy tính của bạn giao tiếp với tài khoản Amazon Web Services của bạn. Bạn cần cài đặt và thiết lập nó với thông tin xác thực của bạn.
  • Tài khoản AWS: Nếu bạn chưa có, bạn có thể đăng ký tài khoản miễn phí.

Cấu hình người dùng IAM cho Terraform

Trước khi bắt đầu viết mã Terraform, chúng ta cần đảm bảo rằng chúng ta đang kết nối với AWS một cách đúng đắn.
Mẹo chuyên nghiệp: 🚨 Không bao giờ sử dụng tài khoản root của AWS cho các dự án! Thay vào đó, chúng ta sẽ tạo một người dùng IAM riêng chỉ cho Terraform.

Các bước thực hiện:

  1. Đăng nhập vào AWS Console và mở IAM (Quản lý danh tính và quyền truy cập).
  2. Tạo một người dùng mới – gọi nó là terraform-user.
  3. Dưới loại quyền truy cập, chọn Programmatic access (điều này sẽ cung cấp cho bạn một Access Key ID và Secret Access Key).
  4. Thiết lập quyền: Để học tập, bạn có thể gán quyền AdministratorAccess (quyền truy cập đầy đủ). Nhưng trong thực tế, bạn chỉ nên cung cấp những quyền cần thiết.
  5. Tải xuống thông tin xác thực: Lưu tệp .csv với các khóa của bạn và giữ nó an toàn!
  6. Cấu hình AWS CLI để Terraform biết cách kết nối. Chạy lệnh sau trong terminal:
    bash Copy
    aws configure
    Sau đó nhập:
    • Access Key ID
    • Secret Access Key
    • Default region: us-east-1
    • Output format: json

Bước 1: Thiết lập thư mục dự án

Trước tiên, hãy tổ chức lại! Tạo một thư mục mới cho dự án của bạn trên máy tính. Tôi sử dụng vscode (nó dễ dàng hơn để thiết lập các dự án với nó). Trong thư mục này, bạn sẽ tạo ra một số tệp. Dưới đây là danh sách các tệp bạn cần:

  • provider.tf
  • vars.tf
  • keypair.tf
  • secgrp.tf
  • instance.tf
  • web.sh

Bước 2: Cho Terraform biết sử dụng AWS (provider.tf)

Tệp này giống như một lời giới thiệu. Nó cho Terraform biết, "Này, chúng ta sẽ làm việc với AWS, và chúng ta sẽ ở khu vực miền Đông Hoa Kỳ (N. Virginia)." Chỉ cần sao chép mã sau vào tệp provider.tf.

hcl Copy
provider "aws" {
  region = var.region
}

Bước 3: Tổ chức mã với biến (vars.tf)

Thay vì nhập những thứ như "us-east-1" nhiều lần, chúng ta có thể sử dụng biến. Điều này làm cho mã của bạn sạch hơn và dễ thay đổi sau này. Tệp này xác định nơi tài nguyên của bạn sẽ sống và loại máy chủ mà chúng ta sẽ sử dụng. Sao chép mã này vào vars.tf.

hcl Copy
variable "region" {
  default = "us-east-1"
}

variable "zone1" {
  default = "us-east-1a"
}

variable "webuser" {
  default = "ubuntu"
}

variable "amiID" {
  type = map(any)
  default = {
    us-east-2 = "ami-0cfde0ea8edd312d4"
    us-east-1 = "ami-0360c520857e3138f"
  }
}

Bước 4: Tạo một khóa để khóa và mở khóa máy chủ của bạn (keypair.tf và dovekey.pub)

Để đăng nhập vào máy chủ của bạn một cách an toàn, bạn cần một khóa đặc biệt. Đây là một quy trình tiêu chuẩn gọi là SSH. Mở terminal của bạn và tạo một cặp khóa của riêng bạn. Bạn có thể sử dụng lệnh sau trong terminal:

bash Copy
ssh-keygen

Nó sẽ hỏi bạn nhập đường dẫn tệp: đặt tên cho khóa; nhấn enter.

Điều này sẽ tạo ra hai tệp: dovekey (khóa riêng của bạn) và dovekey.pub (khóa công khai của bạn). Giữ khóa riêng an toàn! Sao chép toàn bộ nội dung của tệp dovekey.pub mới của bạn vào một tệp có cùng tên. Bây giờ, tạo một tệp có tên keypair.tf để thông báo cho AWS nhận biết khóa công khai của bạn.

hcl Copy
resource "aws_key_pair" "dove-key" {
  key_name   = "dove-key"
  public_key = file("dovekey.pub")
}

Bước 5: Thiết lập tường lửa cho máy chủ của bạn (secgrp.tf)

Hãy nghĩ về nhóm bảo mật như một người bảo vệ kỹ thuật số cho máy chủ của bạn. Nó quyết định ai được vào và ai không. Nhóm bảo mật của chúng ta sẽ cho phép:

  • SSH (cổng 22): Chỉ từ máy tính của bạn. Điều quan trọng: Bạn phải thay đổi địa chỉ IP 197.211.58.41/32 thành địa chỉ IP của bạn. Một tìm kiếm nhanh cho "my ip" trên Google sẽ cho bạn biết.
  • HTTP (cổng 80): Từ bất kỳ đâu trên thế giới để mọi người có thể thấy trang web của bạn.
  • Tất cả lưu lượng outbound: Máy chủ của bạn sẽ có thể kết nối với internet để tải xuống cập nhật và tệp.
    Sao chép mã này vào secgrp.tf.
hcl Copy
resource "aws_security_group" "dove-sg" {
  name        = "dove-sg"
  description = "dove-sg"
  tags = {
    Name = "dove-sg"
  }
}

resource "aws_vpc_security_group_ingress_rule" "ssh-from-my-ip" {
  security_group_id = aws_security_group.dove-sg.id
  cidr_ipv4         = "197.211.58.41/32"
  from_port         = 22
  ip_protocol       = "tcp"
  to_port           = 22
}

resource "aws_vpc_security_group_ingress_rule" "allow_http" {
  security_group_id = aws_security_group.dove-sg.id
  cidr_ipv4         = "0.0.0.0/0"
  from_port         = 80
  ip_protocol       = "tcp"
  to_port           = 80
}

resource "aws_vpc_security_group_egress_rule" "allow_all_outbound_ipv4" {
  security_group_id = aws_security_group.dove-sg.id
  cidr_ipv4         = "0.0.0.0/0"
  ip_protocol       = "-1"
}

Bước 6: Tạo máy chủ! (instance.tf)

Đây là sự kiện chính. Tệp này cho Terraform biết tạo một máy chủ AWS (một EC2 instance) và liên kết nó với cặp khóa và nhóm bảo mật mà chúng ta vừa định nghĩa. Phần đặc biệt ở đây là các khối provisioner. Chúng cho Terraform biết để:

  • Tải lên tệp web.sh của chúng ta vào máy chủ.
  • Đăng nhập vào máy chủ qua SSH.
  • Chạy kịch bản web.sh để cài đặt trang web của chúng ta!
hcl Copy
resource "aws_instance" "web" {
  ami                    = var.amiID[var.region]
  instance_type          = "t3.micro"
  key_name               = "dove-key"
  vpc_security_group_ids = [aws_security_group.dove-sg.id]
  availability_zone      = var.zone1

  tags = {
    Name    = "Dove-web"
    project = "Dove"
  }

  provisioner "file" {
    source      = "web.sh"
    destination = "/tmp/web.sh"
  }

  connection {
    type        = "ssh"
    user        = var.webuser
    private_key = file("dovekey")
    host        = self.public_ip
  }

  provisioner "remote-exec" {
    inline = [
      "chmod +x /tmp/web.sh",
      "sudo /tmp/web.sh"
    ]
  }
}

Bước 7: Kịch bản "ma thuật" (web.sh)

Kịch bản đơn giản này thực sự cài đặt một máy chủ web (Apache) và đặt một trang web lên đó. Nó tải xuống một mẫu trang web miễn phí (tôi đã sử dụng một mẫu từ top plate.com), giải nén nó và sao chép tất cả các tệp vào vị trí đúng.

bash Copy
#!/bin/bash
apt update
apt install wget unzip apache2 -y
systemctl start apache2
systemctl enable apache2
wget https://www.tooplate.com/zip-templates/2117_infinite_loop.zip
unzip -o 2117_infinite_loop.zip
cp -r 2117_infinite_loop/* /var/www/html/
systemctl restart apache2

Bước 9: Lấy thông tin chi tiết của máy chủ mới của bạn (outputs.tf)

Đây là nơi chúng ta cho Terraform biết hiển thị thông tin quan trọng nhất sau khi mọi thứ đã được tạo ra. Điều này giúp bạn dễ dàng tìm thấy trang web mới của mình. Tạo một tệp mới có tên outputs.tf và thêm mã sau:

hcl Copy
output "instance_id" {
  description = "ID của EC2 instance"
  value       = aws_instance.web.id
}

output "public_ip" {
  description = "Địa chỉ IP công cộng của EC2 instance"
  value       = aws_instance.web.public_ip
}

Bước 10: Lưu ý quan trọng về tệp trạng thái

Khi bạn chạy Terraform, nó sẽ tạo ra các tệp như terraform.tfstateterraform.tfstate.backup. Những tệp này rất quan trọng vì chúng giữ một bản ghi của mọi thứ mà Terraform đã tạo. Không bao giờ commit những tệp này vào Git! Chúng có thể chứa thông tin nhạy cảm và gây ra vấn đề lớn nếu bạn làm việc với một nhóm. Để ngăn chặn điều này, hãy tạo một tệp trong thư mục dự án của bạn có tên .gitignore và thêm các dòng sau:

plaintext Copy
## Terraform
.terraform/
*.tfstate
*.tfstate.backup

Bước 11: Chạy mã của bạn!

Giờ là phần thú vị! Mở terminal của bạn, vào thư mục dự án và chạy các lệnh sau một cách lần lượt:

  • Khởi tạo Terraform: terraform init - khởi động Terraform của bạn.
  • Định dạng lại mã: terraform fmt - sửa định dạng tệp của bạn.
  • Kiểm tra cấu hình: terraform validate - kiểm tra nếu cấu hình của bạn có lỗi cú pháp.
  • Lập kế hoạch: terraform plan - hiển thị những thay đổi sẽ được áp dụng.
  • Áp dụng kế hoạch: terraform apply - áp dụng kế hoạch (và theo dõi phép màu xảy ra!).

Khi được nhắc, gõ yes và nhấn Enter. Terraform sẽ xây dựng mọi thứ cho bạn.

Bước 12: Kiểm tra!

Khi quá trình hoàn tất, bạn sẽ thấy các thông tin đầu ra mà bạn đã định nghĩa! Chỉ cần sao chép giá trị public_ip và dán vào trình duyệt web của bạn. Bạn sẽ thấy trang web mới của mình!

Bước 13: Dọn dẹp!

Để tránh bị tính phí bởi AWS, đây là thói quen tốt để dọn dẹp các tài nguyên khi bạn đã xong. Chỉ cần chạy lệnh đơn giản này:

bash Copy
tf destroy

Điều này sẽ xóa bỏ mọi thứ bạn đã tạo. Tất cả đã biến mất! Và đó là tất cả!

Thực hành tốt nhất

  • Luôn luôn kiểm tra và xác thực mã Terraform trước khi áp dụng.
  • Sử dụng IAM user thay vì root user để bảo mật tốt hơn.
  • Đặt cấu hình AWS CLI để dễ dàng quản lý.

Câu hỏi thường gặp (FAQ)

Terraform là gì?

Terraform là một công cụ Infrastructure as Code (IaC) cho phép bạn quản lý hạ tầng với mã.

Tôi có cần một tài khoản AWS để sử dụng Terraform không?

Có, bạn cần một tài khoản AWS để triển khai tài nguyên.

Có cách nào để tự động hóa việc dọn dẹp tài nguyên không?

Có, bạn có thể sử dụng script để tự động hóa việc dọn dẹp tài nguyên sau khi hoàn thành.

Kết luận

Việc triển khai website trên AWS bằng Terraform không chỉ giúp bạn tiết kiệm thời gian mà còn giúp bạn học hỏi nhiều hơn về quản lý hạ tầng. Hãy thử nghiệm với mã và điều chỉnh cho phù hợp với nhu cầu của bạn. Nếu bạn có bất kỳ câu hỏi nào, hãy để lại ở phần bình luận bên dưới!

Hãy bắt đầu hành trình triển khai của bạn ngay hôm nay!

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