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 | - | The name of the project. |
| type | string | application | Whether this is a terraform lib (re-usable modules) or app (deployable). |
| directory | string | packages | The directory of the new project. |
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 run tf-infra:bootstrapyarn nx run tf-infra:bootstrapnpx nx run tf-infra:bootstrapbunx nx run tf-infra:bootstrapTargets 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 run tf-infra:validateyarn nx run tf-infra:validatenpx nx run tf-infra:validatebunx nx run tf-infra:validateFormatando seu Código
Seção intitulada “Formatando seu Código”Formate seu código Terraform usando o target fmt:
pnpm nx run tf-infra:fmtyarn nx run tf-infra:fmtnpx nx run tf-infra:fmtbunx nx run tf-infra:fmtTestes 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 run tf-infra:testyarn nx run tf-infra:testnpx nx run tf-infra:testbunx nx run tf-infra:testVocê 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 run tf-infra:planyarn nx run tf-infra:plannpx nx run tf-infra:planbunx nx run tf-infra:planIsso 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 run tf-infra:applyyarn nx run tf-infra:applynpx nx run tf-infra:applybunx nx run tf-infra:applyObtendo Outputs
Seção intitulada “Obtendo Outputs”Recupere valores de saída de sua configuração Terraform:
pnpm nx run tf-infra:outputyarn nx run tf-infra:outputnpx nx run tf-infra:outputbunx nx run tf-infra:outputDestruindo Infraestrutura
Seção intitulada “Destruindo Infraestrutura”Quando precisar remover sua infraestrutura, use o target destroy:
pnpm nx run tf-infra:destroyyarn nx run tf-infra:destroynpx nx run tf-infra:destroybunx nx run tf-infra:destroyDestruindo Recursos de Bootstrap
Seção intitulada “Destruindo Recursos de Bootstrap”Para limpar os recursos de bootstrap (bucket S3 para armazenamento de estado):
pnpm nx run tf-infra:bootstrap-destroyyarn nx run tf-infra:bootstrap-destroynpx nx run tf-infra:bootstrap-destroybunx nx run tf-infra:bootstrap-destroyMais 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.