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 instanceresource "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.