AWS CLI通过2个代理

时间:2017-11-27 12:06:08

标签: apache amazon-web-services proxy command-line-interface

我有一个场景,我需要通过2个代理对AWS云监视器执行AWS CLI命令。

服务器A(AWS CLI)----->服务器B(Apache代理Web服务器)----->公司代理IP(X.X.X.X)----->网络

我的挑战是AWS CLI命令没有上下文(/某事物),根据该上下文可以应用重写规则(将在服务器B上编写)将请求从服务器A转发到公司代理IP和最后到互联网(AWS)。 公司代理IP的连接已经存在于互联网上。

我的主要动机是通过2个代理在服务器A上获取cloudwatch指标。根据我的说法,这是不可能实现的,但如果可以实现这一点,则需要输入,如果是,则重写规则 应写在服务器B上,以将AWS CLI命令代理到公司代理。

AWS CLI命令例如。如下:

aws cloudwatch get-metric-statistics --namespace AWS / EC2 --metric-name CPUUtilization --dimensions Name = InstanceId,Value = i-xxx --statistics Average --start-time date -u '+%FT%TZ' -d '10 mins ago' - 结束时间date -u '+%FT%TZ' - 期间60

我知道我们可以使用HTTP_PROXY通过代理转发请求,但这只会将我的请求从服务器A转发到服务器B(Apache代理Web服务器)。

提前致谢&感谢快速反应。

1 个答案:

答案 0 :(得分:0)

好的,所以我实际上最近构建了一个反向代理服务器(nginx),专门用于转发AWS CLI请求以帮助企业防火墙。不幸的是,我无法发布用于实现这项工作的代码,但可以为您提供有关设置此类系统的问题的一些见解。

  1. 这是最明显的。您需要有一个重定向规则,该规则可以理解通过它推送的请求,并将其重写为上游AWS服务器可以理解的语法。在默认AWS命令中,该上下文是URL的一部分(例如https://ec2.us-west-2.amazonaws.com)。如果您正在通过上游反向代理,那么您需要以某种方式传递该上下文。您可以拥有星形DNS记录,以便像亚马逊一样捕获对代理的所有请求(例如\*.\*.{proxy-address} => {proxy-ip}然后aws ec2 --endpoint-url https://ec2.us-west-2.proxy describe-instances),或者您可以手动将信息注入路径(例如{{1 }})。然后,在代理服务器上,您解析信息并根据它设置上游。我的最终解决方案是将完整的默认AWS端点url放入我的代理aws ec2 --endpoint-url https://proxy/ec2/us-west-2 describe-instances的路径中,然后让regex上游解析端点URL,以防amazon放置路径中的信息,然后设置上游服务器到正则表达式解析的端点URL。
  2. 完成#1后,您现在将遇到第二期生成的签名问题。如果您在CLI中使用https://proxy/ec2.us-west-2.amazonaws.com标志,则会在--endpoint-url标头设置为代理服务器URL的情况下对请求进行签名。现在,当在上游重写时,Host标头将不再与签名匹配。因此,您需要重新签署通过代理的任何请求。这有几个偷偷摸摸的方式。我最终做的是创建一个AWS CLI包装器,它重载了签名机制以对请求进行签名,就好像它将其发送到默认的AWS端点,然后覆盖Host标头指向我的反向代理。以这种方式重新签名是有利的,因为它可以消除由于不必转换请求而导致的代理延迟,但是很难以动态提取AWS可能发布的任何新签名方法的方式实现。
  3. 值得注意的是,如果你深入挖掘僵尸源代码,你会发现一些内置的反向代理支持,但似乎已经不存在/未被使用(它没有暴露给客户)。希望他们在不久的将来能够清除这些功能,这将不再是一个问题。