问题描述
我有一个 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 只能使用您配置的接口端点访问。
有两种方法可以解决这个问题:
- 禁用端点的 Private DNS Name 选项,或
- 删除端点。
在 OP 的情况下,第二个选项用于解决问题。
,EC2 实例可能位于没有公共互联网访问权限的 VPC 中(或可能但通过负载均衡器、堡垒主机或任何其他选项)。
您需要找出 EC2 实例所在的 VPC,并确保您的 lambda 函数可以访问它。您可以按照 the documentation
向 VPC 添加函数