Accès refusé sur la fonction aws lambda lorsque getObject à partir du compartiment S3

J’utilise le code par défaut pour une fonction lambda:

console.log('Loading function'); var aws = require('aws-sdk'); var s3 = new aws.S3({ apiVersion: '2006-03-01' }); exports.handler = function(event, context) { //console.log('Received event:', JSON.ssortingngify(event, null, 2)); // Get the object from the event and show its content type var bucket = event.Records[0].s3.bucket.name; var key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' ')); var params = { Bucket: bucket, Key: key }; s3.getObject(params, function(err, data) { if (err) { console.log(err); var message = "Error getting object " + key + " from bucket " + bucket + ". Make sure they exist and your bucket is in the same region as this function."; console.log(message); context.fail(message); } else { console.log('CONTENT TYPE:', data.ContentType); context.succeed(data.ContentType); } }); }; 

Cependant, je reçois une erreur d’access refusé:

 2016-02-24T14:21:21.503Z kvyo1midvc2r69gm Loading function START RequestId: baf9049b-db01-11e5-bc34-791df91353a9 Version: $LATEST 2016-02-24T14:21:22.500Z baf9049b-db01-11e5-bc34-791df91353a9 { [AccessDenied: Access Denied] message: 'Access Denied', code: 'AccessDenied', region: null, time: Wed Feb 24 2016 14:21:22 GMT+0000 (UTC), requestId: '215CD9BB4094E209', extendedRequestId: '0kDBEyMiJYbMApEqJuAtKct2SKLI7Z7tCBVyW6QJsYwMHROvtCEDynbGSsBdqbwFcX+YrSlGnsg=', statusCode: 403, retryable: false, retryDelay: 30 } 2016-02-24T14:21:22.539Z baf9049b-db01-11e5-bc34-791df91353a9 Error getting object {"originalFilename":"c12eaadf3d3b46d9b5ded6c078534c11","versions":[{"Size":1024,"Crop":null,"Max":false,"Rotate":0}]} from bucket xmovo.originalimages.develop. Make sure they exist and your bucket is in the same region as this function. 2016-02-24T14:21:22.539Z baf9049b-db01-11e5-bc34-791df91353a9 { "errorMessage": "Error getting object {\"originalFilename\":\"c12eaadf3d3b46d9b5ded6c078534c11\",\"versions\":[{\"Size\":1024,\"Crop\":null,\"Max\":false,\"Rotate\":0}]} from bucket xmovo.originalimages.develop. Make sure they exist and your bucket is in the same region as this function." } END RequestId: baf9049b-db01-11e5-bc34-791df91353a9 REPORT RequestId: baf9049b-db01-11e5-bc34-791df91353a9 Duration: 723.44 ms Billed Duration: 800 ms Memory Size: 128 MB Max Memory Used: 34 MB 

Ma fonction lambda et mon compartiment S3 se trouvent dans la même région “US Standart” et “us-east-1”, qui sont identiques.

Les permissions IAM sont acceptables pour la fonction lambda, ce qui permet d’obtenir une action GetObject (elle est définie avec l’assistant qui crée la fonction lambda).

avec tout ce que je vérifie je n’ai aucune idée pourquoi je reçois toujours l’erreur d’access refusé

Merci d’avance

En regardant la sortie de votre journal, je peux voir que la variable key contient la chaîne suivante:

 {\"originalFilename\":\"c12eaadf3d3b46d9b5ded6c078534c11\",\"versions\":[{\"Size\":1024,\"Crop\":null,\"Max\":false,\"Rotate\":0}]} 

Je suppose que vous vouliez que cette variable contienne la chaîne "c12eaadf3d3b46d9b5ded6c078534c11" .

S3 renverra une réponse d’erreur 403 si vous n’avez pas access ou si la clé n’existe pas. Renvoyer “access refusé” dans les deux cas est une fonction de sécurité qui empêche les attaquants de découvrir quelles clés existent réellement dans votre compartiment.

Je pense que vous devez changer cette ligne:

 decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' ')); 

à quelque chose comme ça:

 decodeURIComponent(event.Records[0].s3.object.key.originalFilename.replace(/\+/g, ' ')); 

Vérifiez les permissions IAM du rôle que vous souhaitez utiliser. Peut-être existe-t-il des permissions au-dessus des permissions accordées.