aws lambda 函数中的 ses.sendMail() 不返回回调

sha*_*aun 2 node.js amazon-iam aws-lambda

亚马逊简单电子邮件服务 (Amazon SES)

我有以下代码。如果我从 aws ec2 实例或我的工作站使用它,它会完美运行。但是,一旦我将它添加到我在 AWS VPC 内部处理的 lambda 函数中,我的 ses.sendEmail() 回调就永远不会被调用。我从未在 CloudWatch 日志中看到该函数的“sendEmail 函数错误”或“sendEmail 函数成功”console.log(),并且我的 lambda 函数在超时期限结束时超时。我不知道我还能做什么。

我已经查找了可能需要添加的任何 IAM 角色或策略,但找不到任何需要提及的内容或要添加的内容。

尝试将策略“AmazonSESFullAccess”添加到该函数的 IAM 角色。仍然超时。

let aws = require('aws-sdk')
    , ses = new aws.SES({ apiVersion: '2010-12-01', region: 'us-west-2' })
    ;

sendEmail({
    To : [ 'anEmail@someone.com' , 'anotherEmail@somewhereElse.com'],
    From: 'ourSupportEmail@whereIWork.com',
    Subject: 'Sending An Email Out',
    Body: `<html> A Buch of HTML Here</html>`
}, function(err, result){
    if(err){
        console.error('SendEmail Error', err);
    } else {
        console.log('SendEmail Result', result);
    }
});


function sendEmail(emailObj, cb){
    emailObj.To.push('myEmail@whereIWork.com');

    let mailData = {
        Source: emailObj.From,
        Destination: { ToAddresses: emailObj.To },
        Message: {
            Subject: {
                Data: emailObj.Subject
            },
            Body: {
                Html: {
                    Data: emailObj.Body
                }
            }
        }
    }

    console.log('sending Email', JSON.stringify(mailData)); //see in Cloudwatch Logs! YEAH!!!
    ses.sendEmail(mailData, function(err, data){
        if(err){
            console.log('sendEmail Function Error', JSON.stringify(err)); // never see in cloudwatch logs, WHAT??
            cb(err);
        } else {
            console.log('sendEmail Function Success', JSON.stringify(data)); // never see in cloudwatch logs, WHAT??
            cb(null, data);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

joh*_*hni 5

您将 lambda 设置在 VPC 内,在这种情况下,该 VPC 无法访问互联网,因此也无法访问 AWS API。

如果你让你的 lambda 运行足够长 - 回调将被调用并出现connection timeout错误。

在此处按照我的详细回答进行操作。

  • VPC 有一个 Nat 网关和一个 Internet 网关,两者都指向 0.0.0.0/0,但仍然超时。但是,我发现我将 Nat 网关放置在私有子网内。将其切换到公共子网并且该功能成功完成。 (2认同)