【发布时间】:2018-10-20 22:59:13
【问题描述】:
我正在尝试从 Lambda 函数中向第三方服务发出出站 API 请求,但该函数总是超时且没有任何错误。
这之前发生在尝试在不同的函数中执行 s3.putObject 操作时(仍在同一个 VPC/子网中),我设法通过添加一个服务名称为 com.amazonaws.us-east-1.s3 的端点并连接它来解决这个问题到与此 Lambda 函数所在的 VPC 关联的路由表。
在网络框内的 Lambda 仪表板 -> 安全组部分,我看到以下警告:
当您启用 VPC 时,您的 Lambda 函数将失去默认互联网 使用权。如果您的功能需要外部互联网访问, 确保您的安全组允许出站连接并且 您的 VPC 有一个 NAT 网关。
我相信这个安全组允许出站连接,基于下面的出站规则表:
对于第二个要求,我可以确认此 VPC 具有 NAT 网关,因为在 VPC 仪表板的 NAT 网关选项卡中,出现在那里的 VCP 具有与之关联的 VCP,并且该 VPC 与托管Lambda 函数。
我按照指南创建了一个Flow Log 来监控进出 VPC 的流量,希望看到这些出站请求确实被拒绝了。但是,在这样做并检查 CloudWatch 日志后,所有记录都以 ACCEPT OK 或 NODATA 结尾。
How can I grant internet access to my VPC Lambda function? 是我最初尝试遵循的指南,但我在To create a public or private subnet 下的第 4 步卡住了:
从更改为:下拉菜单中,选择适当的路由表: 对于私有子网,默认路由应指向 NAT 网关 或 NAT 实例:
目的地:0.0.0.0/0 目标:nat-...(或 eni-...) 对于公共子网, 默认路由应指向 Internet 网关:
目的地:0.0.0.0/0 目标:igw-…
对于此 VPC 中的所有四个子网,单击 Change to: 右侧的下拉菜单仅显示一个选项,即已选择的选项 rtb-xxxxxxxx。单击该路由表的链接并单击摘要旁边的路由选项卡后,我看到了:
我做错了什么会阻止 Lambda 函数访问 Internet?
【问题讨论】:
-
您的 Lambda 函数是否需要访问 VPC 中的资源?如果没有,您只需将其从 VPC 中分离出来,它就会自动访问 Internet。
-
@JohnRotenstein 是的,它需要访问 VPC 中的 ElastiCache 集群
标签: amazon-web-services aws-lambda amazon-vpc