Public ELB 只能从 API 网关访问

Public ELB accessible only from API Gateway

有没有办法限制我的 ELB 只接受来自 API 网关的调用?我假设如果可能的话,可以使用 API 网关的客户端证书来完成。

一般来说,我愿意接受任何替代解决方案。我需要的是公开 1 api 端点而不使我的 EC2 instance/ELB 完全 public。我希望呼叫仅通过 API 网关打入,我可以在其中限制每秒的呼叫数。

你是对的,API 网关的 back-side 上的客户端 TLS (SSL) 证书将是处理此问题的方法,但 ELB 目前不支持客户端证书 在http模式下运行时

AWS 支持论坛帖子包括 AWS 人员提到考虑将此功能作为功能请求,但是:

Unfortunately, at this moment we are not able to provide an ETA for this.

https://forums.aws.amazon.com/thread.jspa?threadID=58561&start=0&tstart=0

当然,如果 ELB 是 TCP 模式而不是 HTTP,那么您的 Web 服务器可以处理所有 SSL,包括客户端证书验证,但 TCP 模式在 ELB 中没有 HTTP 模式的优势.

我的解决方案是在单独的实例上使用 HAProxy 运行,执行与 ELB 相同的功能,包括 SSL 终止和客户端证书验证。该实例在端口 443 上向全世界开放,但只有提供 API 网关客户端证书的 SSL 连接才允许继续协商 SSL 并发出实际的 HTTP 请求,该请求将传递给 back-end 实例。

HAProxy 是一些非常 精益代码,我的系统每天在 t2.micro 个实例上使用 SSL 处理数十万个请求。我还在新的 t2.nano 实例上成功测试了它,每台机器每月 < 5 美元几乎是 no-brainer,并且其中一些很快就会在流量相对较低的系统上投入生产...只需关注您的信用余额,以便您知道何时需要扩大它。

如果您希望 front-end Internet-facing 冗余,您还可以将 HAProxy 实例 置于 TCP 模式的 ELB 之后,并启用代理协议由 ELB 提供,在 ELB 和应用服务器之间有多个 HAProxy 实例。这对我来说是一个常见的配置,因为 HAProxy 具有 HTTP 路由功能,允许在 per-request 的基础上选择 back-end 组服务器,这样,例如 example.com/api 可以是在一组服务器上,example.com/blog 可以在不同的服务器上,都在同一个域名下。 (这也是在没有 cross-origin 问题的情况下集成 S3 内容的可靠方法,因为代理可以将某些路径的请求转发到 S3 存储桶,例如)。

当然,HAProxy 本身也可以限制每秒的请求数,以及允许的并发请求数,甚至可以将积压的请求排入队列,一次一个地释放它们到 back-end 服务器作为其他请求完成并打开一个空闲插槽。