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

时间:2016-05-31 06:43:55

标签: node.js amazon-web-services amazon-s3 lambda

我正在使用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();
});

另外,我的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;
}

我的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:::*"
      ]
    }
  ]
}

3 个答案:

答案 0 :(得分:1)

当Lambda在尝试使用S3时出现Access Denied错误时,Lambda的角色策略几乎总是存在问题。通常,您需要这样的东西才能从Lambda授予对S3存储桶的访问权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::mybucket",
                "arn:aws:s3:::mybucket/*"
            ],
            "Effect": "Allow"
        }
    ]
}

答案 1 :(得分:0)

我得到了这个答案的灵感:Reference to error

因此,我将测试事件更改为:

"s3": {
        "configurationId": "testConfigRule",
        "object": {
          "eTag": "0123456789abcdef0123456789abcdef",
          "sequencer": "0A1B2C3D4E5F678901",
          "key": "images/HappyFace.jpg",
          "size": 1024
        }

通过给出图像/键设置的前缀,我应该在我的正则表达式设置中完成。

此错误消息确实令人困惑,请先检查您的政策,然后尝试提供完整路径作为您的密钥。

答案 2 :(得分:0)

对于那些回答了这个问题并检查了以下所有步骤的人:

  1. 资源定义对于操作“s3:*”是正确的
"Resource": [
    "arn:aws:s3:::mybucket",
    "arn:aws:s3:::mybucket/*"
]
  1. Lambda 角色具有 S3 权限(可能是 S3FullAccess)
  2. 文件在存储桶中(未找到则抛​​出 403)且存储桶和对象键信息正确
  3. S3 对象级别的读取权限不会被覆盖。

还有一个额外的步骤可以解决我的问题。您可能需要检查 IAM 角色定义以删除是否有任何权限边界块到达 S3。您也可以查看 Permission Boundary Documentation 了解更多信息。