Introdução
Sua equipe precisa de armazenamento privado para relatórios. Neste laboratório, você criará o primeiro bucket com o Terraform, comparará sua configuração com a AWS e o estado do Terraform e, em seguida, revisará e executará sua destruição. Um relatório de referência separado pertence a outra equipe e deve permanecer inalterado.
Você já deve compreender recursos do Terraform, init, plan, apply, estado e destroy, além de se sentir à vontade para editar arquivos e consultar o S3 com a AWS CLI. O Terraform, o provedor AWS e o acesso pela CLI estão preparados. Use o Terminal para executar comandos e o AWS View para observar o armazenamento; não é necessário ter uma conta pessoal da AWS nem chaves de acesso. Cada laboratório começa de forma independente.
Relação com certificações
| Certificação | Tarefa do exame | Prática |
|---|---|---|
| Cloud Practitioner (CLF-C02) | Tarefa 3.1 | Usar infraestrutura como código para uma implantação repetível e consultas pela CLI para inspeção. |
| Developer – Associate (DVA-C02) | Tarefa 3.3, Habilidade 3.3.4 | Prática básica de implementação e implantação de uma definição de recurso em IaC. |
| DevOps Engineer – Professional (DOP-C02) | Tarefa 2.1 | Prática básica de definição de um recurso e gerenciamento de sua criação e exclusão com IaC. |

Crie o bucket de relatórios
Nesta etapa, você conectará uma definição de recurso do Terraform à conta AWS atual e criará um bucket privado para relatórios.
Primeiro, entre no diretório raiz preparado e consulte sua região e a identidade do chamador. Um diretório raiz contém uma configuração independente do Terraform com seu próprio estado. A conta do chamador informa onde as solicitações do provedor operam; o ARN identifica quem faz as solicitações.
cd /home/labex/project/first-aws-resource
aws configure get region
aws sts \
get-caller-identity
terraform version
A região é us-east-1. O Terraform informa a versão 1.17.2. O acesso preparado é separado de qualquer conta pessoal da AWS.
O arquivo provider.tf fornecido seleciona o provedor AWS na versão 6.14.0, configura a conexão preparada e fixa a versão 1.17.2 do Terraform. O provedor traduz operações de recursos em solicitações à API da AWS. Sua configuração é fornecida para que você possa se concentrar no gerenciamento de recursos.
Crie main.tf com a configuração a seguir. cat e <<'EOF' escrevem tudo até o EOF de fechamento no arquivo indicado. aws_s3_bucket é o tipo de recurso AWS; reports é o rótulo local do Terraform. Juntos, formam o endereço aws_s3_bucket.reports. O atributo bucket é o nome do bucket na AWS, que é diferente desse endereço. As tags registram a finalidade do recurso.
cat > main.tf <<'EOF'
resource "aws_s3_bucket" "reports" {
bucket = "terraform-first-reports"
tags = {
Project = "TerraformReports"
}
}
output "report_bucket" {
value = aws_s3_bucket.reports.id
}
EOF
Inicialize este diretório raiz e valide sua configuração:
terraform init
terraform validate
init instala o provedor na versão fixada a partir do cache preparado e grava .terraform.lock.hcl. Mantenha esse arquivo de bloqueio de dependências junto à configuração de um projeto real: ele registra o provedor escolhido e as somas de verificação dos pacotes. Ele é diferente do estado do Terraform, que mapeia endereços de recursos para os IDs dos recursos implantados. Como o cache está preparado para este ambiente Linux, init pode avisar que as somas de verificação do arquivo de bloqueio cobrem apenas linux_amd64; a inicialização ainda é concluída. Um projeto usado em outras plataformas também precisa das somas de verificação dessas plataformas.
Revise o plano antes de criar qualquer recurso:
terraform plan
Espere Plan: 1 to add, 0 to change, 0 to destroy. Alguns atributos exibem (known after apply) porque a AWS os atribui ou retorna durante a criação. Confirme o nome do bucket e a tag do projeto. Um plano apresenta as ações previstas; ele não cria o bucket.
Aplique a configuração e digite yes na solicitação de confirmação:
terraform apply
Espere Apply complete! Resources: 1 added, 0 changed, 0 destroyed. O valor de saída report_bucket é terraform-first-reports. No AWS View, o novo bucket vazio aparece ao lado de team-reference-reports. Não altere esse bucket de referência nem seu objeto keep.txt.

