有没有办法限制我的ELB只接受来自API网关的调用?我假设如果可能的话,可以使用API网关的客户端证书来完成.
一般来说,我对任何替代解决方案持开放态度 我需要的是暴露1 api端点而不使我的EC2实例/ ELB完全公开.我希望只能通过API网关进行呼叫,我可以限制每秒的呼叫数量.
您是正确的,API网关背面的客户端TLS(SSL)证书将是处理此问题的方法,但ELB当前在http模式下运行时不支持客户端证书.
AWS支持论坛帖子包括AWS人员,提及将此功能视为功能请求,但是:
不幸的是,目前我们无法为此提供ETA.
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请求,该请求将传递到其中一个后端实例.
HAProxy是一些非常精简的代码,我在t2.micro实例上每天使用SSL处理数十万个请求.我还在新的t2.nano实例上成功测试了它,每台机器每月<5美元几乎是不费吹灰之力的,并且其中一些将很快在相对较低的流量系统上投入生产......密切关注您的信用余额,以便了解何时需要进行扩展.
如果希望ELB提供前端面向Internet的冗余,并且ELB和应用服务器之间有多个HAProxy实例,则还可以在启用代理协议的情况下,在TCP模式下将HAProxy实例置于ELB 后面.这是我常见的配置,因为HAProxy具有HTTP路由功能,允许根据每个请求选择后端服务器组,以便例如example.com/api
可以在一组服务器上,并且example.com/blog
可以是在不同的集合上,所有都在相同的域名下.(这也是集成S3内容而不存在跨源问题的可靠方法,因为代理可以将某些路径的请求转发到S3存储桶,例如).
当然,HAProxy还可以限制每秒请求数本身,以及允许的并发请求数,甚至可以将请求积压排队,一次一个地向后端服务器发送请求,作为其他请求完成并打开一个免费插槽.