AWS:通过SES从Lambda发送电子邮件

时间:2016-07-14 16:07:25

标签: java amazon-web-services aws-lambda amazon-ses

每当我尝试从Lambda(使用Java)发送带有SES的电子邮件时,它都会失败 - 连接超时。

我在与Lambda函数相同的VPC中测试了与EC2实例完全相同的代码,并且它在那里工作(它们具有相同的角色分配)。我也试过运行Lambda函数,而不是在VPC中(虽然它无论如何都需要在一个中)并且它也不起作用。

这里是代码的相关位

    SendEmailRequest request = new SendEmailRequest().withSource(from)
                                                     .withDestination(destination)
                                                     .withMessage(message);

    try {
        System.out.println("Attempting to send an email through Amazon SES by using the AWS SDK for Java...");

        if (client == null) {
            client = new AmazonSimpleEmailServiceClient();
            client.setRegion(Region.getRegion(Regions.EU_WEST_1));
        }

        client.sendEmail(request); // this is where the exception is thrown
        System.out.println("Email sent!");
    } catch (Exception ex) {
        ex.printStackTrace();
        System.err.println(ex.getMessage());
    }
}

错误消息指出由于超时而未能连接(到email.eu-west-1 ...)。

为什么它不能使用Lambda的任何想法?

1 个答案:

答案 0 :(得分:2)

我最终得到了这个领域的某些人的帮助 - 我的问题中缺少了解决问题所必需的信息,因此这里有关于如何设置以使其正常工作的指南。还要注意的是,我实际上无法在VPC之外运行Lambda函数 - 当你删除自己的时,它只是被分配了一个默认值,我没有意识到。

首先,这是附加到您的Lambda函数角色的最小策略,只需要发送电子邮件(您可以根据您实际使用的内容删除其中一个发送选项,当然您也可以限制资源)。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ses:SendEmail",
                "ses:SendRawEmail",
                "ec2:CreateNetworkInterface"
            ],
            "Resource": "*"
        }
    ]
}

我会尝试引导您完成现在需要创建的资源。首先,您需要一个可用于NAT网关的子网。

打开VPC仪表板并创建一个子网,给它一个有用的标签,这样你就知道它是你的NAT的子网。将它放在与Lambda函数相同的VPC中。

接下来,您需要设置路由表,使其具有(已存在的)本地路由(取决于您的VPC)以及以Internet网关为目标的默认路由0.0.0.0/0。如果您没有,请转到“Internet网关”部分并创建一个。

现在,您需要创建NAT网关。您可以在EC2上进行设置,但我使用VPC仪表板的NAT网关部分来避免管理另一个EC2实例。将它放在刚刚创建的子网中,并为其分配一个公共IP(您只需创建一个新的EIP)。

为Lambda函数设置两个子网(一个足够,但AWS推荐两个用于可用性)。这两个将共享一个路由表,其中包含本地路由(当然)和目标是您刚创建的NAT网关的默认路由。

您现在应该可以从Lambda函数发送电子邮件了!上述步骤是必需的,因为Lambda函数只有私有IP - 要访问SES,您需要一个公共的,NAT网关为您的Lambda函数提供。

相关问题