2

AWSのバケットポリシーで何が問題なのか分かりません。ラムダ関数にS3バケットからの電子メールにアクセスして読むことを許可しようとしています。しかし、私は"アクセスが拒否されました"S3バケットにアクセスするためのAWSラムダの設定

電子メールファイルがバケット内に作成されていることに気づきました。ここでバケットポリシーの私の最後のバージョンは次のとおりです。

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

私は「校長」とも試してみました:{「サービス」:「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)" 
    ] 
} 

そして、ここでは私のラムダ関数です

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); 
      } 
     }); 
}; 

長時間、多くのバージョンのバケットポリシー私は別のソリューションを試してAWSを削除しようと考えています。

アイデア?

答えて

4

IAMロールを作成し、S3FullAccessポリシーを使用してラムダ機能に接続するか、特定のバケットおよびアクション(細かい許可)を使用して細かい許可を付与する必要があります。

また、信頼関係が役割に追加されていることを確認してください。

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

注:現在の設定では、ルートユーザーに読み取りアクセスを許可するバケットポリシーを設定したようです。

+0

答えに感謝します。私はfullS3AccessでIAMユーザーを作成しました。しかし、私はどこにラムダ関数にアタッチするのか見つけられませんでしたが、S3バケットにはどこに追加できますか... – aviv

+0

ユーザーの代わりにIAMロールを作成し、ロール内のラムダの信頼関係を追加する必要があります(ポリシーとは別に)。更新された回答 – Ashan

+0

を確認してください。それでも「アクセスが拒否されました」。私のPolicy Bucket Principalは何ですか? – aviv

関連する問題