AWS Lambda 在 VPC 中触发 SES

AWS Lambda triggers SES in VPC

我有一个位于 VPC 中的 lambda 函数,具有以下 in/out 绑定规则。

在函数内部,目标是触发一封电子邮件,所以是这样的:

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 端点的路径。

解决此问题的最简单方法是为该函数提供 Internet 访问权限。 虽然您授予安全组连接到互联网的权限,但无法访问 SES 端点,因为它没有 public IP 来发送请求。

将功能置于 NAT 之后

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

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

有关 NAT gateways

的更多信息

请记住,这样做的优点是允许您的函数访问任何 Internet 资源,但缺点是通过 public Internet 路由流量。

正在您的 VPC 中创建端点

这个解决方案虽然更简洁、更现代,但涉及很多步骤,我建议您坚持使用第一个解决方案。

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

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

如果您想走这条路,请从本页开始阅读 Interface VPC endpoints

我做了很多研究如何解决“Lambda 将无法访问 internet/SES/S3/...”的问题,因为 我不想花钱在 NAT 网关 上。这是我的解决方案。

  1. 您需要 2 个 Lambda(VPC 内 1 个,VPC 外 1 个)
  2. 我的第一个 Lambda 执行 VPC 作业(在我的例子中请求 RDS)
  3. 我第一个 lambda 的结果 post 到 SNS 主题(您需要设置 VPC endpoint for SNS
  4. SQS 队列订阅了 SNS 主题
  5. 我的第二个 Lambda 侦听 SQS 队列并完成其余的“Internet 作业”

这样我就不用设置 NAT 网关了,每个月省下那 30 块钱。像这样,您可以调用 SES 函数,例如 listIdentity 等等...