Infraestrutura Terraform
O Terraform é uma ferramenta de software de infraestrutura como código de código aberto 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 práticas recomendadas de segurança através de verificações do Checkov.
Utilização
Seção intitulada “Utilização”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-infra
yarn nx g @aws/nx-plugin:terraform#project --name=tf-infra
npx nx g @aws/nx-plugin:terraform#project --name=tf-infra
bunx nx g @aws/nx-plugin:terraform#project --name=tf-infra
Você 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-run
yarn nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-run
npx nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-run
bunx 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 estruturas de arquivos diferentes dependendo do tipo de projeto:
Tipo Aplicação
Seção intitulada “Tipo Aplicação”Para projetos do tipo 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 do 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 do tipo 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 do 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=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=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 do Terraform:
pnpm nx run tf-infra:bootstrap
yarn nx run tf-infra:bootstrap
npx nx run tf-infra:bootstrap
bunx nx run tf-infra:bootstrap
Targets Disponíveis
Seção intitulada “Targets Disponíveis”Os targets disponíveis dependem do tipo do 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”Você pode validar sua configuração Terraform usando o target validate
:
pnpm nx run tf-infra:validate
yarn nx run tf-infra:validate
npx nx run tf-infra:validate
bunx nx run tf-infra:validate
Formatando seu Código
Seção intitulada “Formatando seu Código”Formate seu código Terraform usando o target fmt
:
pnpm nx run tf-infra:fmt
yarn nx run tf-infra:fmt
npx nx run tf-infra:fmt
bunx nx run tf-infra:fmt
Testes de Segurança
Seção intitulada “Testes de Segurança”Execute verificações de segurança em sua infraestrutura usando o Checkov com o target test
:
pnpm nx run tf-infra:test
yarn nx run tf-infra:test
npx nx run tf-infra:test
bunx nx run tf-infra:test
Você encontrará os resultados dos testes de segurança na pasta raiz dist
, em dist/packages/<meu-projeto-terraform>/checkov
.
Targets Exclusivos para Aplicação
Seção intitulada “Targets Exclusivos para 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 alterações, você pode ver o que o Terraform fará executando o target plan
:
pnpm nx run tf-infra:plan
yarn nx run tf-infra:plan
npx nx run tf-infra:plan
bunx nx run tf-infra:plan
Isso 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 do Terraform com o target init
:
pnpm nx run tf-infra:init
yarn nx run tf-infra:init
npx nx run tf-infra:init
bunx nx run tf-infra:init
Implantando 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:apply
yarn nx run tf-infra:apply
npx nx run tf-infra:apply
bunx nx run tf-infra:apply
Obtendo Outputs
Seção intitulada “Obtendo Outputs”Recupere valores de saída de sua configuração Terraform:
pnpm nx run tf-infra:output
yarn nx run tf-infra:output
npx nx run tf-infra:output
bunx nx run tf-infra:output
Destruindo Infraestrutura
Seção intitulada “Destruindo Infraestrutura”Quando precisar desmontar sua infraestrutura, use o target destroy
:
pnpm nx run tf-infra:destroy
yarn nx run tf-infra:destroy
npx nx run tf-infra:destroy
bunx nx run tf-infra:destroy
Destruindo 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-destroy
yarn nx run tf-infra:bootstrap-destroy
npx nx run tf-infra:bootstrap-destroy
bunx nx run tf-infra:bootstrap-destroy
Mais 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.