Este é um código Terraform completo para provisionamento de um Cluster EKS na AWS. Ele contempla Rede, um Node Group, Policies, Roles, Load Balancer Controller e demais configurações necessárias para criação de um cluster 100% operacional. Espero que aproveitem e façam bom uso dessa estrutura.
Todo trabalho não teria sido possível sem o treinamento do Mateus Muller, que indico para todos que buscam entender mais sobre módulos no Terraform (https://www.udemy.com/course/terraform-para-aws).
Se precisar, pode contatar no Linkedin em: https://www.linkedin.com/in/mdellabeneta/, ficaria muito feliz com o seu contato e contribuição.
Com isso posto, vamos falar um pouco mais do que temos por aqui. Observe a saída do comando tree em meu terminal, para uma noção macro da estrutura de diretórios e arquivos:
della@desklin:~/projetos$ tree terraform-supermodule/
terraform-supermodule/
├── LICENSE
├── modules
│ ├── cluster
│ │ ├── cluster.tf
│ │ ├── iam.tf
│ │ ├── oidc.tf
│ │ ├── output.tf
│ │ ├── README.md
│ │ ├── sg-rule.tf
│ │ └── variables.tf
│ ├── loadbalancer
│ │ ├── data.tf
│ │ ├── helm.tf
│ │ ├── iam_policy.json
│ │ ├── iam.tf
│ │ ├── locals.tf
│ │ ├── policy.tf
│ │ ├── README.md
│ │ ├── serviceaccount.tf
│ │ └── variables.tf
│ ├── network
│ │ ├── igw.tf
│ │ ├── ngw.tf
│ │ ├── output.tf
│ │ ├── private.tf
│ │ ├── public.tf
│ │ ├── README.md
│ │ ├── region.tf
│ │ ├── variables.tf
│ │ └── vpc.tf
│ └── nodegroup
│ ├── iam.tf
│ ├── nodegroup.tf
│ ├── README.md
│ └── variables.tf
├── modules.tf
├── provider.tf
├── README.md
└── variables.tf
6 directories, 34 files
Nas tabelas abaixo (geradas com o pre-commit e terraform-docs), podemos ver maiores detalhes como dependências, versionamento utilizado e os INPUTS que são requisitos para a utilização do projeto.
Name | Version |
---|---|
aws | 5.37.0 |
helm | 2.12.1 |
kubernetes | 2.26.0 |
No providers.
Name | Source | Version |
---|---|---|
eks_cluster | ./modules/cluster | n/a |
eks_load_balancer | ./modules/loadbalancer | n/a |
eks_network | ./modules/network | n/a |
eks_node_group | ./modules/nodegroup | n/a |
No resources.
Name | Description | Type | Default | Required |
---|---|---|---|---|
aws_profile | Nome do profile configurado na AWS CLI localmente em seu PC | string |
n/a | yes |
cidr_block | IP CIDR que sera usado na VPC | string |
n/a | yes |
desired_size | Valor desejado de Nodes | number |
n/a | yes |
eks_version | Versao do EKS que sera provisionada na AWS | string |
n/a | yes |
instance_types | Tipo da instancia que sera usada para criacao dos Nodes | string |
n/a | yes |
max_size | Valor maximo de Nodes | number |
n/a | yes |
min_size | Valor minimo de Nodes | number |
n/a | yes |
project_name | Nome do projeto que pode ser usado nas tags de nome (Name tag) | string |
n/a | yes |
region | Regiao da AWS onde o projeto sera provisionado | string |
n/a | yes |
tags | Tags para serem adicionadas aos recursos | map(any) |
n/a | yes |
No outputs.
Veja um exemplo de um "main.tf" que você poderia criar para utilizar este projeto de forma rápida, respeitando as variáveis, inputs necessários e com backend local:
module "eks" {
source = "git@github.com:dellabeneta/terraform-supermodule.git"
# Variáveis necessárias (INPUTS)
aws_profile = "SEU_PROFILE"
region = "REGIÃO"
project_name = "NOME_DO_PROJETO"
eks_version = "VERSÃO_DO_EKS"
cidr_block = "CIDR_PARA_VPC" --> de acordo com as configurações estabelecidas no módulo de VPC, a rede deve ser necessariamente definida como /16.
instance_types = "SIZE_DA_EC2"
desired_size = "1"
min_size = "1"
max_size = "1"
# As tags também são variáveis, do tipo map(). Opcionalmente,
# pode ser criado um arquivo 'locals.tags', para organizar
# melhor a passagem dos valores. Neste exemplo, não optei por isso.
tags = {
Departamento = "Devops"
Organizacao = "Dellabeneta S/A"
Projeto = "Automatização com IaC Cluster EKS"
Ambiente = "Desenvolvimento"
}
}