VPC中的Lambda函数无法访问公共Internet

Pat*_*ham 10 amazon-web-services amazon-vpc aws-lambda

我试图从Lambda函数中向第三方服务发出出站API请求,但该函数总是超时而没有任何错误.

以前发生在尝试s3.putObject在不同的功能(仍在相同的VPC /子网内)中执行操作时,我设法通过添加带有服务名称的端点com.amazonaws.us-east-1.s3并将其连接到与之关联的路由表来解决这个问题.此Lambda函数所在的VPC.

在网络框 - >安全组部分内的Lambda仪表板中,我看到此警告:

启用VPC后,您的Lambda函数将失去默认的Internet访问权限.如果您的功能需要外部Internet访问,请确保您的安全组允许出站连接,并确保您的VPC具有NAT网关.

我相信这个安全组允许出站连接,基于下面的出站规则表:

在此输入图像描述

对于第二个要求,我可以确认此VPC具有NAT网关,因为在VPC仪表板上,在NAT网关选项卡中,出现的那个具有与之关联的VCP,并且该VPC与托管Lambda功能的VPC相同.

我按照指南创建了一个Flow Log来监控进出VPC的流量,希望看到这些出站请求确实被拒绝了.但是,在执行此操作并检查CloudWatch日志之后,所有记录都以ACCEPT OK或中结束NODATA.

如何授予我的VPC Lambda功能的互联网访问权限?是我最初试图遵循的指南,但我在第4步下陷入困境To create a public or private subnet:

  1. 从"更改为:"下拉菜单中,选择适当的路由表:对于私有子网,默认路由应指向NAT网关或NAT实例:

    目标:0.0.0.0/0目标:nat- ...(或eni- ...)对于公有子网,默认路由应指向Internet网关:

    目的地:0.0.0.0/0目标:igw- ...

对于此VPC中的所有四个子网,单击右侧的下拉列表Change to:仅显示一个选项,即已选择的选项rtb-xxxxxxxx.单击该路由表的链接,然后单击Summary旁边的Routes选项卡,我看到:

在此输入图像描述

我阻止Lambda函数访问Internet的错误是什么?

Nav*_*ngh 15

对于LAMBDA通过VPC访问互联网应该是在Private Subnet与NAT Gateway连接.

根据您的屏幕截图,附加到子网的路由表已igw-xxxxxxx附加,使您的当前子网成为a public subnet.

为了使事情有效,您可以执行以下操作:

  • 附加NAT Gateway而不是igw-xxxxxx当前的路由表subnet

要么

  • Elastic IP如果您想要访问互联网,请查找附加到您的Lambda的ENI并附上.

要么

根据@John Rotenstein,如果您的Lambda不需要VPC资源,您可以将Lambda移出VPC

  • @JohnRotenstein是的。导航到EC2仪表板上的“网络接口”。然后通过搜索附加到Lambda的安全组来找到“ ENI ID”(我确实是这样。。会有更好的方法)。现在您获得了“ ENI ID”。导航到“弹性IP”页面,分配并附加所需的IP。 (2认同)
  • @NavpreetSingh @JohnRotenstein-`Elastic IP => ENI`,这将起作用,但是每个请求lambda都会创建一个新的ENI并附加。对于连续的Internet访问,它将不起作用。 (2认同)

小智 6

您可能做错的一件事(这正是我做错的事情,但从上面的 @Ramratan Gupta 得到了提示)是将 NAT 网关放在私有子网中而不是公共子网中。

NAT 网关为您的私有 IP Lambda 函数提供互联网连接,因此 NAT 网关本身需要具有互联网访问权限并位于公共网络中,这是理所当然的。

总结一下:

  • 您必须创建至少两个子网:一个公共子网和一个私有子网。将两者放在同一个 VPC 中。

  • 使子网成为公共子网或私有子网的是0.0.0.0/0路由。

  • 您需要同时拥有互联网网关 (igw) 和 NAT 网关 (ngw)。

  • 要创建 NAT 网关,您需要弹性 IP。

    另外,这就是我做错的地方,您需要在公共网络中创建 NAT 网关。

  • igw 与 NAT 网关位于同一子网中:公共子网。

  • 您需要有两条路由:一条路由0.0.0.0/0引用 igw,另一条路由引用 ngw。

  • 然后,您需要将包含路由表的 NAT-route 与私有子网关联,并将包含路由表的 igw-route 与公有子网关联。请注意,在进行此关联之前,将一个子网设为公共子网和将子网设为私有子网之间没有区别。通过如何将子网与路由表关联起来,可以将一个子网设为私有,另一个设为公共。

  • 最后,您需要将 Lambda 函数连接到 VPC,并且仅连接到私有子网。这样,当您的 lambda 尝试访问互联网时,它会转到私有子网,查找路由0.0.0.0/0,该路由将其定向到公共子网中的 NAT 网关。然后,NAT 网关使用 igw 联系互联网(因为它们位于同一子网中),并在收到响应后将其返回到您的 Lambda 函数。

  • 另请注意,您的 Lambda 函数需要一些权限(AWS 会警告您)才能连接到 VPC。


sho*_*uro 5

大家好,我开发了分步教程,并提供了相关的明确屏幕截图:

第一部分

  1. 在AWS中创建Lambda函数
  2. 创建一个API网关以将所有请求重定向到您的AWS Lambda函数

https://medium.com/@shontauro/how-can-i-turn-my-restful-api-into-a-serverless-application-and-deploy-it-to-aws-lambda-step-by-ec7ce38e18be

第二部分

  1. 为Lambda功能配置VPC
  2. 以安全方式授予对lambda函数的Internet访问权限
  3. 将Node.js Restful API部署到Lambda函数中

https://medium.com/@shontauro/how-can-i-turn-my-restful-api-into-a-serverless-application-and-deploy-it-to-aws-lambda-step-by-8ff6cc97780f