Infraestrutura Terraform
O Terraform é uma ferramenta de código aberto para infraestrutura como código que permite criar, alterar e melhorar infraestrutura de forma segura e previsível.
O gerador de infraestrutura Terraform cria um projeto de infraestrutura Terraform. A aplicação gerada inclui melhores práticas de segurança através de verificações do Checkov.
Gerar um Projeto Terraform
Seção intitulada “Gerar um Projeto Terraform”Você pode gerar um novo projeto Terraform de duas formas:
- Instale o Nx Console VSCode Plugin se ainda não o fez
- Abra o console Nx no VSCode
- Clique em
Generate (UI)na seção "Common Nx Commands" - Procure por
@aws/nx-plugin - terraform#project - Preencha os parâmetros obrigatórios
- name: tf-infra
- Clique em
Generate
pnpm nx g @aws/nx-plugin:terraform#project --name=tf-infrayarn nx g @aws/nx-plugin:terraform#project --name=tf-infranpx nx g @aws/nx-plugin:terraform#project --name=tf-infrabunx nx g @aws/nx-plugin:terraform#project --name=tf-infraVocê também pode realizar uma execução simulada para ver quais arquivos seriam alterados
pnpm nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-runyarn nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-runnpx nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-runbunx nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-run| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
| name Obrigatório | string | - | O nome do projeto. |
| type | string | application | Se este é uma lib terraform (módulos reutilizáveis) ou app (implantável). |
| directory | string | packages | O diretório do novo projeto. |
| subDirectory | string | - | O subdiretório onde o projeto é colocado. Por padrão, este é o nome do projeto. |
Saída do Gerador
Seção intitulada “Saída do Gerador”O gerador cria diferentes estruturas de arquivos dependendo do tipo de projeto:
Tipo Aplicação
Seção intitulada “Tipo Aplicação”Para projetos de aplicação (--type=application), o gerador cria uma aplicação Terraform completa com gerenciamento de estado remoto:
Directorysrc
- main.tf Arquivo principal de configuração Terraform
- providers.tf Configuração de provedores com backend S3
- variables.tf Definições de variáveis de entrada
- outputs.tf Definições de valores de saída
Directoryenv Arquivos de variáveis específicas do ambiente
- dev.tfvars Variáveis do ambiente de desenvolvimento
Directorybootstrap Configuração de bootstrap para estado remoto
- main.tf Bucket S3 e políticas para armazenamento de estado
- providers.tf Configuração do provedor AWS
- variables.tf Definições de variáveis do bootstrap
- project.json Configuração do projeto e targets de build
Tipo Biblioteca
Seção intitulada “Tipo Biblioteca”Para projetos de biblioteca (--type=library), o gerador cria uma estrutura mais simples para módulos Terraform reutilizáveis:
Directorysrc
- main.tf Arquivo principal do módulo Terraform
- project.json Configuração do projeto e targets de build
Implementando sua Infraestrutura Terraform
Seção intitulada “Implementando sua Infraestrutura Terraform”Você pode começar a escrever sua infraestrutura Terraform dentro de src/main.tf, por exemplo:
locals { account_id = data.aws_caller_identity.current.account_id aws_region = data.aws_region.current.id}
resource "null_resource" "print_info" { # triggers = { # always_run = timestamp() # }
provisioner "local-exec" { command = "echo 'AWS Region: ${local.aws_region}, AWS Account: ${local.account_id}, Environment: ${var.environment}'" }}
# Declare sua infraestrutura aquiresource "aws_s3_bucket" "my_bucket" { bucket = "my-unique-bucket-name"}Dependências entre projetos
Seção intitulada “Dependências entre projetos”Se você quiser executar um módulo de um projeto separado (biblioteca), pode fazê-lo da seguinte forma:
module "lib_module" { source = "../../path/to/my-lib/src"}Isso atualizará automaticamente o grafo do Nx para adicionar uma dependência entre sua aplicação consumidora e sua biblioteca.
Configuração de Ambiente
Seção intitulada “Configuração de Ambiente”Configure variáveis específicas de ambiente nos arquivos src/env/*.tfvars.
Para adicionar novos ambientes, crie um novo arquivo src/env/<ambiente>.tfvars com as variáveis específicas do ambiente e adicione novas entradas para apply, destroy, init, plan no project.json para a nova configuração de ambiente. Por exemplo, vamos supor que queremos adicionar um ambiente prod:
# Variáveis de ambiente de produçãoenvironment = "prod"region = "us-west-2"{ "targets": { "apply": { "executor": "nx:run-commands", "defaultConfiguration": "dev", "configurations": { "dev": { "command": "terraform apply ../../../dist/packages/infra/terraform/dev.tfplan" }, "prod": { "command": "terraform apply ../../../dist/packages/infra/terraform/prod.tfplan" } }, "options": { "forwardAllArgs": true, "cwd": "{projectRoot}/src" }, "dependsOn": ["plan"] }, "destroy": { "executor": "nx:run-commands", "defaultConfiguration": "dev", "configurations": { "dev": { "command": "terraform destroy -var-file=env/dev.tfvars" }, "prod": { "command": "terraform destroy -var-file=env/prod.tfvars" } }, "options": { "forwardAllArgs": true, "cwd":"{projectRoot}/src" }, "dependsOn": ["init"] }, "init": { "executor": "nx:run-commands", "defaultConfiguration": "dev", "configurations": { "dev": { "command": "terraform init -reconfigure -backend-config=\"region=$(aws configure get region)\" -backend-config=\"bucket=$(aws sts get-caller-identity --query Account --output text)-tf-state-$(aws configure get region)\" -backend-config=\"key=my-scope-my-project/dev/terraform.tfstate\"" }, "prod": { "command": "terraform init -reconfigure -backend-config=\"region=$(aws configure get region)\" -backend-config=\"bucket=$(aws sts get-caller-identity --query Account --output text)-tf-state-$(aws configure get region)\" -backend-config=\"key=my-scope-my-project/prod/terraform.tfstate\"" } }, "options": { "forwardAllArgs": true, "cwd": "{projectRoot}/src" } }, "plan": { "executor": "nx:run-commands", "defaultConfiguration": "dev", "configurations": { "dev": { "command": "terraform plan -var-file=env/dev.tfvars -out=../../../dist/packages/infra/terraform/dev.tfplan" }, "prod": { "command": "terraform plan -var-file=env/dev.tfvars -out=../../../dist/packages/infra/terraform/prod.tfplan" } }, "options": { "forwardAllArgs": true, "cwd": "{projectRoot}/src" }, "dependsOn": ["init"] } }}Bootstrap de Estado Remoto (Apenas Projetos de Aplicação)
Seção intitulada “Bootstrap de Estado Remoto (Apenas Projetos de Aplicação)”Para projetos de aplicação, antes de implantar sua infraestrutura, você precisará executar o bootstrap do backend de estado remoto. Isso cria um bucket S3 para armazenar seus arquivos de estado Terraform:
pnpm nx bootstrap tf-infrayarn nx bootstrap tf-infranpx nx bootstrap tf-infrabunx nx bootstrap tf-infraTargets Disponíveis
Seção intitulada “Targets Disponíveis”Os targets disponíveis dependem do tipo de seu projeto:
Targets Comuns (Aplicação e Biblioteca)
Seção intitulada “Targets Comuns (Aplicação e Biblioteca)”Validando sua Infraestrutura
Seção intitulada “Validando sua Infraestrutura”Valide sua configuração Terraform usando o target validate:
pnpm nx validate tf-infrayarn nx validate tf-infranpx nx validate tf-infrabunx nx validate tf-infraFormatando seu Código
Seção intitulada “Formatando seu Código”Formate seu código Terraform usando o target fmt:
pnpm nx fmt tf-infrayarn nx fmt tf-infranpx nx fmt tf-infrabunx nx fmt tf-infraTestes de Segurança
Seção intitulada “Testes de Segurança”Execute verificações de segurança em sua infraestrutura usando Checkov com o target test:
pnpm nx test tf-infrayarn nx test tf-infranpx nx test tf-infrabunx nx test tf-infraVocê encontrará os resultados dos testes de segurança na pasta raiz dist, em dist/packages/<meu-projeto-terraform>/checkov.
Targets Exclusivos de Aplicação
Seção intitulada “Targets Exclusivos de Aplicação”Os seguintes targets estão disponíveis apenas para projetos do tipo aplicação:
Planejando sua Infraestrutura
Seção intitulada “Planejando sua Infraestrutura”Antes de aplicar mudanças, você pode ver o que o Terraform fará executando o target plan:
pnpm nx plan tf-infrayarn nx plan tf-infranpx nx plan tf-infrabunx nx plan tf-infraIsso criará um arquivo de plano em dist/packages/<meu-projeto-terraform>/terraform/dev.tfplan.
Inicializando o Terraform
Seção intitulada “Inicializando o Terraform”Inicialize seu diretório de trabalho Terraform com o target init:
pnpm nx run tf-infra:inityarn nx run tf-infra:initnpx nx run tf-infra:initbunx nx run tf-infra:initImplantando na AWS
Seção intitulada “Implantando na AWS”Após o planejamento, você pode implantar sua infraestrutura na AWS usando o target apply:
pnpm nx apply tf-infrayarn nx apply tf-infranpx nx apply tf-infrabunx nx apply tf-infraObtendo Outputs
Seção intitulada “Obtendo Outputs”Recupere valores de saída de sua configuração Terraform:
pnpm nx output tf-infrayarn nx output tf-infranpx nx output tf-infrabunx nx output tf-infraDestruindo Infraestrutura
Seção intitulada “Destruindo Infraestrutura”Quando precisar remover sua infraestrutura, use o target destroy:
pnpm nx destroy tf-infrayarn nx destroy tf-infranpx nx destroy tf-infrabunx nx destroy tf-infraDestruindo Recursos de Bootstrap
Seção intitulada “Destruindo Recursos de Bootstrap”Para limpar os recursos de bootstrap (bucket S3 para armazenamento de estado):
pnpm nx bootstrap-destroy tf-infrayarn nx bootstrap-destroy tf-infranpx nx bootstrap-destroy tf-infrabunx nx bootstrap-destroy tf-infraMais Informações
Seção intitulada “Mais Informações”Para mais informações sobre o Terraform, consulte a Documentação do Terraform e a Documentação do Provedor AWS.