tf/ec2/

Esse Ć© o mĆ³dulo responsĆ”vel pela criaĆ§Ć£o de instĆ¢ncias EC2, e da criaĆ§Ć£o de grupos de seguranƧa para essas instĆ¢ncias.

āš ļø

Para esse mĆ³dulo funcionar como esperado, Ć© necessĆ”rio que ele consiga ser executado para cada instĆ¢ncia presente no arquivo de configuraĆ§Ć£o. Para isso, Ć© necessĆ”rio que ao topo dos recursos utilizados para a criaĆ§Ć£o de instĆ¢ncias, seja adicionado o atributo for_each.

šŸ“

O atributo for_each Ć© utilizado para que o Terraform possa executar o mesmo recurso para cada item presente no arquivo de configuraĆ§Ć£o (como um for loop em outras linguagens).

Para mais informaƧƵes sobre o atributo for_each, acesse a documentaĆ§Ć£o oficial.

Vamos passar por cada recurso presente no arquivo main.tf e entender o que ele faz.

CriaĆ§Ć£o de Chaves PĆŗblicas

O primeiro recurso presente no arquivo main.tf Ć© a criaĆ§Ć£o de chaves pĆŗblicas para as instĆ¢ncias EC2. Para isso, Ć© utilizado o recurso aws_key_pair em conjunto com tls_private_key:

resource "tls_private_key" "pk" {
algorithm = "RSA"
rsa_bits = 4096
}
# generate pem file for each instance
resource "aws_key_pair" "kp" {
for_each = { for instance in var.instances : instance.name => instance }
key_name = each.value.name
public_key = tls_private_key.pk.public_key_openssh
provisioner "local-exec" {
command = "echo '${tls_private_key.pk.private_key_pem}' > '${path.module}/keys/${each.value.name}.pem'"
}
}

Ao final, esse recurso cria um arquivo .pem para cada instĆ¢ncia presente no arquivo e guarda na pasta keys.

CriaĆ§Ć£o de Grupos de SeguranƧa

A criaĆ§Ć£o de grupos de seguranƧa Ć© feita utilizando o recurso aws_security_group:

resource "aws_security_group" "sg" {
for_each = { for sg in var.security_groups : sg.name => sg }
name = each.value.name
description = each.value.description
vpc_id = var.vpc_id
tags = {
Name = each.value.name
id = each.value.id
}
dynamic "ingress" {
for_each = each.value.ingress
content {
from_port = ingress.value.from_port
to_port = ingress.value.to_port
protocol = ingress.value.protocol
cidr_blocks = ingress.value.cidr_blocks
}
}
dynamic "egress" {
for_each = each.value.egress
content {
from_port = egress.value.from_port
to_port = egress.value.to_port
protocol = egress.value.protocol
cidr_blocks = egress.value.cidr_blocks
}
}
}

Esse recurso cria um grupo de seguranƧa para cada item presente no arquivo de configuraĆ§Ć£o, mas ainda nĆ£o os associa a nenhuma instĆ¢ncia.

CriaĆ§Ć£o de InstĆ¢ncias EC2

A criaĆ§Ć£o de instĆ¢ncias EC2 Ć© feita utilizando o recurso aws_instance:

resource "aws_instance" "ec2_instance" {
for_each = { for instance in var.instances : instance.name => instance }
instance_type = each.value.instance_type
key_name = each.value.name
ami = each.value.ami
subnet_id = var.public_subnet
vpc_security_group_ids = [for sg in aws_security_group.sg : sg.id if contains(each.value.security_groups_ids, sg.tags.id)]
tags = {
Name = each.value.name
}
root_block_device {
volume_size = 10
}
}

Esse recurso cria uma instĆ¢ncia EC2 para cada item presente no arquivo de configuraĆ§Ć£o, e associa os grupos de seguranƧa criados anteriormente a cada instĆ¢ncia que possua o ID do grupo de seguranƧa presente no arquivo de configuraĆ§Ć£o.

CriaĆ§Ć£o de EIPs

O Ćŗltimo recurso presente no arquivo main.tf Ć© a criaĆ§Ć£o de EIPs para as instĆ¢ncias EC2. Para isso, Ć© utilizado o recurso aws_eip:

resource "aws_eip" "eip" {
for_each = { for instance in var.instances : instance.name => instance }
vpc = true
instance = aws_instance.ec2_instance[each.value.name].id
}

Esse recurso serve para que as instĆ¢ncias EC2 possam ser acessadas de fora da VPC.