AWS lambda函数调用S3.getObject被拒绝访问

Lin*_*ang 1 lambda amazon-s3 amazon-web-services node.js

我正在使用 lambda 函数来缩略图 s3 存储桶中的图像。我在这里找到了一个示例:Image conversion using Amazon Lambda and S3 in Node.js。但是,重构代码后,调用 s3.getObject() 时访问被拒绝。我检查了我的 IAM 策略是否错误地授予了权限,但我拥有对 Lambda、S3 和 CloudFront 的完全访问权限。下面是抛出异常的方式:

async.waterfall([

    function download(next) {
        console.log(srcBucket+ "  "+srcKey);
        s3.getObject({
            Bucket: srcBucket,
            Key: srcKey
        }, next);
        console.log(srcBucket+ "  "+srcKey+ "After");
    }

], function(err, result) {
    if (err) {
        console.error(err);
    }
    // result now equals 'done'
    console.log("End of step " + key);
    callback();
});
Run Code Online (Sandbox Code Playgroud)

另外,我的 matchng 正则表达式设置与示例相同:

var srcBucket = event.Records[0].s3.bucket.name;
var typeMatch = srcKey.match(/\.([^.]*)$/);
var fileName = path.basename(srcKey);
if (!typeMatch) {
    console.error('unable to infer image type for key ' + srcKey);
    return;
}
var imageType = typeMatch[1].toLowerCase();
if (imageType != "jpg" && imageType != "gif" && imageType != "png" &&
    imageType != "eps") {
    console.log('skipping non-image ' + srcKey);
    return;
}
Run Code Online (Sandbox Code Playgroud)

我的 Lambda 政策是:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::*"
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

ata*_*lor 5

当 Lambda 在尝试使用 S3 时收到访问被拒绝错误时,几乎总是 Lambda 的角色策略出现问题。一般来说,您需要类似这样的内容来授予 Lambda 对 S3 存储桶的访问权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::mybucket",
                "arn:aws:s3:::mybucket/*"
            ],
            "Effect": "Allow"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)