【问题标题】:How to route traffic in AWS ALB based on two conditions如何根据两个条件在 AWS ALB 中路由流量
【发布时间】:2021-07-19 22:16:22
【问题描述】:

我正在将服务从 Kubernetes 迁移到 AWS ECS。对于路由,我使用 AWS Application Load Balancer (ALB)。

ALB 在端口 80 上有一个侦听器,我的服务聚合在目标组中。

为了在服务之间路由流量,我使用 ALB 侦听器规则。 对于路由,我需要满足两个条件:host-headerpath-pattern

所以我会有类似以下的内容:

我尝试向规则添加多个条件(在 Terrafom 中),但只能使用 host-headerpath-pattern

条件块中只能设置 host_header、http_header、http_request_method、path_pattern、query_string 或 source_ip 之一

也不能在 AWS 控制台中将host_headerpath_pattern 一起添加。

如何在 AWS ALB 中根据主机头 + 路径模式这两个条件路由流量?

一种可能的选择是每台主机使用一个 ALB,但是当主机/子域的数量增加时,这将过于昂贵。

如何在 Kubernetes 中完成

在 Kubernetes 的 nginx 入口路由器中可以同时进行主机头和路径模式路由。例如拥有这两个入口资源:

资源 1

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: web-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
    - host: domain-one.com
      http:
        paths:
          - path: /web
            backend:
              serviceName: web-service
              servicePort: 8080
          - path: /media/files
            backend:
              serviceName: web-service
              servicePort: 8080

    - host: another-domain.com
      http:
        paths:
          - path: /web
            backend:
              serviceName: web-service
              servicePort: 8080
          - path: /media/files
            backend:
              serviceName: web-service
              servicePort: 8080


资源 2

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: api-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
    - host: www.domain-one.com
      http:
        paths:
          - path: /api
            backend:
              serviceName: api-service
              servicePort: 8181


对于 Kubernetes,除了path 参数外,还可以定义一个可选的host 参数。 所以最后hostpath必须在负载均衡器将流量引导到相应的后端之前匹配传入请求的内容:

那么,如何在 AWS ALB 上实现同样的效果?

谢谢。

【问题讨论】:

    标签: amazon-web-services amazon-ecs kubernetes-ingress aws-application-load-balancer


    【解决方案1】:

    ALB 侦听器规则可以包含多个条件,但一个条件只能包含所描述的块之一。

    单个规则的条件使用 AND 进行处理,因此必须满足所有条件才能路由到目标组。

    因此需要为多个主机创建多个规则,如下所示: https://stackoverflow.com/a/46304567/1820806

    编辑我将验证此解决方案并更新帖子。

    编辑 2此解决方案有效。

    【讨论】:

      【解决方案2】:

      我也在从 k8s 迁移到 ECS。 正如你提到的,你需要有多个条件。 这就是我在 terraform 中的做法。

      resource "aws_lb_listener_rule" "backend_api_routing" {
        depends_on = [aws_alb_target_group.main8080]
      
        listener_arn = var.https_aws_alb_listener_arn
        priority     = var.backend_api_routing_priority
      
        action {
          type             = "forward"
          target_group_arn = aws_alb_target_group.main8080.arn
        }
      
        condition {
          host_header {
            values = ["domain-one.com"]
          }
        }
      
        condition {
          path_pattern {
            values = ["/web/*", "/media/files/*"]
          }
        }
      }
      

      另外,我建议你检查 terragrunt,它允许你重新使用 terraform 模块。

      【讨论】:

        猜你喜欢
        • 2021-06-17
        • 1970-01-01
        • 2015-06-30
        • 2021-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多