33

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

系统图

在此处输入图像描述

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

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

任何想法将不胜感激!

4

8 回答 8

13

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

于 2017-10-15T20:49:12.217 回答
6

看起来现在已添加此支持。没有测试,YMMV:

https://aws.amazon.com/about-aws/whats-new/2017/11/amazon-api-gateway-supports-endpoint-integrations-with-private-vpcs/

于 2017-12-04T22:07:59.227 回答
5

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

这是我们正在为此做的事情:

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

string ApiGatewayPassthroughHeader = context.HttpContext.Request.Headers["ApiGatewayPassthroughHeader"];

if (ApiGatewayPassthroughHeader != Environment.GetEnvironmentVariable("ApiGatewayPassthroughHeader"))
{
    throw new error;
}

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

"x-amazon-apigateway-integration": {
    "type": "http_proxy",
    "uri": "https://${stageVariables.url}/path/to/resource",
    "httpMethod": "post",
    "requestParameters": {
      "integration.request.header.ApiGatewayPassthroughHeader": "${ApiGatewayPassthroughHeader}"
    }
  },

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

services:
  example:
      environment:
        - ApiGatewayPassthroughHeader=9708cc2d-2d42-example-8526-4586b1bcc74d

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

于 2018-05-21T17:39:57.127 回答
3

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

“Amazon API Gateway 宣布全面推出 HTTP API,使客户能够轻松构建高性能 RESTful API,与 API Gateway 提供的 REST API 相比,这些 API 可节省高达 71% 的成本并减少 60% 的延迟。作为此次发布的一部分,客户将能够利用多项新功能,包括将请求路由到私有 AWS 弹性负载均衡器 (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/

于 2020-08-11T04:52:15.963 回答
1

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

请看一下这篇文章: https ://adrianhesketh.com/2017/12/15/aws-api-gateway-to-ecs-via-vpc-link/

TL;博士

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

希望有帮助!

于 2018-06-20T09:40:44.590 回答
1

目前没有办法将 API 网关放在私有 ELB 前面,所以你说得对,它必须面向互联网。对于您的情况,我能想到的最佳解决方法是将 ELB 置于 TCP 直通模式并终止 ELB 后面的终端主机上的客户端证书。

于 2017-02-01T19:05:30.493 回答
1

现在可以在 ECS 前直接向 Application Load Balancer (ALB) 添加授权方。

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

https://aws.amazon.com/de/blogs/aws/built-in-authentication-in-alb/

于 2018-06-15T13:10:18.200 回答
0

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

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

于 2021-05-11T04:34:14.233 回答