我可以将 VPC 中的 HTTP 端点指定为 AWS API 网关中的资源吗?

Can I specify HTTP endpoint in a VPC as resource in AWS API Gateway?

我的产品(某些 Web API)位于 VPC 内部,即没有任何外部访问权限。我想公开此 APIs 的部分(只是几个 HTTP 方法)以便从 Internet 访问。我正在尝试使用 AWS API 网关实现此目的,但看起来我无法将内部 ELB 端点设为 API 网关资源。我该怎么做?

谢谢, --沃文

这最初是不可能的,然后通过支持 API Gateway 可以用来对您的服务进行身份验证的客户端证书来解决。这是一个很好的解决方案,并且仍然可用,但仍然需要您的服务(至少在某种意义上)暴露在 Internet 上。

2017 年 11 月,AWS 发布了一项新功能,允许您在 API 网关和您的内部服务之间实际配置网络路径。

You can now provide access to HTTP(S) resources within your Amazon Virtual Private Cloud (VPC) without exposing them directly to the public Internet. You can use API Gateway to create an API endpoint that is integrated with your VPC. You create an endpoint to your VPC by setting up a VPC link between your VPC and a Network Load Balancer (NLB), which is provided by Elastic Load Balancing.

https://aws.amazon.com/about-aws/whats-new/2017/11/amazon-api-gateway-supports-endpoint-integrations-with-private-vpcs/

历史背景如下。


到目前为止,还没有简单和万无一失的方法来做到这一点,因为 API 网关可以访问的服务需要 via/exposed public 互联网 没有内置的信任机制,您可以通过它确信这样的请求实际上来自 any API网关部署,更不用说你的API网关部署。

亚马逊似乎已经解决了对您的后端服务请求进行身份验证的问题,因为它确实来自 API 网关,而且来自 您的 API网关实例。和以前一样,端点仍然需要暴露在互联网上,因为源 IP 地址是不可预测的——但是 API 网关现在支持客户端 SSL 证书,API 网关的后端使用它来向后端服务的前端验证自己,API 网关正在调用。

Q: Can Amazon API Gateway work within an Amazon VPC?

No. Amazon API Gateway endpoints are always public to the Internet. Proxy requests to backend operations also need to be publicly accessible on the Internet. However, you can generate a client-side SSL certificate in Amazon API Gateway to verify that requests to your backend systems were sent by API Gateway using the public key of the certificate.

Q: Can I verify that it is API Gateway calling my backend?

Yes. Amazon API Gateway can generate a client-side SSL certificate and make the public key of that certificate available to you. Calls to your backend can be made with the generated certificate, and you can verify calls originating from Amazon API Gateway using the public key of the certificate.

https://aws.amazon.com/api-gateway/faqs/#security

当您在 API 网关控制台中生成客户端证书时,您会获得该证书的 public 密钥。为了安全起见,私钥由 API 网关保留,您无法访问。 API 网关将在协商 SSL 时向您的后端提供 public 密钥。任何不提供相同 public 密钥的对等点都不是 API 网关,您的后端应该拒绝 SSL 协商。

如果恶意行为者获得了 public 密钥,他们仍然无法通过 SSL 与您的后端通信,因为他们缺少配套的私钥,即只有 API 网关知道。 (您的交互端将使用您的 SSL 证书及其配对的私钥进行加密,当然只有您知道。)

此功能解决了以前似乎是 API 网关的 HTTP 代理功能实用程序的重大限制......事实上,当我发现修改后的信息时,上述限制如此重要,我开始怀疑自己:这是否一直存在,而我却以某种方式设法忽略了它? The Wayback Machine says no, it's new. 此信息是在 2015 年 9 月添加的。

这有点迂回,但您可以通过 Lambda 函数代理 VPC 中的 Web 服务端点。可以直接从 API 网关调用该 Lambda 函数。此博客 post 详细介绍了如何执行此操作。