如何让VPC中的AWS lambda发布SNS通知?

How to let AWS lambda in a VPC to publish SNS notification?

我有一个 lambda 函数,可以通过 VPC 访问我在 RDS 中的 Postgres 数据库。在查询数据库后,我想 post 向 SNS 发送通知。因为我的 lambda 函数存在于我的 VPC 中,所以它无法访问 SNS。我的 VPC 上有一个互联网网关。我通读了 VPC 端点文档,目前仅支持 s3。

有没有办法在 VPC 的 lambda 函数中发布到 SNS?

您的 VPC 中需要一个 NAT 服务器 运行 以将流量路由到 VPC 外部。 AWS 现在提供 managed NAT service 让这更容易。

我终于成功了...

诀窍是您必须有 2 个子网。

一个 public 一个,带有路由 table 将流量发送到您的 VPC 的互联网网关。把NAT放在那里。

还有一个私有的,具有将流量发送到 NAT 的路由 table。将 Lambda 表达式放在那里。 (顺便说一句,创建一个 public 子网意味着将自动分配 Public IP 选项设置为是。)

AWS 文档中的概览图对此进行了概述:

http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Scenario2.html#Configuration-2

我知道这是旧的,但对于那些不想配置 NAT 的人来说,这是另一个可行的选项。与其尝试在与 SNS 交互的 VPC 内部使用 lambda 函数,不如拆分为 2 个 lambda 函数,如下所示。

Function 1 位于 VPC 内部并与数据库交互,返回数据库交互的结果(例如,符合某些条件的 ID 列表)。

Function 2 位于 VPC 外部,调用 Function 1,然后处理值数组并发布适当的 SNS 通知(例如,根据列表中的每个 ID 发送消息)。

如果 SNS 有一个 VPC 端点就好了,但在 2016 年末,情况似乎并非如此。

更新

截至 2018 年 4 月,SNS 通过 AWS PrivateLink 支持 VPC Endpoints。因此,无需设置互联网网关或 NAT 实例即可让 VPC 内的 Lambda 函数发布 SNS 通知。

有关详细信息,请参阅 this 博客 post。