Introducción
Quien consume un informe necesita un informe privado, no todo el acceso al almacenamiento del operador. Concederás acceso de alcance limitado a su identidad IAM independiente, probarás solicitudes reales y revocarás después el permiso conservando los datos del informe.
Parte de tus conocimientos sobre referencias a recursos y lecturas de objetos de S3. Debes comprender Action y Resource de IAM; no necesitas confianza de roles, perfiles de instancia ni claves de acceso personales. Ambas identidades de la CLI están preparadas en este entorno nuevo.
Relación con las certificaciones
| Certificación | Tarea del examen | Práctica |
|---|---|---|
| Cloud Practitioner (CLF-C02) | Tareas 2.3 y 3.1 | Gestionar una política de identidad de privilegios mínimos mediante una configuración de infraestructura repetible. |
| Developer – Associate (DVA-C02) | Tarea 3.3, habilidad 3.3.4 | Práctica básica de despliegue de una definición de infraestructura. |
| DevOps Engineer – Professional (DOP-C02) | Tarea 2.1 | Práctica básica de gestión de recursos mediante una definición de IaC. |
| Solutions Architect – Associate (SAA-C03) | Tarea 1.1 | Práctica básica de delimitación de una política IAM de lectura y evaluación del acceso permitido y denegado. |

Prepara el informe y observa la identidad de lectura
En este paso, crearás el almacén de informes y observarás la falta inicial de acceso de una identidad de lectura válida e independiente.
La identidad predeterminada de la CLI gestiona la infraestructura. El perfil reader suministrado pertenece al usuario IAM independiente report-reader; su acceso no se toma prestado del operador. Crear almacenamiento no autoriza automáticamente a ese usuario. La selección del perfil cambia la identidad que firma una solicitud de AWS, no el recurso en sí.
Crea un almacén de informes en la configuración raíz preparada:
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
Deben añadirse dos recursos. Aplica los cambios e introduce yes:
terraform apply
Intenta leer el informe con la identidad de lectura independiente. || true permite que este bloque de comandos continúe tras el fallo intencionado; no convierte la solicitud en una lectura correcta.
aws s3api \
get-object \
--profile reader \
--bucket terraform-reader-reports \
--key reports/current.csv \
reader-report.csv || true
Debes ver AccessDenied. La identidad es válida, pero no tiene ningún permiso coincidente. Mantén privado el objeto independiente team-reference-reports/keep.txt durante todo el laboratorio. AWS View usa la identidad del operador para inspeccionar el almacenamiento; una vista previa de un objeto allí no demuestra que la identidad de lectura pueda acceder a él.

Concede únicamente la lectura del informe previsto
En este paso, usarás referencias a recursos para crear una política de identidad IAM y verificar tanto las lecturas permitidas como las prohibidas.
Una política de identidad en línea se adjunta directamente a un usuario y le concede acciones. s3:GetObject se aplica a un ARN de objeto, no a un ARN de bucket. jsonencode convierte un valor de Terraform en JSON válido, por lo que puedes usar referencias normales a recursos de HCL en lugar de construir manualmente una cadena JSON con caracteres escapados.
Crea policy.tf. El nombre de la identidad de lectura forma parte del entorno suministrado; el ARN de destino de la política combina el ARN del bucket creado y la clave del objeto real.
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
El plan añade una política y conserva el bucket y el informe. Aplícala e introduce yes:
terraform apply
Lee el destino con el mismo perfil de lectura:
aws s3api \
get-object \
--profile reader \
--bucket terraform-reader-reports \
--key reports/current.csv \
reader-report.csv
cat reader-report.csv
Debes ver orders,12. Ahora usa esa misma identidad para un objeto privado ajeno:
aws s3api \
get-object \
--profile reader \
--bucket team-reference-reports \
--key keep.txt \
unrelated-report.txt || true
Debes ver AccessDenied, sin descargar los datos de referencia. Esta política concede únicamente lecturas del informe; no debe autorizar escrituras ni eliminaciones del informe. Los comodines amplios en acciones o recursos pueden crear acceso no previsto aunque la lectura del destino funcione. La comprobación interpreta la semántica nativa de la política y realiza lecturas reales permitidas y prohibidas; no exige una estructura JSON concreta. Las expresiones equivalentes de cadena o lista y un prefijo limitado a informes pueden satisfacer esta tarea sin conceder acciones nuevas.
Revoca el permiso sin eliminar los datos
En este paso, eliminarás la política mediante Terraform y demostrarás que cambia el acceso mientras el informe se conserva.
Eliminar un bloque de recurso propone eliminar ese recurso gestionado. Elimina únicamente policy.tf, dejando sin cambios la configuración del almacenamiento:
rm policy.tf
terraform plan -out=revoke.tfplan
terraform show revoke.tfplan
Debe destruirse una política sin eliminar el bucket ni el objeto. Aplica ese artefacto guardado:
terraform apply revoke.tfplan
Vuelve a intentar leer el destino con la misma identidad de lectura:
aws s3api \
get-object \
--profile reader \
--bucket terraform-reader-reports \
--key reports/current.csv \
after-revoke.csv || true
Debes ver AccessDenied. Revocar un permiso no elimina un archivo local que ya se haya descargado, y la presencia de reader-report.csv no demuestra que una solicitud nueva esté autorizada. Consulta el informe almacenado con la identidad predeterminada del operador:
aws s3api \
get-object \
--bucket terraform-reader-reports \
--key reports/current.csv \
retained-report.csv
cat retained-report.csv
El informe sigue conteniendo orders,12. Has cambiado el límite de autorización sin modificar los datos. Consulta los elementos de las políticas IAM para conocer la diferencia entre Action y Resource.
Elimina el almacén de informes gestionado
En este paso, limpiarás el almacenamiento después de completar las comprobaciones de acceso y revocación.
Destruye los recursos restantes de esta configuración raíz e introduce yes:
terraform destroy
Se eliminan el bucket y el objeto de informe; la identidad de lectura suministrada y la referencia del equipo pertenecen al entorno preparado y no están en el estado de esta configuración raíz. Inspecciona la correspondencia final y la referencia conservada:
terraform state list
aws s3api \
list-buckets \
--query 'Buckets[].Name'
aws s3api \
head-object \
--bucket team-reference-reports \
--key keep.txt \
--query ContentLength
La lista del estado está vacía y la referencia se conserva. Mantén configuradas ambas identidades preparadas de la CLI hasta que termine la comprobación final.
Resumen
Has usado jsonencode y referencias a recursos para definir una política de identidad IAM, probado solicitudes permitidas y prohibidas con una identidad de lectura independiente, revocado el permiso sin eliminar los datos del informe y eliminado únicamente el almacén gestionado.



