Criando rede VPC na AWS com Terraform

Criando rede VPC na AWS com Terraform

Dando sequência no artigo anterior, onde falamos sobre os componentes de uma VPC e mostramos como criar uma através do manegement console da AWS, neste mostraremos como criar uma VPC através do terraform.

Para conseguir criar o recurso através do terraform na AWS, você deve ter acesso a uma conta com acesso programático, para poder utilizar as access keys e acessar via CLI.

Neste exemplo usaremos os seguintes componentes através do VS Code, conforme imagem:

 

 

1) O arquivo main.tf, é onde informamos o provedor dos recursos que serão criados, nesse caso a AWS, a região que os recursos ficarão alocados e as chaves de acesso para permitir a criação dos recursos na conta desejada. Segue exemplo do código do arquivo main.tf, conforme abaixo:

provider "aws" {
  region      = "us-east-1"
  access_key  = ""
  secret_key  = ""
}

 

2) O arquivo variables.tf, é onde informamos todas a variáveis utilizadas no código de criação dos recursos. Segue exemplo do código do arquivo variables.tf, conforme abaixo:

variable "region" {
     default = "us-east-1"
}
variable "availabilityZone" {
     default = "us-east-1a"
}
variable "instanceTenancy" {
    default = "default"
}
variable "dnsSupport" {
    default = true
}
variable "dnsHostNames" {
    default = true
}
variable "vpcCIDRblock" {
    default = "10.0.0.0/16"
}
variable "publicsCIDRblock" {
    default = "10.0.1.0/24"
}
variable "privatesCIDRblock" {
    default = "10.0.2.0/24"
}
variable "publicdestCIDRblock" {
    default = "0.0.0.0/0"
}
variable "localdestCIDRblock" {
    default = "10.0.0.0/16"
}
variable "ingressCIDRblock" {
    type = list
    default = [ "0.0.0.0/0" ]
}
variable "egressCIDRblock" {
    type = list
    default = [ "0.0.0.0/0" ]
}
variable "mapPublicIP" {
    default = true
}

 

3) O arquivo vcp.tf, é onde criamos uma VPC com subnet, network ACL, internet gateway e route table. Ao longo do artigo explicaremos cada bloco deste arquivo, segue exemplo do código abaixo:

resource "aws_vpc" "VPC_teste" {
  cidr_block           = var.vpcCIDRblock
  instance_tenancy     = var.instanceTenancy 
  enable_dns_support   = var.dnsSupport 
  enable_dns_hostnames = var.dnsHostNames
tags = {
    Name = "VPC teste"
}
} 

resource "aws_subnet" "Public_subnet" {
  vpc_id                  = aws_vpc.VPC_teste.id
  cidr_block              = var.publicsCIDRblock
  map_public_ip_on_launch = var.mapPublicIP 
  availability_zone       = var.availabilityZone
tags = {
   Name = "Public subnet"
}
}

resource "aws_network_acl" "Public_NACL" {
  vpc_id = aws_vpc.VPC_teste.id
  subnet_ids = [ aws_subnet.Public_subnet.id ]

  ingress {
    protocol   = "tcp"
    rule_no    = 100
    action     = "allow"
    cidr_block = var.publicdestCIDRblock 
    from_port  = 22
    to_port    = 22
  }
  
 
  egress {
    protocol   = "tcp"
    rule_no    = 100
    action     = "allow"
    cidr_block = var.publicdestCIDRblock
    from_port  = 22 
    to_port    = 22
  }
  
tags = {
    Name = "Public NACL"
}
}

resource "aws_internet_gateway" "IGW_teste" {
 vpc_id = aws_vpc.VPC_teste.id
 tags = {
        Name = "Internet gateway teste"
}
} 

resource "aws_route_table" "Public_RT" {
 vpc_id = aws_vpc.VPC_teste.id
 tags = {
        Name = "Public Route table"
}
} 

resource "aws_route" "internet_access" {
  route_table_id         = aws_route_table.Public_RT.id
  destination_cidr_block = var.publicdestCIDRblock
  gateway_id             = aws_internet_gateway.IGW_teste.id
}

resource "aws_route_table_association" "Public_association" {
  subnet_id      = aws_subnet.Public_subnet.id
  route_table_id = aws_route_table.Public_RT.id
}

 

 

Criando VPC

1) Neste bloco de código estamos criando nossa VPC. Na primeira linha é onde se define o tipo de recurso a ser criado, no nosso caso “aws_vpc” e depois informamos o nome, depois passamos os dados dessa VPC que são: bloco CIDR, instance tenancy e habilitamos suporte DNS e DNS Hostname suporte. Por fim é possível adicionar tag ao recurso. Conforme código abaixo:

resource "aws_vpc" "VPC_teste" {
  cidr_block           = var.vpcCIDRblock
  instance_tenancy     = var.instanceTenancy 
  enable_dns_support   = var.dnsSupport 
  enable_dns_hostnames = var.dnsHostNames
tags = {
    Name = "VPC teste"
}
}

 

 

Criando subnet

