Quiero resolver el error «Access Denied» de Amazon Simple Storage Service (Amazon S3) que aparece al crear o actualizar pilas en AWS CloudFormation.
Solución
Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de problemas de AWS CLI. Además, asegúrate de utilizar la versión más reciente de la AWS CLI.
Solución de problemas relacionados con el rol o la política de usuario de IAM
Asegúrate de que el usuario o rol de AWS Identity and Access Management (IAM) que utilizaste con CreateChangeSet o CreateStack tenga los permisos necesarios. Es posible que tengas que adjuntar una política que conceda el permiso GetObject a la identidad de IAM. El siguiente ejemplo de política incluye el permiso GetObject:
{ "Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":[
"s3:GetObject",
"s3:GetObjectVersion"
],
"Resource":"arn:aws:s3:::amzn-s3-demo-bucket/*"
}
]
}
Nota: Sustituye amzn-s3-demo-bucket por el nombre de tu bucket.
Comprobación de que el archivo de plantilla existe y no contiene errores tipográficos
Para comprobar si el archivo de plantilla existe y no contiene errores tipográficos, ejecuta el comando list-objects de la AWS CLI:
aws s3 list-objects --bucket amzn-s3-demo-bucket --prefix file-path/template-file.json
Nota: Sustituye amzn-s3-demo-bucket por tu bucket y file-path/template-file.json por la ruta del archivo y tu archivo de plantilla. Asegúrate de que la URL de la plantilla no contenga espacios adicionales. Los errores tipográficos pueden provocar el error «S3 Access Denied».
Comprobación de que el archivo de plantilla no esté vacío
Si el archivo de plantilla existe pero está vacío, es posible que aparezca el error «S3 Access Denied». Para comprobar si el archivo de plantilla está vacío, ejecuta el comando get-object de la AWS CLI:
aws s3api get-object --bucket amzn-s3-demo-bucket --key key-name template-file.txt
Nota: Sustituye amzn-s3-demo-bucket por tu bucket, key-name por el nombre de tu clave y template-file.txt por tu archivo de plantilla.
A continuación, abre el archivo de plantilla.
Consulta de la política de bucket de S3 para ver las instrucciones de denegación explícitas
Para comprobar si el bucket de S3 tiene una instrucción de denegación explícita para el rol de IAM, sigue estos pasos:
- Abre la consola de Amazon S3.
- En el panel de navegación, selecciona Buckets.
- En la lista desplegable Buckets, selecciona el bucket que contiene el archivo de plantilla.
- Seleccione la pestaña Permisos.
- En Política de bucket, elige Editar.
- Busca instrucciones que incluyan «Efecto»: «Denegar».
- Actualiza las instrucciones «Efecto»: «Denegar» que deniegan el acceso del rol de IAM a s3:GetObject o s3:GetObjectVersion.
- Elimina el rol de IAM que usas con CloudFormation.
- Selecciona Guardar cambios.
- Vuelve a crear o actualizar la pila.
Para obtener más información, consulta Ejemplos de políticas de bucket de Amazon S3.
Validación de la configuración de cifrado en el bucket de S3 y activación del acceso a KMS para el rol de IAM
Es posible que aparezca el error «S3 Access Denied» cuando el bucket utiliza una clave de AWS Key Management Service (KMS) administrada por el cliente para activar el cifrado. Si has cifrado tu bucket, actualiza la política de claves para permitir que la identidad de IAM acceda a la clave de KMS.
Sigue estos pasos:
- Abre la consola de AWS KMS.
- En el panel de navegación, selecciona Claves administradas por el cliente.
- En la lista de claves de KMS, selecciona el alias o el ID de clave de la clave que cifra los objetos de s3 y, a continuación, elige la pestaña Política de claves.
- Utiliza la siguiente instrucción para actualizar la política:
{ "Action": [
"kms:Decrypt",
"kms:GenerateDataKey"
],
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:user/IDENTITY"
},
"Resource": "arn:aws:kms:aa-example-1:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd"
}
Nota: Sustituye arn:aws:iam::111122223333:user/IDENTITY por tu nombre de recurso de Amazon (ARN) de usuario de IAM y arn:aws:kms:aa-example-1:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd por tu ARN de KMS. Si la identidad de IAM está en otra cuenta de AWS, consulta Mi bucket de Amazon S3 tiene un cifrado predeterminado mediante una clave de AWS KMS personalizada. ¿Cómo puedo permitir que los usuarios realicen operaciones de carga y descarga en el bucket?
Comprobación de los permisos de ACL del objeto para el archivo de plantilla
Cuando una cuenta de destino carga un archivo de plantilla que pertenece a la cuenta de origen, el usuario de la cuenta de destino no puede acceder a la plantilla de la cuenta de origen. Para resolver este problema, copia el archivo de plantilla en el bucket de S3 para que el propietario del bucket tenga acceso completo a la plantilla.
Para dar acceso al bucket, ejecuta el siguiente comando put-object de la AWS CLI:
aws s3api put-object --bucket amzn-s3-demo-bucket --key key-name --body path-to-file --acl bucket-owner-full-control
Nota: Sustituye amzn-s3-demo-bucket por tu bucket, key-name por el nombre de tu clave y path-to-file por la ruta a tu archivo.
Para obtener más información sobre las listas de control de acceso (ACL), consulta Control de la propiedad de los objetos y desactivación de las ACL del bucket.