Infraestrutura Terraform
Terraform é uma ferramenta de software de infraestrutura como código de código aberto que permite criar, alterar e melhorar a infraestrutura de forma segura e previsível.
O gerador de infraestrutura Terraform cria um projeto de infraestrutura Terraform. A aplicação gerada inclui práticas recomendadas de segurança através de verificações de segurança do Checkov.
Gerar um Projeto Terraform
Seção intitulada “Gerar um Projeto Terraform”Você pode gerar um novo projeto Terraform de duas maneiras:
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- 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
| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
| name Obrigatório | string | - | O nome do projeto. |
| type | application | library | 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. |
| preferInstallDependencies | boolean | true | Se deve preferir instalar dependências após a execução do gerador. Defina como false para adiar a instalação ao executar múltiplos geradores em lote (uma instalação ainda é executada se necessário para que geradores subsequentes possam calcular o grafo de projetos Nx); instale uma vez no final. |
Saída do Gerador
Seção intitulada “Saída do Gerador”O gerador cria diferentes estruturas de arquivos dependendo do tipo de projeto:
Tipo Application
Seção intitulada “Tipo Application”Para projetos de aplicação (--type=application), o gerador cria uma aplicação Terraform completa com gerenciamento de estado remoto:
Directorysrc
- main.tf Main Terraform configuration file
- providers.tf Provider configuration with S3 backend
- variables.tf Input variable definitions
- outputs.tf Output value definitions
Directoryenv Environment-specific variable files
- dev.tfvars Development environment variables
Directorybootstrap Bootstrap configuration for remote state
- main.tf S3 bucket and policies for state storage
- providers.tf AWS provider configuration
- variables.tf Bootstrap variable definitions
Directoryscripts Node helpers run by the nx
bootstrapandinittargets- aws-config.ts Resolves account + region via the AWS SDK credential chain
- bootstrap.ts Pulls/pushes the bootstrap tfstate and runs
terraform apply - init.ts Runs
terraform initwith the S3 backend config
- project.json Project configuration and build targets
Tipo Library
Seção intitulada “Tipo Library”Para projetos de biblioteca (--type=library), o gerador cria uma estrutura mais simples para módulos Terraform reutilizáveis:
Directorysrc
- main.tf Main Terraform module file
- project.json Project configuration and build targets
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 your infrastructure hereresource "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 (lib), você pode fazer isso da seguinte forma:
module "lib_module" { source = "../../path/to/my-lib/src"}Isso atualizará automaticamente o grafo Nx para adicionar uma dependência entre sua aplicação consumidora e sua lib.
Configuração de Ambiente
Seção intitulada “Configuração de Ambiente”Configure variáveis específicas do ambiente nos arquivos src/env/*.tfvars.
Para adicionar novos ambientes, crie um novo arquivo src/env/<environment>.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:
# Production environment variablesenvironment = "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": { "env": { "TF_ENV": "dev" } }, "prod": { "env": { "TF_ENV": "prod" } } }, "options": { "forwardAllArgs": true, "commands": ["tsx {projectRoot}/scripts/init.ts {projectRoot}"], "cwd": "{workspaceRoot}" } }, "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 (Somente Projetos Application)
Seção intitulada “Bootstrap de Estado Remoto (Somente Projetos Application)”Antes de implantar sua infraestrutura, você precisará fazer 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 do seu projeto:
Targets Comuns (Application e Library)
Seção intitulada “Targets Comuns (Application e Library)”Validando sua Infraestrutura
Seção intitulada “Validando sua Infraestrutura”Você pode validar 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 dist raiz, em dist/packages/<my-terraform-project>/checkov.
Targets Exclusivos de Application
Seção intitulada “Targets Exclusivos de Application”Os seguintes targets estão disponíveis apenas para projetos do tipo application:
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/<my-terraform-project>/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 planejar, 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 da 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 você precisar derrubar 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 Terraform, consulte a Documentação do Terraform e a Documentação do AWS Provider.