代码之家  ›  专栏  ›  技术社区  ›  aviv

配置AWS Lambda以访问S3存储桶

  •  5
  • aviv  · 技术社区  · 7 年前

    我就是不知道我的 “拒绝访问”

    Bucket策略 :

    {
        "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]/*"
            }
        ]
    }
    

    我一直在

    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)"
        ]
    }
    

    这是我的

    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策略 我正在考虑尝试另一种解决方案并放弃AWS。

    有什么想法吗?

    1 回复  |  直到 7 年前
        1
  •  9
  •   Ashan    7 年前

    您需要创建IAM角色,并使用将其附加到Lambda函数 S3FullAccess

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

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