# Terraform

* [Terraform]()

* Sample terraform `main.tf`

  ```terraform
  providers "aws" {
  	region = ""
      access_key = ""
      secret_key = ""
      
  }
  
  # 1. create VPC
  resource "aws_vpc" "main" {
      cidr_block = "10.0.0.0/16"
  }
  
  # 2. Create Internet Gateway
  resource "aws_internet_gateway" "gw" {
      vpc_id = aws_vpc.prod-vpc.id
  }
  
  # 3. Create Custom Route Table
  resource "aws_route_table" "prod-route-table" {
    vpc_id = aws_vpc.prod-vpc.id
  
    route {
      cidr_block = "0.0.0.0/0"
      gateway_id = aws_internet_gateway.gw.id
    }
  
    route {
      ipv6_cidr_block        = "::/0"
      gateway_id = aws_internet_gateway.gw.id
    }
  
    tags = {
      Name = "Prod"
    }
  }
  
  # 4. Create subnet
  resource "aws_subnet" "subnet-1" {
  	vpc_id = aws_vpc.prod-vpc.id 
      cidr_block = "10.0.1.0/24"
      availability_zone = "us-east-1a"
      
      tags = {
          Name = "prod-subnet"
      }
  }
  
  # 5. Associate subnet to route table
  resource "aws_route_table_association" "a" {
      subnet_id = aws_subnet.subnet-1.id
      route_table_id = aws_route_table.prod-route-table.id
  }
  
  # 6. Create Security Group
  resource "aws_security_group" "allow_web" {
    name        = "allow_tls"
    description = "Allow TLS inbound traffic"
    vpc_id      = aws_vpc.prod-vpc.id
  
    ingress {
      description      = "HTTPS"
      from_port        = 443
      to_port          = 443
      protocol         = "tcp"
      cidr_blocks      = ["0.0.0.0/0"]
  
    }
      
    ingress {
      description      = "HTTP"
      from_port        = 80
      to_port          = 80
      protocol         = "tcp"
      cidr_blocks      = ["0.0.0.0/0"]
  
    }
  
    ingress {
      description      = "SSH"
      from_port        = 22
      to_port          = 22
      protocol         = "-1"
      cidr_blocks      = ["0.0.0.0/0"]
  
    }
      
    egress {
      from_port        = 0
      to_port          = 0
      protocol         = "-1"
      cidr_blocks      = ["0.0.0.0/0"]
      ipv6_cidr_blocks = ["::/0"]
    }
  
    tags = {
      Name = "allow_web"
    }
  }
  
  # 7. Create network interface
  resource "aws_network_interface" "web-server-nic" {
    subnet_id       = aws_subnet.subnet-1.id
    private_ips     = ["10.0.1.50"]
    security_groups = [aws_security_group.allow_web.id]
  
  }
  
  # 8. Elastic IP
  resource "aws_eip" "lb" {
    vpc      = true
    instance = aws_instance.web-server-nic.id
    associate_with_private_ip = "10.0.1.50"
    depends_on = [aws_internet_gateway.gw]
  }
  
  # 9. Create ubuntu server
  resource "aws_instance" "web-server-instance" {
      ami = ""
      instance_type = "t2.micro"
      availability_zone = "us-east-1a"
      key_name = "main-key"
      
      network_interface {
          device_index = 0
          network_interface_id = aws_network_interface.web-server-nic.id
      }
      
      user_data = <<-EOF
  				#!/bin/bash
  				sudo apt update -y
  				sudo apt install apache2 -y
  				sudo systemctl start apache2
  				sudo bash -c 'echo your very first web server > /var/www/html/index.html'
  				EOF
  	tags = {
  		Name = "web-server"
  	}
  }
  
  # console log value
  output "server_private_ip" {
  	value = aws_instance.web-server-instance.private_ip
  }
  ```

  

* Commands

  ```bash
  $ terraform init
  
  $ terraform apply --auto-approve
  $ terraform apply [-target <instance>]
  
  $ terraform destroy
  $ terraform destroy [-target <instance>]
  
  $ terraform state list
  
  $ terraform state show <name>
  
  $ terraform refresh
  
  $ terraform output
  ```

  

* variable. `terraform.tfvars`

  ```terraform variable
  
  # string variable
  subnet_prefix = "10.0.200.0/24"
  
  # list of objects
  subnet_prefix = [{cidr_block = "10.0.1.0/24", name="subnet-1"}, {cidr_block = "10.0.2.0/64", name= "subnet-2"}]
  ```

  

* 