Javascript 尝试访问上载到s3存储桶的文件时,lambda中的访问被拒绝

Javascript 尝试访问上载到s3存储桶的文件时,lambda中的访问被拒绝,javascript,node.js,amazon-s3,aws-lambda,Javascript,Node.js,Amazon S3,Aws Lambda,我从上个月收到的巨大帮助中走了出来 将文件上载到s3 bucket,触发lambda,该lambda发送包含上载到s3 bucket的文件信息的电子邮件 我之前已经测试过发送电子邮件,所以我知道这是可行的,但当我尝试包含上传数据时,它会引发错误 Could not fetch object data: { AccessDenied: Access Denied at Request.extractError (/var/runtime/node_modules/aws-sdk/lib/serv

我从上个月收到的巨大帮助中走了出来

将文件上载到s3 bucket,触发lambda,该lambda发送包含上载到s3 bucket的文件信息的电子邮件

我之前已经测试过发送电子邮件,所以我知道这是可行的,但当我尝试包含上传数据时,它会引发错误

Could not fetch object data:  { AccessDenied: Access Denied
at Request.extractError (/var/runtime/node_modules/aws-sdk/lib/services/s3.js:577:35)
at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:105:20)
at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:77:10)
at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:683:14)
我在网上发现了许多与此相关的关于角色等策略的q。因此,我将lambda添加到s3事件中,并将s3权限添加到角色中,例如

https://stackoverflow.com/questions/35589641/aws-lambda-function-getting-access-denied-when-getobject-from-s3
不幸的是,这些都没有帮助。然而,我注意到一条评论

Then the best solution is to allow S3FullAccess, see if it works. If it does, then remove one set of access at a time from the policy and find the least privileges required for your Lambda to work. If it does not work even after giving S3FullAccess, then the problem is elsewhere
那么,我如何才能找到问题所在呢

谢谢你

   'use strict';

console.log('Loading function');

var aws = require('aws-sdk');
var ses = new aws.SES({
   region: 'us-west-2'
});
//var fileType = require('file-type');

console.log('Loading function2');

var s3 = new aws.S3({ apiVersion: '2006-03-01', accessKeyId: process.env.ACCESS_KEY, secretAccessKey: process.env.SECRET_KEY, region: process.env.LAMBDA_REGION });

console.log('Loading function3');
//var textt = "";

exports.handler = function(event, context) {
    console.log("Incoming: ", event);

  //  textt = event.Records[0].s3.object.key;
   // var output = querystring.parse(event);

   //var testData = null;

   // Get the object from the event and show its content type
   // const bucket = event.Records[0].s3.bucket.name;
   // const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
    const params = {
       Bucket: 'bucket',
       Key: 'key',
    };

    s3.getObject(params, function(err, objectData) {
    if (err) {
        console.log('Could not fetch object data: ', err);
    } else {
        console.log('Data was successfully fetched from object');
        var eParams = {
            Destination: {
                ToAddresses: ["fake@fake.com"]
            },
            Message: {
                Body: {
                    Text: {
                        Data: objectData
                       // Data: textt
                    }
                },
                Subject: {
                    Data: "Email Subject!!!"
                }
            },
            Source: "fake@fake.com"
        };

        console.log('===SENDING EMAIL===');

        var email = ses.sendEmail(eParams, function(err, emailResult) {
            if (err) console.log('Error while sending email', err);
            else {
                console.log("===EMAIL SENT===");
                //console.log(objectData);
                console.log("EMAIL CODE END");
                console.log('EMAIL: ', emailResult);
                context.succeed(event);
            }
        });
    }
});

};
更新 我已经在代码中添加了注释并检查了日志…它没有超过这一行

var s3 = new aws.S3({ apiVersion: '2006-03-01', accessKeyId: process.env.ACCESS_KEY, secretAccessKey: process.env.SECRET_KEY, region: process.env.LAMBDA_REGION });
这是否与拒绝访问有关

注意:我想要上传文件的文件名

更新2

iv将导致问题的行替换为
var s3=new aws.s3().getObject({Bucket:this.awsBucketName,Key:'keyName',函数(err,data)
{
如果(!err)
log(data.Body.toString());
});

但这是作为
TypeError:s3.getObject不是函数激发的

还尝试了…
var s3=new aws.s3()


这返回到原始错误
无法获取对象数据:{AccessDenied:Access Denied

首先,区域应该是S3 bucket区域,而不是lambda区域。接下来,您需要验证您的凭据,以及他们是否可以访问您定义的S3 bucket。正如您在其中一条评论中所述,请尝试将S3完全访问Amazon托管策略附加到与凭据关联的IAM用户您正在Lambda中使用。下一步将使用aws cli查看是否可以访问此存储桶。可能类似于-

aws s3 ls

如上所述,您根本不应该使用凭据。因为Lambda和S3是amazon服务,所以您应该使用角色。只需为Lambda提供一个可以完全访问S3的角色,而不要为此使用aws IAM凭据。以及

var s3 = new AWS.S3();

足够了。

Hey Aniket。谢谢您的回复……所以……所有s3存储桶都是“全局”区域,所以我应该改为var ses=new aws.ses({region:'Global'})接下来,我没有意识到我必须向用户添加权限……我只是将它们添加到创建bucket时使用的角色中……因此,我也向用户添加了“awsLambdaFullAccess、AmazonS3完全访问、管理员访问和AmazonSE完全访问”……我已经尝试了所有这些,再次感谢您,但我仍然获得了access deniedI我认为访问bucket是可行的,因为如果我将捕获文件细节的代码放入房间,然后将图片上传到s3 bucket,它会触发lambda并发送电子邮件…所以这一切都是可行的。就在我尝试获取上传文件名时,我被AccessDenied击中了。你怎么说访问bucket是可行的当它真的失败时?当你上传一些东西到S3时,你会被事件触发lambda并发送邮件。lambda没有对你有效的S3交互。正如我之前所说的,使用角色并完全避免凭据。如果我让lambda保持原来的状态,它只发送一封电子邮件。这个lambda连接到一个触发器以S3 bucket…当我将图像上传到bucket时,它会触发lambda并发送一封电子邮件…这是有效的…那么这不意味着访问bucket是有效的吗?只有当我尝试添加代码以获取上传到bucket的内容时,它才失败。很抱歉,但据我所知,你所说的凭据是什么意思?我没有使用凭证im使用角色…在s3存储桶中,我在访问控制列表中添加了“公共访问”,在lambda中,我添加了iam执行角色,该角色可以访问AWSLAMBDAFULLCESS、Amazons3Fullaccess、administratorAccess、AmazonSesFUllAccess…再次感谢您的帮助,但您知道我做错了什么吗