¿Por qué aparecen errores de acceso denegado cuando utilizo una función de Lambda para subir archivos a un bucket de Amazon S3 en otra cuenta de AWS?

4 minutos de lectura
0

Aparece un error de acceso denegado cuando utilizo una función de AWS de Lambda para subir archivos a un bucket de Amazon Simple Storage Service (Amazon S3). El bucket de Amazon S3 está en otra cuenta de AWS. 

Descripción breve

Si los permisos entre una función de Lambda y un bucket de Amazon S3 están incompletos o son incorrectos, Lambda devuelve un error de Acceso denegado.

Para configurar los permisos entre una función Lambda en una cuenta (cuenta 1) y un bucket de S3 en otra cuenta (cuenta 2), haga lo siguiente:

1.    (En la cuenta 1) Cree un rol de ejecución de Lambda que permita a la función de Lambda subir objetos a Amazon S3.

2.    (En la cuenta 2) Modifique la política de bucket del bucket de S3 para permitir que la función de Lambda cargue objetos al bucket.

Resolución

Importante: La siguiente solución requiere una función de Lambda en una cuenta de AWS y un bucket de S3 en otra cuenta.

Código de ejemplo para una función de Lambda que carga archivos a un bucket de S3 (versión 3.8 de Python)

import json
            import boto3

            s3 = boto3.client('s3')

            def lambda_handler(event,context):
            bucket = 'AccountBBucketName'
            transactionToUpload = {}
            transactionToUpload['transactionId'] = '12345'
            transactionToUpload['type'] = 'PURCHASE'
            transactionToUpload['amount'] = 20
            transactionToUpload['customerId'] = 'CID-1111'

            filename = 'CID-1111'+'.json'
            uploadByteStream = bytes(json.dumps(transactionToUpload).encode('UTF-8'))
            s3.put_object(Bucket=bucket, Key=filename, Body=uploadByteStream, ACL='bucket-owner-full-control')
            print("Put Complete")

Nota: Antes de pasar la ACL de control total del propietario del bucket en la solicitud de carga, confirme que las ACL no estén desactivadas en el bucket. Haga esto en la configuración de propiedad del bucket de S3. Para obtener más información, consulte Controlar la propiedad de los objetos y deshabilitar las ACL de su bucket

(En la cuenta 1) Cree un rol de ejecución de Lambda que permita a la función de Lambda subir objetos a Amazon S3

1.    Cree un rol de AWS Identity y Access Management (IAM) para su función de Lambda.

2.    Copie el nombre de recurso de Amazon (ARN) del rol de IAM.

Nota: Debe obtener el ARN del rol de IAM antes de poder actualizar la política de bucket del bucket de S3. Una forma de obtener el ARN del rol de IAM es ejecutar el comando get-role de AWS Command Line Interface (AWS CLI). Si recibe errores al ejecutar los comandos de la AWS CLI, asegúrese de utilizar la versión más reciente de la AWS CLI.

3.    Adjunte una política al rol de IAM que otorgue el permiso para cargar objetos (S3:PutObject) al bucket de la cuenta 2.

Ejemplo de política de IAM que otorga permisos a los roles de IAM s3:PutObject y s3:PutObjectACL

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Resource": "arn:aws:s3:::AccountBBucketName/*"
    }
  ]
}

4.    Cambie el rol de ejecución de la función Lambda por el rol de IAM que creó. Para obtener instrucciones, consulte Configuración de las opciones de la función de Lambda.

(En la cuenta 2) Modifique la política de bucket del bucket de S3 para permitir que la función de Lambda cargue objetos al bucket

Actualice la política de bucket para que especifique el ARN del rol de ejecución de Lambda como principal que tiene acceso a la acción S3:PutObject.

Ejemplo de política de bucket de S3 que permite a una función de Lambda cargar objetos al bucket

**Nota:**La siguiente política también otorga a la función de ejecución de la función de Lambda el permiso a s3:PutObjectAcl.

{
            "Version": "2012-10-17",
            "Statement": [
            {
            "Effect": "Allow",
            "Principal": {
            "AWS": "arn:aws:iam::AccountA:role/AccountARole"
            },
            "Action": [
            "s3:PutObject",
            "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::AccountBBucketName/*",
            "Condition": {
            "StringEquals": {
            "s3:x-amz-acl": "bucket-owner-full-control"
            }
            }
            }
            ]
            }

Información relacionada

¿Cómo soluciono los errores de acceso denegado 403 de Amazon S3?

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año