AWS Lambda 在 VPC 中触发 SES

Ste*_* Z. 0 amazon-web-services amazon-vpc aws-lambda

我有一个位于 VPC 中的 lambda 函数,具有以下输入/输出绑定规则。 入站规则

出站规则

在函数内部,目标是触发电子邮件,因此如下所示:

const aws = require('aws-sdk');
const ses = new aws.SES({ region: 'us-west-2' });
                
ses.sendEmail(params, function (err, data) {
    if (err) {
        console.log(err);
    }
});
Run Code Online (Sandbox Code Playgroud)

然而; 当我触发该函数时,没有打印错误,并且任务超时。

原本该函数位于VPC之外,并且可以成功发送电子邮件。

我已经仔细检查了该函数的权限,其中包括 AWSLambdaVPCAccessExecutionRole。

有人知道这里发生了什么事吗?

小智 5

这样做的问题是 lambda 函数的代码没有到达 SES 端点的路径。

解决此问题的最简单方法是让该函数访问 Internet。尽管您授予安全组连接到 Internet 的权限,但无法访问 SES 端点,因为它没有可从中发送请求的公共 IP。

将功能置于 NAT 后面

解决这个问题最简单的方法是:

  1. NAT 网关放置在部署该功能的子网中,
  2. 在子网的路由表中附加一条规则,将所有流量定向到0.0.0.0/0NAT 网关。

有关NAT 网关的更多信息

请记住,这样做的优点是允许您的函数访问任何互联网资源,但也有通过公共互联网路由流量的缺点。

在您的 VPC 中创建终端节点

该解决方案虽然更干净、更现代,但涉及许多步骤,我建议您坚持使用第一个解决方案。

VPC 终端节点本质上是一种访问 AWS 服务(或来自 AWS Marketplace 的服务)而不让流量离开 VPC 的方法。

这是通过将 VPC 中的私有 IP 分配给该服务的“私有链接”来实现的。

如果您想采用此路径,请从此页面开始阅读接口 VPC 终端节点