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.