我有一个位于 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);
}
});
但是;当我触发该函数时,没有打印错误,并且任务超时。
原本该功能是在VPC外的,但可以成功发送电子邮件。
我已经仔细检查了该函数的权限,其中包括 AWSLambdaVPCAccessExecutionRole。
有人知道这里发生了什么事吗?
问题在于 lambda 函数的代码没有到达 SES 端点的路径。
解决此问题的最简单方法是让该功能访问互联网。 尽管您授予安全组连接到互联网的权限,但无法到达 SES 端点,因为它没有公共 IP 来发送请求。
解决此问题的最简单方法是:
0.0.0.0/0
到 NAT 网关。有关 NAT 网关的更多信息
请记住,这样做的优点是允许您的函数访问任何互联网资源,但也有通过公共互联网路由流量的缺点。
这个解决方案虽然更干净、更现代,但涉及许多步骤,我建议您坚持使用第一个解决方案。
VPC 终端节点本质上是一种访问 AWS 服务(或来自 AWS Marketplace 的服务)而不让流量离开 VPC 的方法。
这可以通过将 VPC 中的私有 IP 分配给该服务的“私有链接”来实现。
如果您想采用此路径,请从本页开始阅读接口 VPC 终端节点。
我做了很多研究如何解决“Lambda 将无法访问互联网/SES/S3/...”问题,因为我不想花钱购买 NAT 网关。这是我的解决方案。
这样我就不用设置 NAT 网关了,每个月可以节省 30 美元🤘。像这样你可以调用 SES 函数,如
listIdentity
等等...
我走的是2 Labda路线,和Sebastian一样。两者都是由 AWS CDK 通过 python 创建的。一份 labmda 在 vpc 内,一份没有,并提供 Lambda VPC 端点内的一份。 ChatGPT 擅长帮助设置这一切。
我还让 CDK 创建了一个令牌并将其放入双方都可以访问的秘密中。这样,您还可以将令牌从一个令牌传递到另一个令牌并验证它,所有这些都是自动化的。
如果可以的话,避免使用 NAT 网关。他们是一个钱坑。