【问题标题】:Configuring AWS Lambda to access S3 Bucket配置 AWS Lambda 以访问 S3 存储桶
【发布时间】:2017-09-17 23:36:46
【问题描述】:

我只是不知道我在 AWS 中的 Bucket Policy 出了什么问题。试图让 Lambda 函数访问和读取来自 S3 存储桶的电子邮件。但我不断收到“拒绝访问”

请注意,我注意到该电子邮件文件正在存储桶中创建。这是我最新版本的存储桶政策

{
    "Version": "2012-10-17",
    "Id": "Lambda access bucket policy",
    "Statement": [
        {
            "Sid": "All on objects in bucket lambda",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::[MY NUMBER]:root"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::[MY BUCKET NAME]/*"
        }
    ]
}

我也尝试过 "Principal": {"Service": "ses.amazonaws.com"},唉

我不断收到拒绝访问

2017-09-17T14:12:14.231Z 10664101-9bb2-11e7-ad43-539f3e1a8626
{
    "errorMessage": "Access Denied",
    "errorType": "AccessDenied",
    "stackTrace": [
        "Request.extractError (/var/runtime/node_modules/aws-sdk/lib/services/s3.js:577:35)",
        "Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:105:20)",
        "Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:77:10)",
        "Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:683:14)",
        "Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22:10)",
        "AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12)",
        "/var/runtime/node_modules/aws-sdk/lib/state_machine.js:26:10",
        "Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:38:9)",
        "Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:685:12)",
        "Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:115:18)"
    ]
}

这是我的 Lambda 函数

var AWS = require('aws-sdk');
var s3 = new AWS.S3();

var bucketName = '[MY BUCKET NAME]';

exports.handler = function(event, context, callback) {
    console.log('Process email');

    var sesNotification = event.Records[0].ses;
    if(!sesNotification) {
        callback(null, null);
        return;
    }

    console.log("SES Notification:\n", JSON.stringify(sesNotification, null, 2));

    // Retrieve the email from your bucket
    s3.getObject({
            Bucket: bucketName,
            Key: sesNotification.mail.messageId
        }, function(err, data) {
            if (err) {
                console.log(err, err.stack);
                callback(err);
            } else {
                console.log("Raw email:\n" + data.Body);

                // Custom email processing goes here

                callback(null, null);
            }
        });
};

经过很长时间和许多版本的 Bucket Policy 我正在考虑尝试另一种解决方案并放弃 AWS。

有什么想法吗?

【问题讨论】:

    标签: amazon-web-services amazon-s3 aws-lambda bucket amazon-policy


    【解决方案1】:

    您需要创建一个 IAM 角色并将其附加到具有 S3FullAccess 策略或特定存储桶和操作的细化权限的 Lambda 函数(推荐)。

    还要确保将信任关系配置添加到角色中。

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Action": "sts:AssumeRole",
          "Effect": "Allow",
          "Principal": {
            "Service": [
              "lambda.amazonaws.com"
            ]
          }
        }
      ]
    }
    

    注意:在您当前的设置中,您似乎已经配置了授予 root 用户读取权限的存储桶策略。

    【讨论】:

    • 感谢您的回答。我创建了一个具有 fullS3Access 的 IAM 用户。但是我找不到将其附加到 Lambda 函数的位置,也找不到将其添加到 S3 存储桶的位置...
    • 您需要创建一个 IAM 角色而不是一个用户,并且还需要在角色中添加对 Lambda 的信任关系(除了策略)。检查更新的答案
    • 两者都做了。仍然得到“拒绝访问”。我的 Policy Bucket Principal 应该是什么?
    • 用于测试目的。首先从 S3 中删除您添加的存储桶策略。创建一个具有 s3 完全访问权限和上述信任关系的 iam 角色。然后将角色附加到 lambda 并试用?
    • 谢谢。现在我得到“特定密钥不存在”,这是另一个问题:-)
    猜你喜欢
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 2016-11-16
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多