Introdução
Um consumidor de relatórios precisa de um relatório privado, não de todo o acesso do operador ao armazenamento. Você concederá acesso com escopo restrito à identidade IAM independente desse consumidor, testará solicitações efetivas e revogará a concessão, preservando os dados do relatório.
Use como base as referências a recursos e a leitura de objetos S3. Você deve compreender Action e Resource do IAM; confiança de funções, perfis de instância e chaves de acesso pessoais não são necessários. As duas identidades da CLI estão preparadas neste novo ambiente.
Relação com certificações
| Certificação | Tarefa do exame | Prática |
|---|---|---|
| Cloud Practitioner (CLF-C02) | Tarefas 2.3 e 3.1 | Gerenciar uma política de identidade de privilégio mínimo por meio de uma configuração de infraestrutura repetível. |
| Developer – Associate (DVA-C02) | Tarefa 3.3, Habilidade 3.3.4 | Prática básica de implantação de uma definição de infraestrutura. |
| DevOps Engineer – Professional (DOP-C02) | Tarefa 2.1 | Prática básica de gerenciamento de recursos por meio de uma definição de IaC. |
| Solutions Architect – Associate (SAA-C03) | Tarefa 1.1 | Prática básica de delimitação do escopo de uma política de leitor IAM e avaliação de acessos permitidos e negados. |

Prepare o relatório e observe o leitor
Nesta etapa, você criará o armazenamento de relatórios e observará a ausência inicial de acesso de um leitor independente válido.
A identidade padrão da CLI gerencia a infraestrutura. O perfil reader fornecido pertence ao usuário IAM independente report-reader; seu acesso não é emprestado do operador. Criar armazenamento não autoriza automaticamente esse usuário. A seleção do perfil altera a identidade que assina uma solicitação AWS, não o recurso em si.
Crie um armazenamento de relatórios no diretório raiz preparado:
cd /home/labex/project/reader-access
cat > main.tf <<'EOF'
resource "aws_s3_bucket" "reports" {
bucket = "terraform-reader-reports"
}
resource "aws_s3_object" "report" {
bucket = aws_s3_bucket.reports.id
key = "reports/current.csv"
content = "orders,12\n"
content_type = "text/csv"
}
EOF
terraform init
terraform plan
Espere duas adições. Aplique e digite yes:
terraform apply
Tente ler o relatório com o leitor independente. || true permite que este bloco de comandos continue após a falha intencional; isso não transforma a solicitação em uma leitura bem-sucedida.
aws s3api \
get-object \
--profile reader \
--bucket terraform-reader-reports \
--key reports/current.csv \
reader-report.csv || true
Espere AccessDenied. A identidade é válida, mas não tem uma permissão correspondente. Mantenha o objeto separado team-reference-reports/keep.txt privado durante todo o laboratório. O AWS View usa a identidade do operador para inspecionar o armazenamento; uma prévia de objeto nessa interface não comprova que o leitor pode acessá-lo.

Conceda apenas a leitura do relatório pretendido
Nesta etapa, você usará referências a recursos para construir uma política de identidade IAM e verificará leituras permitidas e proibidas.
Uma política de identidade inline é anexada diretamente a um usuário e concede ações a esse usuário. s3:GetObject se aplica a um ARN de objeto, não a um ARN de bucket. jsonencode transforma um valor do Terraform em JSON válido, permitindo usar referências normais a recursos HCL em vez de construir manualmente uma string JSON com escapes.
Crie policy.tf. O nome do leitor é um dado fornecido pelo ambiente; o ARN de destino da política combina o ARN do bucket criado com a chave efetiva do objeto.
cat > policy.tf <<'EOF'
resource "aws_iam_user_policy" "reader" {
name = "ReadReport"
user = "report-reader"
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Action = "s3:GetObject"
Resource = "${aws_s3_bucket.reports.arn}/${aws_s3_object.report.key}"
}]
})
}
EOF
terraform plan
O plano adiciona uma política, preservando o bucket e o relatório. Aplique-o e digite yes:
terraform apply
Leia o destino usando o mesmo perfil de leitor:
aws s3api \
get-object \
--profile reader \
--bucket terraform-reader-reports \
--key reports/current.csv \
reader-report.csv
cat reader-report.csv
Espere orders,12. Agora use essa mesma identidade para um objeto privado não relacionado:
aws s3api \
get-object \
--profile reader \
--bucket team-reference-reports \
--key keep.txt \
unrelated-report.txt || true
Espere AccessDenied, não dados da referência baixados. Esta política concede apenas leituras de relatórios; não deve autorizar gravações nem exclusão de relatórios. Curingas amplos de ações ou recursos podem criar acesso não pretendido, mesmo que a leitura do destino funcione. A verificação lê a semântica nativa da política e realiza leituras efetivas permitidas e proibidas; ela não exige uma organização específica do JSON. Expressões equivalentes com strings/listas e um prefixo exclusivo de relatórios podem satisfazer esta tarefa sem conceder novas ações.
Revogue a concessão sem excluir dados
Nesta etapa, você removerá a política por meio do Terraform e comprovará que o acesso muda enquanto o relatório permanece.
Remover um bloco de recurso propõe a remoção desse recurso gerenciado. Exclua apenas policy.tf, mantendo a configuração do armazenamento inalterada:
rm policy.tf
terraform plan -out=revoke.tfplan
terraform show revoke.tfplan
Espere a destruição de uma política e nenhuma exclusão de bucket ou objeto. Aplique esse artefato salvo:
terraform apply revoke.tfplan
Tente novamente ler o destino como o mesmo leitor:
aws s3api \
get-object \
--profile reader \
--bucket terraform-reader-reports \
--key reports/current.csv \
after-revoke.csv || true
Espere AccessDenied. Uma permissão revogada não remove um arquivo local já baixado, e a presença de reader-report.csv não comprova que uma nova solicitação está autorizada. Consulte o relatório armazenado com a identidade padrão do operador:
aws s3api \
get-object \
--bucket terraform-reader-reports \
--key reports/current.csv \
retained-report.csv
cat retained-report.csv
O relatório ainda contém orders,12. Você alterou o limite de autorização sem alterar os dados. Consulte os elementos de políticas IAM para entender a distinção entre Action e Resource.
Remova o armazenamento de relatórios sob sua responsabilidade
Nesta etapa, você limpará o armazenamento após concluir as verificações de acesso e revogação.
Destrua os recursos restantes deste diretório raiz e digite yes:
terraform destroy
O bucket e o objeto de relatório são removidos; o leitor fornecido e a referência da equipe pertencem ao ambiente preparado e não estão no estado deste diretório raiz. Inspecione o mapeamento final e a referência preservada:
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, e a referência permanece. Mantenha as duas identidades preparadas da CLI configuradas até a conclusão da verificação final.
Resumo
Você usou jsonencode e referências a recursos para definir uma política de identidade IAM, testou solicitações permitidas e proibidas com um leitor independente, revogou a permissão sem excluir os dados do relatório e removeu apenas o armazenamento sob sua responsabilidade.



