AWS 将流量从 NLB 传递到 ALB?

AWS Pass traffic from NLB to an ALB?

我正在尝试将传入流量从亚马逊的网络负载均衡器传递到应用程序负载均衡器,我正在使用 NLB,因为它有一个弹性 IP 附件,我希望它充当 ALB 的代理。这可能吗?

2021 年 9 月更新:AWS 具有 announced 用于 NLB 的 ALB 目标组的本机可用性。这不仅降低了需要 Lambda-based 解决方法的复杂性,而且还消除了有关客户端 IP 保留的限制。以这种方式定位的 ALB 将提供 X-Forwarded-For header,其中包含最初调用 NLB 的外部 IP 地址。


可以可以,但是有点乱

问题是 Application Load Balancer 可以向上、向外、向内、and/or 向下扩展,并且在每种情况下,平衡器的内部 IP 地址都可以更改...但是 NLB 需要静态地址来为其目标。

因此,在低级别上,这意味着每次 ALB 的 IP 更改时都必须修改 NLB 目标组。

AWS 已发布官方解决方案来实现此目的,使用 Lambda 函数定期捕获 ALB 的地址并在结果发生变化时更新 NLB 配置。

https://aws.amazon.com/blogs/networking-and-content-delivery/using-static-ip-addresses-for-application-load-balancers/

这里有一个值得注意的限制,即此解决方案不允许您识别客户端 IP 地址。当流量通过 NLB 时它会丢失,因为 NLB 仅在目标是实例(不是 IP 地址)或目标了解客户端的代理协议并且在 NLB 上启用该功能时才保留源 IP , 但 ALB 不支持这样的配置。使用上面 link 所示的设置,X-Forwarded-For 中最右边的地址将由 ALB 设置为 NLB 的内部地址。

这是正确的。您在 ALB(或 ALB 本身)后面的应用程序服务器将始终看到与 NLB 相同的源 IP。

作为适用于某些用例的解决方法,您可以强制执行 HTTPS 并在 NLB 上配置访问日志。然后访问日志将具有原始源IP。

如果不清楚,我的意思是:

  • 确保在您的 NLB 上启用访问日志
  • 确保将 NLB 侦听器配置为使用 TLS

如果您想接受纯 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

自 2021 年 9 月 27 日起,AWS 为网络负载均衡器 (NLB) 推出了应用程序负载均衡器 (ALB) 类型的目标组。通过此次发布,您可以将 ALB 注册为 NLB 的目标,以将流量从 NLB 转发到 ALB,而无需通过 Lambda 主动管理 ALB IP 地址更改。