【问题标题】:AWS lambda function invocating S3.getObject getting Access Denied调用 S3.getObject 的 AWS lambda 函数被拒绝访问
【发布时间】:2016-09-29 01:08:03
【问题描述】:

我正在使用 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:::*"
      ]
    }
  ]
}

【问题讨论】:

  • 存储桶策略是什么?
  • 我拥有 s3 完全访问权限。

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


【解决方案1】:

当 Lambda 在尝试使用 S3 时收到拒绝访问错误时,这几乎总是 Lambda 角色策略的问题。一般来说,您需要这样的东西才能从 Lambda 授予对 S3 存储桶的访问权限:

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

【讨论】:

  • 我的 lambda 配置了类似的策略,我认为问题出在 s3 策略
  • 什么是桶策略?您可以使用 aws s3api get-bucket-policy --bucket mybucket --output text 从 CLI 访问它
  • 我收到了A client error (NoSuchBucketPolicy) occurred when calling the GetBucketPolicy operation: The bucket policy does not exist
  • 如果存储桶没有存储桶策略,问题可能出在 lambda 的角色策略上。可以发一下吗?
  • 我在我的问题中添加了策略,我认为我无法检查我的存储桶策略的原因是我不是管理员,因为我的系统管理员已为我授予完整的 s3 策略.
【解决方案2】:

我的灵感来自这个答案:Reference to error

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

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

通过在键设置中为 images/ 指定前缀,我应该在我的正则表达式设置中这样做。

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-06-27
      • 2020-09-30
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 2023-03-25
      • 1970-01-01
      相关资源
      最近更新 更多