ELB和ECS群集前的Amazon API网关

时间:2017-01-31 12:25:20

标签: amazon-web-services aws-api-gateway amazon-elb amazon-ecs

我正在尝试将Amazon API网关放在应用程序负载均衡器之前,这样可以平衡流向我的ECS群集的流量,我的所有微服务都部署在该群集中。使用API​​网关的动机是通过lambda函数使用自定义授权程序。

系统图

enter image description here

在亚马逊语中(https://aws.amazon.com/api-gateway/faqs/):“对后端操作的代理请求也需要在Internet上公开访问”。这迫使我让ELB公开(面向互联网)而不是内部。然后,我需要一种方法来确保 API网关能够访问VPC外部的ELB。

我的第一个想法是在API Gatway中使用客户端证书,但ELB似乎不支持它。

任何想法都将受到高度赞赏!

8 个答案:

答案 0 :(得分:11)

这似乎是API网关技术的一个巨大缺失部分,因为它的推动方式。无法在VPC中调用面向内部的服务器严重限制了其作为Internet访问的身份验证前端的用途。 FWIW,在Azure中,API Management支持开箱即用 - 它可以接受来自互联网的请求,并直接呼叫您的虚拟网络,否则将被防火墙关闭。 在AWS下,这似乎是可行的唯一方法是使用Lambdas,这增加了一层重要的复杂性,尤其是。如果你需要支持各种二进制协议。

答案 1 :(得分:4)

答案 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的服务。”

https://aws.amazon.com/about-aws/whats-new/2020/03/api-gateway-private-integrations-aws-elb-cloudmap-http-apis-release/

答案 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

  1. 创建连接到目标组的内部网络负载均衡器 (VPC中的实例)
  2. 在API Gateway控制台中,创建一个VPC链接并将其链接到以上NLB
  3. 创建API Gateway端点,选择“ VPC链接集成”,然后将您的NLB内部URL指定为“端点URL”

希望有帮助!

答案 7 :(得分:0)

ALB 应该是内部的,以便通过私有链接将请求路由到那里。在我的设置中运行良好,无需将 NLB 放在它前面。 路线应如下所示:

$默认 / GET(或 POST 或任何你想使用的) 集成应附加到所有路径 $default 和 GET/POST/ANY 等

相关问题