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.