我正在尝试将Amazon API网关放在应用程序负载均衡器之前,这样可以平衡流向我的ECS群集的流量,我的所有微服务都部署在该群集中。使用API网关的动机是通过lambda函数使用自定义授权程序。
系统图
在亚马逊语中(https://aws.amazon.com/api-gateway/faqs/):“对后端操作的代理请求也需要在Internet上公开访问”。这迫使我让ELB公开(面向互联网)而不是内部。然后,我需要一种方法来确保仅 API网关能够访问VPC外部的ELB。
我的第一个想法是在API Gatway中使用客户端证书,但ELB似乎不支持它。
任何想法都将受到高度赞赏!
答案 0 :(得分:11)
这似乎是API网关技术的一个巨大缺失部分,因为它的推动方式。无法在VPC中调用面向内部的服务器严重限制了其作为Internet访问的身份验证前端的用途。 FWIW,在Azure中,API Management支持开箱即用 - 它可以接受来自互联网的请求,并直接呼叫您的虚拟网络,否则将被防火墙关闭。 在AWS下,这似乎是可行的唯一方法是使用Lambdas,这增加了一层重要的复杂性,尤其是。如果你需要支持各种二进制协议。
答案 1 :(得分:4)
现在看来已添加此支持。尚未测试,YMMV:
答案 2 :(得分:2)
我们决定使用标头进行检查,以确保所有流量都来自API网关。我们在应用环境变量中保存了一个秘密,并告诉API网关在我们创建API时注入它。然后在我们的应用程序中检查该密钥。
以下是我们为此所做的事情:
在我们的基本控制器中,我们检查密钥(我们在网关后面只有一个REST API):
"x-amazon-apigateway-integration": {
"type": "http_proxy",
"uri": "https://${stageVariables.url}/path/to/resource",
"httpMethod": "post",
"requestParameters": {
"integration.request.header.ApiGatewayPassthroughHeader": "${ApiGatewayPassthroughHeader}"
}
},
在我们的swagger文件中(我们使用swagger.json作为API的来源)
services:
example:
environment:
- ApiGatewayPassthroughHeader=9708cc2d-2d42-example-8526-4586b1bcc74d
在我们的docker compose文件中(我们使用的是docker,但同样可以在任何设置文件中使用)
0xffffffff
在构建时,我们从设置文件中获取秘密,并将其替换为swagger.json文件。这样我们就可以在设置文件中旋转密钥,API网关将更新为使用应用程序正在寻找的密钥。
答案 3 :(得分:2)
我知道这是一个老问题,但是我认为他们可能最近才增加了支持。
“ Amazon API Gateway宣布HTTP API的普遍可用性,使客户能够轻松构建高性能RESTful API,与API Gateway提供的REST API相比,它们可节省多达71%的成本并减少60%的延迟。启动后,客户将能够利用几个新功能,包括将请求路由到私有AWS Elastic Load Balancer(ELB)的功能,包括对AWS ALB的新支持以及在AWS CloudMap中注册的基于IP的服务。”
答案 4 :(得分:1)
目前还没有将API网关放在私人ELB面前,所以你必须面向互联网。我能想到的最佳解决方法是将ELB置于TCP传递模式,并在ELB后面的终端主机上终止客户端证书。
答案 5 :(得分:0)
现在可以在ECS前面直接向应用程序负载均衡器(ALB)添加授权程序。
这可以直接在侦听器的规则中配置。有关详细信息,请参阅此博客文章:
https://aws.amazon.com/de/blogs/aws/built-in-authentication-in-alb/
答案 6 :(得分:0)
使用VPC链接和网络负载平衡器是可能的。
请看一下这篇文章: https://adrianhesketh.com/2017/12/15/aws-api-gateway-to-ecs-via-vpc-link/
TL; DR
希望有帮助!
答案 7 :(得分:0)
ALB 应该是内部的,以便通过私有链接将请求路由到那里。在我的设置中运行良好,无需将 NLB 放在它前面。 路线应如下所示:
$默认 / GET(或 POST 或任何你想使用的) 集成应附加到所有路径 $default 和 GET/POST/ANY 等