AWS Lambda 在 VPC 中触发 SES

问题描述 投票:0回答:3

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

OutBound Rule

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

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。

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

amazon-web-services aws-lambda amazon-vpc
3个回答
5
投票

问题在于 lambda 函数的代码没有到达 SES 端点的路径。

解决此问题的最简单方法是让该功能访问互联网。 尽管您授予安全组连接到互联网的权限,但无法到达 SES 端点,因为它没有公共 IP 来发送请求。

将功能置于 NAT 后面

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

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

有关 NAT 网关的更多信息

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

在您的 VPC 中创建终端节点

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

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

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

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


5
投票

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

  1. 您需要 2 个 Lambda(1 个位于 VPC 内,1 个位于 VPC 外)
  2. 我的第一个 Lambda 执行 VPC 作业(在我的例子中请求 RDS)
  3. 我发布到 SNS 主题的第一个 lambda 的结果(您需要设置 SNS 的 VPC 端点
  4. SQS 队列订阅了 SNS 主题
  5. 我的第二个 Lambda 监听 SQS 队列并完成其余的“互联网工作”

这样我就不用设置 NAT 网关了,每个月可以节省 30 美元🤘。像这样你可以调用 SES 函数,如

listIdentity
等等...


0
投票

我走的是2 Labda路线,和Sebastian一样。两者都是由 AWS CDK 通过 python 创建的。一份 labmda 在 vpc 内,一份没有,并提供 Lambda VPC 端点内的一份。 ChatGPT 擅长帮助设置这一切。

我还让 CDK 创建了一个令牌并将其放入双方都可以访问的秘密中。这样,您还可以将令牌从一个令牌传递到另一个令牌并验证它,所有这些都是自动化的。

如果可以的话,避免使用 NAT 网关。他们是一个钱坑。

© www.soinside.com 2019 - 2024. All rights reserved.