1) Neste bloco de código estamos criando uma subnet. Na primeira linha informamos o recurso a ser criado “aws_subnet” e o nome, depois passamos as informações da subnet, como: VPC que ela fará parte através do vpc_id, bloco CIDR, map_public_ip_on_launch que é onde habilitamos a atribuição de IP público e a availability zone que ela ficará alocada. Conforme código abaixo:

resource "aws_subnet" "Public_subnet" {
  vpc_id                  = aws_vpc.VPC_teste.id
  cidr_block              = var.publicsCIDRblock
  map_public_ip_on_launch = var.mapPublicIP 
  availability_zone       = var.availabilityZone
tags = {
   Name = "Public subnet"
}
}

 

 

Criando e configurando NACL

1) Neste bloco de código é onde criamos a NACL e definimos as regras de entrada e saída. No primeiro trecho deste código informamos o recurso a ser criado “aws_network_acl”, nome da NACL, VPC que vai fazer parte atráves do vpc_id e subnet que fará parte através do subnet_ids. Conforme código abaixo:

2) No segundo trecho deste código configuramos a regra de entrada, para isso devemos passar o parâmetro ingress e em seguida informar: protocolo, número da regra, ação que seria permitir ou negar, bloco CIDR e as portas. No terceiro informamos as mesmas informações, mas com o parâmetro egress, que é a regra de saída e por fim, podemos adicionar a tag. Conforme no código abaixo:

resource "aws_network_acl" "Public_NACL" {
  vpc_id = aws_vpc.VPC_teste.id
  subnet_ids = [ aws_subnet.Public_subnet.id ]

  ingress {
    protocol   = "tcp"
    rule_no    = 100
    action     = "allow"
    cidr_block = var.publicdestCIDRblock 
    from_port  = 22
    to_port    = 22
  }
  

  egress {
    protocol   = "tcp"
    rule_no    = 100
    action     = "allow"
    cidr_block = var.publicdestCIDRblock
    from_port  = 22 
    to_port    = 22
  }
}

 

 

Criando Internet Gateway

1) Neste bloco de código é onde criamos o gateway de internet. Para isso devemos informar o recurso “aws_internet_gateway”, nome, depois a VPC que fará parte e por fim é possível adicionar uma tag. Conforme código abaixo:

resource "aws_internet_gateway" "IGW_teste" {
 vpc_id = aws_vpc.VPC_teste.id
 tags = {
        Name = "Internet gateway teste"
}
}

 

 

Criando route table

1) Neste bloco de código é onde criamos uma route table. Para isso definimos o recurso “aws_route_table” e informamos o nome, depois informamos a VPC que ela fará parte através do vpc_id e podemos adicionar uma tag. Conforme código abaixo:

resource "aws_route_table" "Public_RT" {
 vpc_id = aws_vpc.VPC_teste.id
 tags = {
        Name = "Public Route table"
}
}

 

 

Criando rota para internet

1) Neste bloco de código é onde configuramos a rota da route table para a internet, apontando para um gateway de internet. Para isso devemos informar o recurso a ser criado, nesse caso é “aws_route” e informamos também o nome, em seguida devemos informar a route table que terá a rota criada com o route_table_id, o IP ou bloco CIDR e por fim o destino dessa rota. Conforme código abaixo:

resource "aws_route" "internet_access" {
  route_table_id         = aws_route_table.Public_RT.id
  destination_cidr_block = var.publicdestCIDRblock
  gateway_id             = aws_internet_gateway.IGW_teste.id
}

 

 

Associando route table a subnet

1) Neste bloco de código é onde associamos a route table a uma subnet para atribuir as rotas de acesso. Para isso devemos informar o recurso “aws_route_table_association”, depois o nome. Em seguida informamos a subnet com o subnet_id e a route table com o route_table_id.

resource "aws_route_table_association" "Public_association" {
  subnet_id      = aws_subnet.Public_subnet.id
  route_table_id = aws_route_table.Public_RT.id
}

 

 

Execução de código e criação de VPC

1) Realizamos a execução do comando terraform plan -out plano que gerou o plano das alterações que o código terraform vai gerar, no nosso caso a adição de 8 recursos. Conforme imagem:

 

2) Após finalizar o exame anterior, devemos aplicar o plano criado, para isso devemos utilizar o comando terraform apply "plano" que irá aplicar essas criações de recurso na conta da AWS, no nosso caso a adição de 8 recursos foi realizada com sucesso. Conforme imagem abaixo:

 

3) Feito isso, para confirmar a criação basta acessar o console e verificar se foi criada a nova VPC, no nosso caso foi criada com sucesso. Conforme imagem abaixo:

 

 

Testando EC2 instance dentro da VPC

Para testarmos o funcionamento da VPC e das regras que passamos, realizaremos teste de acesso, pois neste exemplo liberamos apenas entrada e saída de pacote SSH.

1) Criamos uma instância dentro da VPC recém criada, conforme imagem.

 

2) Teste de acesso via SSH realizado com sucesso, conforme imagem:

 

Neste artigo mostramos como criar uma rede VPC na AWS utilizando terraform, seguiremos trazendo mais conteúdo sobre AWS. Esperamos que tenham gostado, até o próximo.

Deixe uma resposta