Complete Terraform - part 5

Complete Terraform - part 5

·

3 min read

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
  1. 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"
          }
        }
      }
    
  2. 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"
      }
    
  3. 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"
        }
      }
    
  4. 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"
        }
      }
    
  5. 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"
        }
      }
    
  6. 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
      }
    
  7. 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"] 
         } 
      }
    
  8. 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]
     }
    
  9. Run terraform init command which will initialize and provide all prerequisite plugins.

  10. Now execute terraform plan command

  11. Run terraform apply to create the Auto Scaling Grou