Scaling là quá trình thêm hoặc loại bỏ tài nguyên để phù hợp với các yêu cầu thay đổi của ứng dụng của bạn. Khi ứng dụng của bạn phát triển, bạn sẽ cần thêm nhiều tài nguyên hơn để xử lý tải lớn hơn. Và khi tải giảm, bạn có thể loại bỏ các tài nguyên thêm để tiết kiệm chi phí.
Terraform làm cho việc mở rộng cơ sở hạ tầng của bạn trở nên dễ dàng bằng cách cung cấp một cách khai báo để xác định các tài nguyên của bạn. Bạn có thể xác định số lượng tài nguyên bạn cần và Terraform sẽ tự động tạo ra hoặc hủy bỏ các tài nguyên theo cần.
Prerequisites
Trước khi tiếp tục, chúng ta phải thiết lập AWS Provider, Region, VPC, InternetGateway, Security Group, and RouteTable.
📁 terraform/terraform-aws
--📄 terraform.tf
--📄 provider.tf
--📄 vpc.tf
--📄 subnet.tf
--📄 internetgateway.tf
--📄 routetable.tf
--📄 securitygroup.tf
Tạo một tệp terraform.tf để khai báo các nhà cung cấp AWS cần thiết cho hệ thống.
terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 4.0" } } }
Tạo một file provider.tf để chỉ định khu vực AWS cần thiết cho các instance
provider "aws" { region = "us-east-1" }
Tạo một file vpc.tf để thiết lập VPC cho các instance EC2
resource "aws_vpc" "main" { cidr_block = "10.0.0.0/16" tags = { Name = "main" } }
Trong tệp subnet.tf, tạo 2 subnet public.
resource "aws_subnet" "public_subnet_1a" { vpc_id = aws_vpc.main.id cidr_block = "10.0.16.0/20" availability_zone = "us-east-1a" tags = { Name = "public-subnet-1" } } resource "aws_subnet" "public_subnet_1b" { vpc_id = aws_vpc.main.id cidr_block = "10.0.32.0/20" availability_zone = "us-east-1b" tags = { Name = "public-subnet-2" } }
Tạo file internetgateway.tf để cấu hình Internet Gateway
resource "aws_internet_gateway" "gw" { vpc_id = aws_vpc.main.id tags = { Name = "internet-getway" } }
Tạo file routetable.tf để định tuyến các subnet public đến VPC
resource "aws_route_table" "route_table" { vpc_id = aws_vpc.main.id route { cidr_block = "0.0.0.0/0" gateway_id = aws_internet_gateway.gw.id } tags = { Name = "route_table" } } resource "aws_route_table_association" "public_subnet_association_1a" { subnet_id = aws_subnet.public_subnet_1a.id route_table_id = aws_route_table.route_table.id } resource "aws_route_table_association" "public_subnet_association_1b" { subnet_id = aws_subnet.public_subnet_1b.id route_table_id = aws_route_table.route_table.id }
Tạo một tệp securitygroup.tf sẽ tạo một Security Group cho phép SSH, HTTP, HTTPS và lưu lượng egress tới các instance.
resource "aws_security_group" "web_server" { name_prefix = "web-server-sg" vpc_id = aws_vpc.main.id ingress { from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } ingress { from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } ingress { from_port = 443 to_port = 443 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"] } }
Bây giờ hãy tạo một file main.tf. Trong main.tf của bạn, thêm code sau để tạo một Auto Scale Group.
resource "aws_launch_configuration" "web_server_as" { image_id = "ami-053b0d53c279acc90" instance_type = "t2.micro" security_groups = [aws_security_group.web_server.id] user_data = <<-EOF #!/bin/bash sudo apt-get update -y sudo apt-get install apache2 -y sudo systemctl start apache2 sudo systemctl enable apache2 sudo systemctl restart apache2 sudo chmod 766 /var/www/html/index.html sudo echo "<html><body><h1>Welcome to Terraform Scaling.</h1></body></html>" >/var/www/html/index.html EOF } resource "aws_elb" "web_server_lb"{ name = "web-server-lb" security_groups = [aws_security_group.web_server.id] subnets = [aws_subnet.public_subnet_1a.id,aws_subnet.public_subnet_1b.id] listener { instance_port = 8000 instance_protocol = "http" lb_port = 80 lb_protocol = "http" } tags = { Name = "terraform-elb" } } resource "aws_autoscaling_group" "web_server_asg" { name = "web-server-asg" launch_configuration = aws_launch_configuration.web_server_as.name min_size = 1 max_size = 3 desired_capacity = 2 health_check_type = "EC2" load_balancers = [aws_elb.web_server_lb.name] vpc_zone_identifier = [aws_subnet.public_subnet_1a.id, aws_subnet.public_subnet_1b.id] }
Run
terraform init
command which will initialize and provide all prerequisite plugins.Now execute
terraform plan
commandRun
terraform apply
to create the Auto Scaling Grou