我试图将传入的流量从亚马逊的网络负载平衡器传递到应用程序负载平衡器,我正在使用NLB,因为它具有弹性IP附件,我希望它充当ALB的代理。那有可能吗?
答案 0 :(得分:5)
这是可能,但是有点混乱。
问题在于应用程序负载均衡器可以按比例放大,缩小,缩小和/或缩小,并且在每种情况下,均衡器的内部IP地址都可以更改...但是NLB要求其目标使用静态地址。>
因此,从低层次上讲,这意味着每次ALB的IP更改时,都必须修改NLB目标组。
AWS已发布了用于实现此目的的官方解决方案,它会按计划使用Lambda函数来捕获ALB的地址并在结果更改时更新NLB配置。
一个明显的限制是,此解决方案不允许您标识客户端IP地址。当流量通过NLB时,它会丢失,因为NLB仅在目标是实例(不是IP地址)或目标理解客户端的代理协议并且在NLB上启用了功能时才保留源IP。 ,但ALB不支持这种配置。通过上面链接中显示的设置,X-Forwarded-For
中最右边的地址将由ALB设置为NLB的内部地址。
答案 1 :(得分:0)
这是正确的。您在ALB(或ALB本身)后面的应用服务器将始终将源IP视为NLB。
作为适用于某些用例的解决方法,您可以强制执行HTTPS并在NLB上配置访问日志。然后,访问日志将具有原始源IP。
如果不清楚,我的意思是:
如果您想接受纯HTTP并发出重定向到HTTPS的信息,则还会带来一些其他麻烦。在这种情况下,您将有2个侦听器和2个目标组,因此您需要旋转2个Lambda副本以监视(并最终更新)这两个目标组,或者您需要修改Lambda代码(这就是我所做的)
此外,该示例中的IMO代码还远未投入生产(特别是对于规模化-如果您有此设置的许多实例),所以我实际上不得不重写它。
CloudFormation模板的相关摘录如下:
NLB:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
IpAddressType: ipv4
Scheme: internet-facing
Type: network
LoadBalancerAttributes:
- Key: load_balancing.cross_zone.enabled
Value: 'true'
- Key: access_logs.s3.enabled
Value: 'true'
# make sure the bucket policy grants access - https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-access-logs.html
- Key: access_logs.s3.bucket
Value: !Ref S3BucketForNLBAccessLogs
- Key: access_logs.s3.prefix
Value: !Sub 'raw/${AppInstance}'
nlbHTTPSListener:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
Certificates:
- CertificateArn: !Ref FrontEndSSLCertificateArn
LoadBalancerArn: !Ref NLB
Port: 443
Protocol: TLS
DefaultActions:
- Type: 'forward'
TargetGroupArn: !Ref nlbHTTPSTargetGroup