Use Continue após concluir os comandos. A verificação consulta a AWS e o mapeamento no estado de forma independente; o sucesso de um comando, por si só, não é suficiente.
Compare a configuração, o estado e a AWS
Nesta etapa, você relacionará o endereço de recurso do Terraform ao bucket privado existente e confirmará que a configuração convergiu.
O valor de saída lê o ID do bucket por meio de uma referência ao recurso. state list exibe o endereço gerenciado; state show exibe seus atributos registrados. Esses comandos inspecionam o mapeamento sem alterar a AWS.
terraform output report_bucket
terraform state list
terraform state show aws_s3_bucket.reports
Localize aws_s3_bucket.reports e seu ID terraform-first-reports. Sua configuração expressa o recurso desejado, a AWS contém o recurso e o estado conecta os dois. Uma entrada no estado, por si só, não comprova que o recurso ainda existe.
Consulte a AWS diretamente. get-bucket-location retorna null para a região us-east-1 do S3. A ACL deve conceder acesso apenas ao usuário canônico proprietário; não deve haver nenhuma concessão a grupos públicos. Este laboratório cria um bucket privado e não adiciona uma política de bucket pública.
aws s3api \
get-bucket-location \
--bucket terraform-first-reports
aws s3api \
get-bucket-acl \
--bucket terraform-first-reports
aws s3api \
get-bucket-tagging \
--bucket terraform-first-reports
Confirme que a tag Project é TerraformReports. Verifique se o relatório não relacionado ainda pode ser lido. A expressão --query seleciona apenas seu tamanho em bytes, e o comando mantém o objeto armazenado inalterado.
aws s3api \
head-object \
--bucket team-reference-reports \
--key keep.txt \
--query ContentLength
terraform plan
O plano deve informar No changes. Isso significa que o provedor não identifica alterações de configuração para os recursos gerenciados. Isso não comprova todas as possíveis propriedades de segurança nem valida os dados dos relatórios; esses aspectos precisam de verificações próprias. Você pode saber mais sobre o estado do Terraform e o controle de acesso do S3.
Remova apenas o recurso gerenciado
Nesta etapa, você revisará e executará um plano de destruição e comprovará que o bucket gerenciado e o mapeamento no estado foram removidos, enquanto o relatório de referência permanece.
terraform plan -destroy apresenta a exclusão prevista dos recursos no estado deste diretório raiz. Isso não significa “excluir todos os buckets da conta”. Leia o endereço e o ID do bucket antes de continuar:
terraform plan -destroy
Espere Plan: 0 to add, 0 to change, 1 to destroy. O bucket de referência não aparece no plano porque este diretório raiz não o gerencia. O bucket de destino está vazio; laboratórios posteriores explicam por que dados armazenados e versões exigem decisões de retenção específicas.
Destrua o bucket gerenciado e digite yes na solicitação de confirmação:
terraform destroy
Espere Destroy complete! Resources: 1 destroyed. Agora inspecione o estado e consulte os buckets restantes:
terraform state list
aws s3api \
list-buckets \
--query 'Buckets[].Name'
aws s3api \
head-object \
--bucket team-reference-reports \
--key keep.txt \
--query ContentLength
A lista do estado está vazia. terraform-first-reports não aparece na listagem bem-sucedida de buckets; team-reference-reports e seu relatório permanecem. Mantenha o acesso à AWS configurado até que a verificação final seja concluída, para que um erro de autenticação não seja confundido com uma exclusão bem-sucedida. A configuração e o arquivo de bloqueio permanecem disponíveis caso você decida criar o recurso novamente.

Resumo
Você criou um bucket S3 privado usando um provedor AWS com versão fixada, comparou a configuração e o estado com consultas à AWS, verificou um plano convergente e destruiu apenas o recurso gerenciado. O relatório de referência independente permaneceu intacto. No próximo laboratório, você usará entradas e referências a recursos para gerenciar o conteúdo dos relatórios.



