Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 如何在AWS上的ELBs后面部署API管理器并保留X转发头?_Amazon Web Services_Wso2_Amazon Elb_Api Manager_Kong - Fatal编程技术网

Amazon web services 如何在AWS上的ELBs后面部署API管理器并保留X转发头?

Amazon web services 如何在AWS上的ELBs后面部署API管理器并保留X转发头?,amazon-web-services,wso2,amazon-elb,api-manager,kong,Amazon Web Services,Wso2,Amazon Elb,Api Manager,Kong,我在AWS上部署了一些RESTfull API,主要是在Elasticbeanstalk上 我的公司正在逐步采用微服务体系结构,因此,我希望开始以更专业和自动化的方式管理这些API。因此,我想采用某种API管理器来提供路由和发现等标准功能 此外,我希望使用这样的API管理器向Internet公开我的一些API。管理器将仅通过SSL向Internet公开,并且在将请求路由到内部API之前,应该需要来自外部使用者的某种身份验证。对于我的用例,在每个请求的授权头中使用一个简单的API密钥就足够了 我目

我在AWS上部署了一些RESTfull API,主要是在Elasticbeanstalk上

我的公司正在逐步采用微服务体系结构,因此,我希望开始以更专业和自动化的方式管理这些API。因此,我想采用某种API管理器来提供路由和发现等标准功能

此外,我希望使用这样的API管理器向Internet公开我的一些API。管理器将仅通过SSL向Internet公开,并且在将请求路由到内部API之前,应该需要来自外部使用者的某种身份验证。对于我的用例,在每个请求的授权头中使用一个简单的API密钥就足够了

我目前正在考虑两种产品作为API经理:WSO2和Kong。前者是一个新的开源项目,托管在Github上

在我考虑的所有部署场景中,API管理器都必须部署在AWS EC2实例上。此外,它们必须部署在至少两个不同的可用性区域上,并位于弹性负载平衡器(ELB)后面,以向托管API提供高可用性

我的大多数API都遵循HATEOAS约束。因此,他们的许多JSON响应包含指向其他资源的链接,这些链接必须基于原始请求动态构建

例如:

如果用户通过公开的API管理器从Internet发送请求,则URL如下所示:

因此,用户应该会收到一个JSON响应,其中包含一个帐户资源,并带有指向订阅资源的链接。 链接URL应该基于原始请求的协议、主机和端口,因此看起来像:

为了满足上面提到的动态链路生成要求,我的API依赖于X-Forwarded-Proto、X-Forwarded-Host和X-Forwarded-Port HTTP头。它们应该包含协议(http或https)、主机名和使用者在原始请求中使用的端口,不管请求通过了多少个代理

但是,我注意到,当请求通过ELB时,X-Forwarded-Proto和X-Forwarded-Port头被更改为引用请求通过的最后一个ELB的值,而不是原始请求中的值

例如:如果原始请求通过HTTPS命中API管理器,则管理器通过HTTP将请求转发给内部API;因此,当请求到达第二个ELB时,ELB将X-Forwarded-Proto头更改为“http”。因此,X-Forwarded-Proto头的原始“https”值丢失。因此,API无法在URL中使用“https”协议建立正确的链接

显然,ELBs不能配置为以任何其他方式运行。我在AWS的文档中找不到任何可能影响此行为的设置

此外,似乎没有比AWS的ELBs更好的替代品。如果我选择使用另一个产品,比如HAProxy,或者通过API管理器本身进行负载平衡,那么我必须将其安装在常规EC2实例上,因此,创建一个单点故障

为了更好地表达我的观点,我准备了一个非正式的图表

此外,我找不到任何关于WSO2或Kong部署场景的相关讨论,以任何方式解决这些问题。我不清楚这些产品与AWS的ELBs有何关联

欢迎具有类似环境的其他人发表评论


谢谢。

有趣的问题/挑战-我不知道如何配置
X-Forwarded-*
标题行为。但是,您可以通过利用ELB的不同功能来解决这一问题,该功能适用于以下两个受支持的网络层:

无代理协议的TCP/SSL侦听器 与其使用HTTP侦听器(OSI第7层)来终止SSL等,不如将非侵入式TCP/SSL侦听器(OSI第4层)用于内部负载平衡器,请参阅:

当您对前端和后端使用TCP(第4层)时 连接,负载平衡器将请求转发到后端 不修改标题的实例。[…][我的重点]

我还没有尝试过这一点,但在这种情况下,外部HTTP/HTTPS负载平衡器添加的
X-Forwarded-*
头将不经内部TCP/SSL负载平衡器修改地通过

带有代理协议的TCP/SSL侦听器 或者,您也可以立即利用更高级/最新的,有关这方面的更多信息,请参阅介绍性博客文章:

直到今天,ELB允许您仅在以下情况下获取客户端IP地址: 您使用了HTTP(S)负载平衡,它在 标题。因为在HTTP头中使用了X-Forwarded-For 只不过,如果ELB为,则无法获取客户端IP地址 配置为TCP负载平衡。你们中的许多人告诉我们你们想要 TCP通信的类似功能,因此我们添加了对代理的支持 协议它只是在客户机前面加上一个可读的标题 发送到服务器的TCP数据的连接信息。[…]代理协议是 在为非HTTP流量提供服务时非常有用。或者,你可以 如果您正在发送HTTPS请求并且不想终止,请使用它 负载平衡器上的SSL连接。[……]

除了
X-Forwarded-*
头之外,您还可以使用和代理协议处理。另一方面,您的后端层可能尚未自动促进代理协议,需要相应地进行调整