可从 Internet 访问的 AWS Lambda HTTP,但无法从同一账户上的 EC2 访问

问题描述

我有一个 lambda 函数,它附加了一个 API 网关。它有一个可公开访问的 IP 地址和一个域名(由无服务器框架创建)。我可以通过广泛的互联网、我自己的浏览器(和其他设备)访问它。

问题是,我账户上的其他服务似乎无法访问它,例如 EC2 实例。在上述实例中,curl google.com 工作并返回响应,但 curl mylink.com 超时。

我认为这与 VPC 设置有关,但我无法理解。这里可能有什么问题?

更新:使用 curl --verbose,我发现从其他任何地方访问时,API 网关指向的 IP 与从我的 AWS 账户中访问时不同。 VPC 似乎无关紧要,我创建了一个新的 VPC,在其中创建了一个 EC2 实例,它仍然这样做。

解决方法

基于评论。

该问题是由默认 VPC 中 API Gateway 的 VPC interface endpoint 引起的。 API 网关的 VPC 接口端点用于 private API,而不是用于 OP 的公共 API。随后,对公共 API 端点的调用失败,如AWS blog 中所述:

当它们被配置为私有时,公共网络将无法使用来路由您的 API。相反,您的 API 只能使用您配置的接口端点访问。

有两种方法可以解决这个问题:

在 OP 的情况下,第二个选项用于解决问题。

,

EC2 实例可能位于没有公共互联网访问权限的 VPC 中(或可能但通过负载均衡器、堡垒主机或任何其他选项)。

您需要找出 EC2 实例所在的 VPC,并确保您的 lambda 函数可以访问它。您可以按照 the documentation

向 VPC 添加函数