Amazon web services ELB和ECS集群前面的Amazon API网关

Amazon web services ELB和ECS集群前面的Amazon API网关,amazon-web-services,aws-api-gateway,amazon-elb,amazon-ecs,Amazon Web Services,Aws Api Gateway,Amazon Elb,Amazon Ecs,我试图在应用程序负载均衡器前面放置一个AmazonAPI网关,它平衡到我的ECS集群的流量,我的所有微服务都部署在该集群上。使用API网关的动机是通过lambda函数使用自定义授权器 系统图 在Amazon Word()中:“对后端操作的代理请求也需要在Internet上公开访问”。这迫使我将ELB公开(面向互联网),而不是内部。然后,我需要一种方法来确保只有API网关能够访问VPC之外的ELB 我的第一个想法是在API Gatway中使用客户机证书,但ELB似乎不支持它 任何想法都将不胜感激

我试图在应用程序负载均衡器前面放置一个AmazonAPI网关,它平衡到我的ECS集群的流量,我的所有微服务都部署在该集群上。使用API网关的动机是通过lambda函数使用自定义授权器

系统图

在Amazon Word()中:“对后端操作的代理请求也需要在Internet上公开访问”。这迫使我将ELB公开(面向互联网),而不是内部。然后,我需要一种方法来确保只有API网关能够访问VPC之外的ELB

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


任何想法都将不胜感激

目前没有办法将API网关放在私有ELB前面,所以您是对的,它必须面向internet。对于您的案例,我能想到的最佳解决方法是将ELB置于TCP传递模式,并在ELB后面的终端主机上终止客户端证书。

考虑到API网关技术的推动方式,这似乎是一个巨大的缺失。无法呼叫VPC中面向内部的服务器严重限制了其作为互联网接入认证前门的作用。 FWIW,在Azure中,API管理支持这种开箱即用的方式—它可以接受来自internet的请求,并直接调用到您的虚拟网络中,否则虚拟网络将被防火墙关闭。
在AWS下,这似乎唯一可行的方法是使用Lambdas,这增加了一个重要的复杂性层,特别是当您需要支持各种二进制协议时。

看起来现在已经添加了这种支持。尚未测试,YMMV:


我们决定使用标头来检查以确保所有流量都通过API网关。我们在应用程序环境变量中保存一个秘密,并在创建API时告诉API网关注入该秘密。然后在我们的应用程序中检查该密钥

以下是我们为此所做的:

在我们的基本控制器中,我们检查密钥(我们只是在网关后面有一个RESTAPI):

在我们的swagger文件中(我们使用swagger.json作为API的源)

在docker compose文件中(我们使用docker,但在任何设置文件中都可以使用docker)


在构建时,我们从设置文件中获取秘密,并将其替换到swagger.json文件中。通过这种方式,我们可以旋转设置文件中的密钥,API网关将更新以使用应用程序正在查找的密钥。

现在可以将授权者直接添加到ECS前面的应用程序负载平衡器(ALB)中

这可以直接在侦听器的规则中配置。有关详细信息,请参阅此博客文章:


如果您使用VPC链路和网络负载均衡器,这是可能的

请看这篇文章:

TL;DR

  • 创建连接到目标组的内部网络负载平衡器 (专有网络中的实例)
  • 在API网关控制台中,创建VPC链接并将其链接到上面的NLB
  • 创建API网关端点,选择“VPC链接集成”,并将NLB内部URL指定为“端点URL”

  • 希望有帮助

    我知道这是一个老问题,但我认为他们最近可能增加了支持

    “Amazon API Gateway宣布全面提供HTTP API,使客户能够轻松构建高性能RESTful API,与API Gateway提供的REST API相比,可节省71%的成本,减少60%的延迟。作为此次发布的一部分,客户将能够利用几个新功能,包括将请求路由到专用AWS弹性负载平衡器(ELB)的能力,包括对AWS ALB的新支持,以及在AWS CloudMap中注册的基于IP的服务。"


    ALB应该是内部的,以便通过专用链接将请求路由到那里。在我的设置中工作得非常好,无需将NLB放在它前面。 路线应如下所示:

    $default / 获取(或发布或任何您想要使用的内容)
    集成应该附加到所有路径$default和GET/POST/ANY etc

    我认为没有一个简单的解决方案。要么API网关不适合您,要么您需要做更多的工作。解决方案包括将HAProxy放在ALB之前,以验证客户端证书。或者将lambda放在ALB之前,但这需要对ALB的整个响应e缓冲可能会减慢速度。或者,如果您可以在从API网关到ALB的请求中注入一个秘密头。该秘密将在后端进行验证。我不建议IP白名单,因为API网关的IP范围不是静态的,可以更改中断内容。谢谢@doorstack。我希望避免incorpo评估HAProxy之类的新组件。我猜是这种情况(API网关、ELB、ECS集群)非常常见。AWS不是提供了现成的解决方案吗?API网关更适合Lambda函数服务。当放在带有托管服务的docker容器前面时,我觉得这会增加太多延迟和复杂性。我使用另一个代理而不是API网关,因为我只使用API网关的代理部分。我使用了kipper by Zalando获得了成功。但是如果你想使用授权器、cloudfront缓存等,那么也许API网关仍然是一条路要走。谢谢。我在VPC中创建了一个lambda来代理请求,但我不喜欢这种方法,因为它增加了延迟和复杂性。我最终用开源的TyK.BTW代替了Amazon API网关。顺便说一句,我做了eventually尝试一下,它确实可以工作,但很难超级方便-首先,您只能让一个API网关与网络负载平衡器而不是应用程序负载平衡器对话,因此如果您当前正在与网关对话的外部ALB设置,您需要用网络负载平衡器替换它们(这意味着您失去了SSL termi
    string ApiGatewayPassthroughHeader = context.HttpContext.Request.Headers["ApiGatewayPassthroughHeader"];
    
    if (ApiGatewayPassthroughHeader != Environment.GetEnvironmentVariable("ApiGatewayPassthroughHeader"))
    {
        throw new error;
    }
    
    "x-amazon-apigateway-integration": {
        "type": "http_proxy",
        "uri": "https://${stageVariables.url}/path/to/resource",
        "httpMethod": "post",
        "requestParameters": {
          "integration.request.header.ApiGatewayPassthroughHeader": "${ApiGatewayPassthroughHeader}"
        }
      },
    
    services:
      example:
          environment:
            - ApiGatewayPassthroughHeader=9708cc2d-2d42-example-8526-4586b1bcc74d