GCP url-map with cookie regex matching rule

GCP url-map with cookie regex matching rule

我正在设置 GCP url map 以根据 cookie 值将请求路由到后端服务。由于 cookie 会有多个键值,我正在尝试使用正则表达式匹配器。 我需要根据来自 cookie 的区域值将请求路由到后端。 典型的 cookie 如下所示:foo=bar;region=eu;variant=beta;

defaultService: https://www.googleapis.com/compute/v1/projects/<project_id>/global/backendServices/multi-region-1
kind: compute#urlMap
name: regex-url-map
hostRules:
- hosts:
  - '*'
  pathMatcher: path-matcher-1
pathMatchers:
- defaultService: https://www.googleapis.com/compute/v1/projects/<project_id>/global/backendServices/multi-region-1
  name: path-matcher-1
  routeRules:
    - matchRules:
        - prefixMatch: /
          headerMatches:
            - headerName: Cookie
              regexMatch: (region=us)
      priority: 0
      service: https://www.googleapis.com/compute/v1/projects/<project_id>/global/backendServices/multi-region-1
    - matchRules:
        - prefixMatch: /
          headerMatches:
            - headerName: Cookie
              regexMatch: (region=eu)
      priority: 1
      service: https://www.googleapis.com/compute/v1/projects/<project_id>/global/backendServices/multi-region-2

但是,此 url-map 验证失败并出现以下错误:

$ gcloud compute url-maps validate --source regex-url-map.yaml
result:
  loadErrors:
  - HttpHeaderMatch has no predicates specified
  loadSucceeded: false
  testPassed: false

请注意,如果 cookie 的值是这样的:region=us,则与 cookie 的完全匹配会通过验证并正确匹配。完全匹配的 headerMatches 部分如下所示:

          headerMatches:
            - headerName: Cookie
              exactMatch: region=us

关于我在这里做错了什么的任何指示? 谢谢!

您的推理方式是正确的,但是 您尝试使用的功能在 GCP 的外部负载平衡中不受支持;它仅适用于内部负载平衡。

查看 documentation 中的最后一个短语:

Note that regexMatch only applies to Loadbalancers that have their loadBalancingScheme set to INTERNAL_SELF_MANAGED.

我知道这不是你要找的答案,但你总是可以file a new feature request on Google's IssueTracker并详细解释你想要什么,它是如何工作的等等。

您总是可以尝试在 http 请求中传递 region 值,而不是一直请求 https://myhost.com 如果您可以添加后缀,例如:https://myhost.com/region1 它会允许 GCP 负载平衡器规则处理它并且 direct the traffic to the backend 您希望。

看看这个例子. Another example . And another one (mine) explaining how to use pathMatcher to direct traffic to different backend services