本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
监听器规则的操作类型
操作决定了当满足侦听器规则的条件时,负载均衡器如何处理请求。每条规则必须至少有一个操作来指定如何处理匹配的请求。每个规则操作都有类型和配置信息。应用程序负载均衡器支持监听器规则的以下操作类型。
操作类型
动作基础知识
-
每条规则必须恰好包含以下路由操作之一:
forwardredirectfixed-response、或,并且必须是最后要执行的操作。 -
HTTPS 侦听器可以有包含用户身份验证操作和路由操作的规则。
-
当有多个操作时,优先级最低的操作将首先执行。
-
如果协议版本是 gRPC 或 HTTP/2,则唯一支持的操作是
forward操作。
固定响应操作
fixed-response操作会丢弃客户端请求并返回自定义 HTTP 响应。您可以使用此操作返回 2XX、4XX 或 5XX 响应代码和可选的消息。
采取 fixed-response 操作时,操作和重定向目标的 URL 记录在访问日志中。有关更多信息,请参阅 访问日志条目。成功 fixed-response 操作的计数在 HTTP_Fixed_Response_Count 指标中报告。有关更多信息,请参阅 Application Load Balancer 指标。
例 固定响应操作示例
您可以在创建或修改规则时指定操作。有关更多信息,请参阅 create-rule 和 modify-rule 命令。以下操作发送具有指定状态代码和消息正文的固定响应。
[ { "Type": "fixed-response", "FixedResponseConfig": { "StatusCode": "200", "ContentType": "text/plain", "MessageBody": "Hello world" } } ]
转发操作
forward 操作会将请求路由至其目标组。在添加 forward 操作之前,请创建目标组并向其添加目标。有关更多信息,请参阅 创建目标组。
将流量分配给多个目标群体
如果为某个 forward 操作指定多个目标组,您必须为每个目标组指定权重。每个目标组权重都是一个介于 0 到 999 之间的值。对于将侦听器规则与加权目标组匹配的请求,会根据这些目标组的权重分配给这些目标组。例如,如果指定两个目标组,每个目标组的权重为 10,则每个目标组将接收一半的请求。如果指定两个目标组,一个权重为 10,另一个权重为 20,则权重为 20 的目标组接收的请求将是另一个目标组的两倍。
如果您配置规则以在加权目标组之间分配流量,并且其中一个目标组为空或只有不健康的目标,则负载均衡器不会自动故障转移到目标运行状况良好的目标组。
粘性会话和加权目标群体
默认情况下,配置规则以便在加权目标组之间分配流量时,并不能保证支持粘性会话。为了确保支持粘性会话,请为规则启用目标组粘性。当负载均衡器首次将请求路由到加权目标组时,它会生成一个名为的 Cookie AWSALBTG ,用于对有关选定目标组的信息进行编码,对 Cookie 进行加密,并将该 Cookie 包含在对客户端的响应中。客户端应该在向负载均衡器的后续请求中包含它收到的 cookie。当负载均衡器收到与启用目标组粘性的规则匹配并且包含 Cookie 的请求时,请求将路由到 Cookie 中指定的目标组。
Application Load Balancer 不支持 URL 编码的 Cookie 值。
对于 CORS(跨源资源共享)请求,某些浏览器需要 SameSite=None; Secure 来启用粘性。在这种情况下,Elastic Load Balancing 会生成第二个 cookie AWSALBTGCORS,其中包含与原始粘性 cookie 相同的信息以及此SameSite属性。客户端会同时收到这两个 Cookie。
您可以在创建或修改规则时指定操作。有关更多信息,请参阅 create-rule 和 modify-rule 命令。以下操作将请求转发到指定的目标组。
[ { "Type": "forward", "ForwardConfig": { "TargetGroups": [ { "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067" } ] } } ]
下面的操作将根据每个目标组的权重,将请求转发到两个指定的目标组。
[ { "Type": "forward", "ForwardConfig": { "TargetGroups": [ { "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/blue-targets/73e2d6bc24d8a067", "Weight": 10 }, { "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/green-targets/09966783158cda59", "Weight": 20 } ] } } ]
如果您具有一个包含多个目标组的转发操作,并且一个或多个目标组已启用了粘性会话,则必须启用目标组粘性。
下面的操作将请求转发到两个指定的目标组,并启用了目标组粘性。对于不包含粘性 Cookie 的请求,将根据每个目标组的权重进行传输。
[ { "Type": "forward", "ForwardConfig": { "TargetGroups": [ { "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/blue-targets/73e2d6bc24d8a067", "Weight": 10 }, { "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/green-targets/09966783158cda59", "Weight": 20 } ], "TargetGroupStickinessConfig": { "Enabled": true, "DurationSeconds": 1000 } } } ]
重定向操作
redirect操作将客户端请求从一个 URL 重定向到另一个 URL。根据需要,您可以将重定向配置为临时 (HTTP 302) 或永久 (HTTP 301)。
URI 包括以下组成部分:
protocol://hostname:port/path?query
您必须修改以下至少一个组成部分以避免重定向循环:协议、主机名、用户名、端口或路径。未修改的任何组成部分将保留其原始值。
- 协议
-
协议(HTTP 或 HTTPS)。您可以将 HTTP 重定向到 HTTP、将 HTTP 重定向到 HTTPS 以及将 HTTPS 重定向到 HTTPS。不能将 HTTPS 重定向到 HTTP。
- hostname
-
主机名。主机名不区分大小写,长度最多为 128 个字符,由字母数字字符、通配符(* 和 ?)及连字符 (-) 组成。
- port (远程调试端口)
-
端口(1 到 65535)。
- path
-
绝对路径,以前导“/”开头。路径区分大小写,长度最多为 128 个字符,由字母数字字符、通配符(* 和 ?)、&(使用 &)及以下特殊字符组成:_-.$/~"'@:+。
- 查询
-
查询参数。最大长度为 128 个字符。
您可以通过以下保留关键字,在目标 URL 中重用原始 URL 的 URI 组成部分:
-
#{protocol}– 保留协议。在协议和查询组成部分中使用。 -
#{host}– 保留域。在主机名、路径和查询组成部分中使用。 -
#{port}– 保留端口。在端口、路径和查询组成部分中使用。 -
#{path}– 保留路径。在路径和查询组成部分中使用。 -
#{query}– 保留查询参数。在查询组成部分中使用。
执行 redirect 操作时,操作记录在访问日志中。有关更多信息,请参阅 访问日志条目。成功 redirect 操作的计数在 HTTP_Redirect_Count 指标中报告。有关更多信息,请参阅 Application Load Balancer 指标。
使用 HTTPS 和端口 40443 进行重定向
以下规则设置永久重定向到一个 URL,该 URL 使用 HTTPS 协议和指定的端口 (40443),但保留原始主机名、路径和查询参数。此屏幕等同于“https://#{host}:40443/#{path}?#{query}”。
使用修改后的路径重定向
以下规则设置永久重定向到一个 URL,该 URL 包含原始协议、端口、主机名和查询参数,并使用 #{path} 关键字来创建修改的路径。此屏幕等同于“#{protocol}://#{host}:#{port}/new/#{path}?#{query}”。
使用 HTTPS 和端口 40443 进行重定向
您可以在创建或修改规则时指定操作。有关更多信息,请参阅 create-rule 和 modify-rule 命令。以下操作将 HTTP 请求重定向为端口 443 上的 HTTPS 请求,其主机名、路径和查询字符串与 HTTP 请求相同。
--actions '[{ "Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "Host": "#{host}", "Path": "/#{path}", "Query": "#{query}", "StatusCode": "HTTP_301" } }]'