Saturday, January 18, 2025

Triển khai Webserver trên AWS bằng Terraform sử dụng biến Var

-

Tổng quan.

Đây là ví dụ về Terraform file trên AWS (Amazon Web Services) triển khai một máy chủ web đơn trên AWS (Amazon Web Services). Máy chủ web trả về chuỗi “Hello, World” và lắng nghe trên cổng 8080, được xác định là một biến var. Ví dụ này sử dụng Terraform AWS Provider để tương tác với nhiều tài nguyên được hỗ trợ bởi AWS thông qua các API của nó và ví dụ này triển khai trên Terraform phiên bản 0.10.x.

Cấu hình các khóa truy cập AWS của bạn.

Vì lý do bảo mật, nên sử dụng người dùng IAM thay vì tài khoản gốc để truy cập vào AWS.

Cấu hình thông tin xác thực AWS để sử dụng bởi Terraform có thể được thực hiện theo nhiều cách khác nhau, nhưng đây là những cách tiếp cận được khuyến khích:

Cách 1: Cài đặt thông tin xác thực AWS trên hệ thống local của bạn, đối với Linux, macOS hoặc Unix:

~/.aws/credentials

Hoặc đối với Windows nằm tại.

C:\Users\USERNAME\.aws\credentials

File này nên chứa các dòng theo định dạng dưới, lưu ý hãy thay thế các giá trị thông tin xác thực AWS của bạn vào các giá trị <your_access_key_id> và <your_secret_access_key> trong file.

[default]
aws_access_key_id = <your_access_key_id>
aws_secret_access_key = <your_secret_access_key>

Cách 2: Đặt các biến môi trường AWS_ACCESS_KEY_ID và AWS_SECRET_ACCESS_KEY.

Để đặt các biến này trên Linux, macOS hoặc Unix, sử dụng lệnh export:

export AWS_ACCESS_KEY_ID=<your_access_key_id>
export AWS_SECRET_ACCESS_KEY=<your_secret_access_key>

Đối với windows hãy sử dụng set:

set AWS_ACCESS_KEY_ID=<your_access_key_id>
set AWS_SECRET_ACCESS_KEY=<your_secret_access_key>

Tạo file Terraform.

Đoạn code dưới là một ví dụ về việc triển khai một web server trên AWS sử dụng Terraform và sử dụng biến đầu vào (input variable).

Đầu tiên, một AWS provider được cấu hình với khu vực là “eu-west-1”. Tiếp theo, một Security Group được tạo để bảo mật cho instance EC2 với tên là “terraform-example-instance”. Security Group cho phép kết nối đến port của máy chủ (HTTP port được đặt thành biến đầu vào), và cho phép kết nối từ tất cả các địa chỉ IP.

Sau đó, một EC2 instance được triển khai với AMI ID là “ami-785db401” và kích thước instance là “t2.micro”. Máy chủ này được gắn với Security Group được tạo trước đó. Mã nguồn dùng để cấu hình instance cho phép máy chủ trả về chuỗi “Hello, World” khi truy cập vào URL “/”. Bước cuối cùng, một biến đầu ra được định nghĩa để trả về địa chỉ IP công khai của instance.

Cuối cùng, một biến đầu vào “server_port” được định nghĩa, cho phép người dùng tùy chỉnh cổng được sử dụng bởi máy chủ. Giá trị mặc định của biến là “8080”, nếu người dùng không cung cấp giá trị khác.

Đầu tiên chúng ta tạo file main.tf

# Configure the AWS provider
provider "aws" {
  region = "eu-west-1"
}

# Create a Security Group for an EC2 instance 
resource "aws_security_group" "instance" {
  name = "terraform-example-instance"
  
  ingress {
    from_port	  = "${var.server_port}"
    to_port	    = "${var.server_port}"
    protocol	  = "tcp"
    cidr_blocks	= ["0.0.0.0/0"]
  }
}

# Create an EC2 instance
resource "aws_instance" "example" {
  ami			                = "ami-785db401"
  instance_type           = "t2.micro"
  vpc_security_group_ids  = ["${aws_security_group.instance.id}"]
  
  user_data = <<-EOF
	      #!/bin/bash
	      echo "Hello, World" > index.html
	      nohup busybox httpd -f -p "${var.server_port}" &
	      EOF
			  
  tags {
    Name = "terraform-example"
  }
}

File outputs.tf

# Output variable: Public IP address
output "public_ip" {
  value = "${aws_instance.example.public_ip}"
}

File vars.tf

# Input variable: server port
variable "server_port" {
  description = "The port the server will use for HTTP requests"
  default = "8080"
}

Sau khi đoạn code được cấu hình, có thể sử dụng các lệnh Terraform như terraform init, terraform plan, và terraform apply để triển khai instance và Security Group trên AWS.

Chi phí

Nếu triển khai đoạn code trên và sau đó xoá nó, sẽ có một số chi phí phát sinh. Cụ thể, khi triển khai các tài nguyên AWS, bạn sẽ bị tính phí cho việc sử dụng các tài nguyên này cho đến khi bạn xoá chúng. Ví dụ:

  • EC2 instance: chi phí tính theo giờ cho việc sử dụng instance. Do đó, nếu bạn chạy instance này trong một giờ, bạn sẽ bị tính phí cho một giờ sử dụng.
  • Elastic IP: chi phí tính theo giờ cho việc sử dụng Elastic IP, và bạn sẽ bị tính phí cho mỗi giờ mà IP được liên kết với tài nguyên AWS nào đó.
  • Security group: không tính phí nếu bạn chỉ tạo security group, nhưng nếu bạn liên kết nó với các tài nguyên khác (ví dụ: EC2 instance), bạn sẽ bị tính phí cho việc sử dụng security group này.

Chúng ta hãy nhắc lại cách tính phí của Elastic IP:

Vì Elastic IP (EIP) là một IP tĩnh dành riêng cho các tài nguyên của khách hàng trên AWS. AWS sẽ tính phí cho khách hàng khi sử dụng Elastic IP.

Elastic IP được cung cấp miễn phí trong trường hợp nó được gắn vào một EC2 instance đang chạy. Nguyên nhân là để khuyến khích người dùng sử dụng Elastic IP theo cách đúng đắn và giúp tối ưu chi phí cho người dùng.

Tuy nhiên, nếu Elastic IP được gắn vào một instance nhưng không được sử dụng, AWS sẽ tính phí cho việc sở hữu Elastic IP đó. Do đó, để tối ưu chi phí, nếu không sử dụng Elastic IP, bạn nên giải phóng nó bằng cách gắn IP của EC2 instance vào thay vì Elastic IP.

Cụ thể, AWS tính phí cho Elastic IP theo công thức:

Phí Elastic IP = số giờ sử dụng trong tháng x giá Elastic IP đóng băng

Trong đó, giá Elastic IP đóng băng sẽ phụ thuộc vào khu vực sử dụng, có thể xem thông tin giá tại đây: https://aws.amazon.com/ec2/pricing/on-demand/

Như vậy khi bạn triển khai các tài nguyên AWS thông qua Terraform, bạn sẽ phải trả tiền cho việc sử dụng các tài nguyên này. Tuy nhiên, chi phí sẽ phụ thuộc vào thời gian sử dụng và loại tài nguyên mà bạn triển khai. Nếu bạn xoá các tài nguyên này sau khi sử dụng, bạn sẽ không bị tính phí cho việc sử dụng chúng nữa.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories