Saltar al contenido

Evento Lambda del bucket de S3: no se pueden validar las siguientes configuraciones de destino

Solución:

Recibe este mensaje porque a su depósito s3 le faltan permisos para invocar su función lambda.

¡Según la documentación de AWS! Hay dos tipos de permisos necesarios:

  1. Permisos para que su función Lambda invoque servicios
  2. Permisos para que Amazon S3 invoque su función Lambda

Debería crear un objeto de tipo ‘AWS :: Lambda :: Permission’ y debería verse similar a esto:

{
  "Version": "2012-10-17",
  "Id": "default",
  "Statement": [
    {
      "Sid": "<optional>",
      "Effect": "Allow",
      "Principal": {
        "Service": "s3.amazonaws.com"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "<ArnToYourFunction>",
      "Condition": {
        "StringEquals": {
          "AWS:SourceAccount": "<YourAccountId>"
        },
        "ArnLike": {
          "AWS:SourceArn": "arn:aws:s3:::<YourBucketName>"
        }
      }
    }
  ]
}

Finalmente miré esto de nuevo después de un año. Este fue un proyecto de hackathon del año pasado que revisamos. La respuesta de @davor.obilinovic fue muy útil para señalarme el permiso de Lambda que necesitaba agregar. Todavía me tomó un poco descubrir exactamente cómo necesitaba que se viera.

Aquí están los documentos de AWS JavaScript SDK y Lambda API https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html#addPermission-property https://docs.aws.amazon.com/lambda/latest /dg/API_AddPermission.html

Los documentos de JS SDK tienen esta línea:

SourceArn: "arn:aws:s3:::examplebucket/*",

No pude hacerlo funcionar durante mucho tiempo y todavía estaba obteniendo el Unable to validate the following destination configurations error.

Cambiándolo a

SourceArn: "arn:aws:s3:::examplebucket",

solucionó ese problema. los /* aparentemente estaba equivocado y debería haber examinado la respuesta que obtuve aquí más de cerca, pero estaba tratando de seguir los documentos de AWS.

Después de desarrollar por un tiempo y crear muchos depósitos, permisos Lambda y notificaciones S3 Lambda, llamar a addPermission comenzó a generar un The final policy size (...) is bigger than the limit (20480). Agregar permisos nuevos e individuales para cada depósito los agrega al final de la Política de función de Lambda y aparentemente esa política tiene un tamaño máximo.

La política no parece editable en la Consola de administración de AWS, así que me divertí borrando cada entrada con el SDK. Copié la política JSON, saqué el Sidsale y llama removePermission en un bucle (que arrojó errores de límite de velocidad y tuve que ejecutarlo muchas veces).

Finalmente descubrí que omitiendo el SourceArn le dará permiso a Lambda para todos los buckets de S3.

Aquí está mi código final usando el SDK para agregar el permiso que necesitaba. Solo ejecuté esto una vez para mi función.

const aws = require('aws-sdk');

aws.config.update({
  accessKeyId:     process.env.AWS_ACCESS,
  secretAccessKey: process.env.AWS_SECRET,
  region:          process.env.AWS_REGION,
});

// Creates Lambda Function Policy which must be created once for each Lambda function
// Must be done before calling s3.putBucketNotificationConfiguration(...)
function createLambdaPermission() {
  const lambda = new aws.Lambda();

  const params = {
    Action:        'lambda:InvokeFunction',
    FunctionName:  process.env.AWS_LAMBDA_ARN,
    Principal:     's3.amazonaws.com',
    SourceAccount: process.env.AWS_ACCOUNT_ID,
    StatementId:   `example-S3-permission`,
  };

  lambda.addPermission(params, function (err, data) {
    if (err) {
      console.log(err);
    } else {
      console.log(data);
    }
  });
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *