2016-02-24 1 views
0

Я использую код по умолчанию для лямбда-функции:Доступ запрещен на функцию AWS лямбда при GetObject из S3 ведра

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.stringify(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); 
     } 
    }); 
}; 

Однако я получаю ошибки доступа:

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 

Мой лямбда функция и мой ведро S3 находятся в том же регионе «US Standart» и «us-east-1», которые одинаковы

Разрешение IAM нормально для лямбда-функции, что позволяет GetObject Action (устанавливается с помощью мастера T шляпа создать функцию лямбда)

со всем, что проверить я понятия не имею, почему я все еще получаю Access Denied Ошибка

Заранее спасибо

ответ

1

Глядя на свой выход журнала, я могу видеть, что переменная key содержит следующую строку:

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

Я предполагаю, что вы хотели, что переменная содержит строку "c12eaadf3d3b46d9b5ded6c078534c11".

S3 вернет ответ ошибки 403, если у вас нет доступа, или если ключ не существует. В обоих случаях возвращать «отказ в доступе» - это функция безопасности, которая позволяет злоумышленникам не узнать, какие ключи существуют на самом деле в вашем ковше.

Я думаю, что вам нужно изменить эту строку:

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

к чему-то вроде этого:

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

Проверьте IAM разрешения роли, которую вы хотите использовать, может быть, есть deny разрешения выше allow разрешений.

Смежные вопросы