亚马逊AWS官方博客

新增功能 – Application Load Balancer 通过加权目标组简化部署

云计算的优势之一,就是可以通过编程的方式创建基础设施并在不再需要时拆除。这样彻底改变了开发人员部署应用程序的方式。当开发人员在本地部署应用程序时,他们必需为新版本的应用程序重复使用现有的基础设施。在云中,开发人员为新版本的应用程序创建新的基础设施。他们会保持旧版本并行运行,直到将旧版本拆除为止。这种方法称为蓝/绿部署。借助这种方法,可以在应用程序的两个版本之间逐渐切换流量,监控新版本的业务和运营指标,以及在发生问题时将流量切换回旧版本。

在蓝/绿部署方法方面,AWS 客户目前使用两种策略。第一种策略是创建一个第二应用程序堆栈,包括一个第二负载均衡器。开发人员使用某种加权路由方法(例如 DNS)将部分流量导向各个堆栈。第二种策略是替换负载均衡器后的基础设施。这两种策略都会导致在版本之间切换流量时的延迟,具体取决于 DNS TTL 和客户端计算机的缓存。这可能会导致运行额外的负载均衡器,产生额外的费用,并且额外的负载均衡器预热也会产生延迟。

目标组会告诉负载均衡器流量的导向目标:EC2 实例、固定 IP 地址或者 AWS Lambda 函数等等。在创建负载均衡器时,您会创建一个或多个侦听器,并且会配置侦听器规则以将流量导向到一个目标组。

今天,我们宣布推出适用于 Application Load Balancer 的加权目标组。借助此功能,开发人员可以控制如何在应用程序的不同版本之间分配流量。

多重加权目标组
您现在可以将多个目标组添加到侦听器规则转发操作并指定各个目标组的权重。例如,假设您定义的规则拥有两个目标组,权重分别为 8 和 2,则负载均衡器会将 80% 的流量路由到第一个目标组,将剩下 20% 的流量路由到第二个目标组。

您可以立即通过此 CDK 代码来试用加权目标组。它会用 EC2 实例创建两个 Auto Scaling 组,并在其前面放置一个 Elastic Load Balancer。它还会在实例上部署一个示例 Web 应用程序。Web 应用程序的蓝色版本将部署在蓝色实例中,Web 应用程序的绿色版本将部署在绿色实例中。基础设施的架构如下所示:

您可以 git cloneCDK 项目并键入 npm run build && cdk bootstrap && cdk deploy 以部署上述基础设施。为演示如何配置负载均衡器,此 CDK 代码会创建 Auto Scaling 组、负载均衡器和通用目标组。下面我们手动完成配置并创建两个加权目标组,应用程序的每个版本一个目标组。

首先,我将导航至 EC2 控制台,选择目标组,然后单击创建目标组按钮。我会创建一个叫做 green 的目标组。请务必选择正确的 Amazon Virtual Private Cloud(此 CDK 脚本创建的 VPC 名称以“AlbWtgStack...”开头),然后单击创建

我重复上述操作创建了一个 blue 目标组。我的目标组控制台如下所示:

然后我将两个 Auto Scaling 组更改为指向 bluegreen 目标组。在 AWS 管理控制台中,我单击 Auto Scaling 组,选择其中的一个 Auto Scaling 组,我会注意它的名称(包含“green”或“blue”),然后依次单击操作编辑

编辑详细信息屏幕中,我移除此 CDK 脚本创建的目标组,然后添加名称与 Auto Scaling 组(greenblue)匹配的目标组。我单击屏幕上的保存,然后为另一个 Auto Scaling 组重复此操作。

然后我更改侦听器规则以添加这两个目标组,每个目标组都有自己的权重。在 EC2 控制台中,我选择左侧的负载均衡器,然后搜索此 CDK 代码创建的负载均衡器(名称以“alb”开头)。我单击侦听器,然后单击查看/编辑规则

其中有一个由 CDK 脚本创建的规则。我会单击顶部的编辑图标,然后再次单击此规则左侧的编辑图标,从而修改该规则。我会单击回收站图标删除转发至规则。

然后我会单击“+ 添加操作”以添加两个转发至规则,每个目标组(bluegreen)一个,权重均为 50。

最后,我会单击右侧的更新。现在我可以测试加权负载均衡。

我将浏览器指向负载均衡器的 DNS 名称。我会看到此 Web 应用程序的绿色或蓝色版本。我强制让浏览器重新加载页面,我观察到负载均衡器正在执行操作,将 50% 的请求发送到绿色应用程序,将 50% 的请求发送到蓝色应用程序。一些浏览器可能会缓存页面,不会反映我定义的权重。Safari 和 Chrome 在此方面不如 Firefox 激进。

这时,在 AWS 管理控制台中,我将权重更改为 80 和 20,然后继续刷新浏览器。我观察到平均 10 次有 8 次显示的是蓝色版本。

我还可以从 ALB ModifyListener APIAWS 命令行界面 (CLI) 或通过 AWS CloudFormation 调整权重。

例如,我使用 AWS 命令行界面 (CLI),与以下类似:

aws elbv2 modify-listener    \
     --listener-arn "<listener arn>" \
     --default-actions        \
        '[{
          "Type": "forward",
          "Order": 1,
          "ForwardConfig": {
             "TargetGroups": [
               { "TargetGroupArn": "<target group 1 arn>",
                 "Weight": 80 },
               { "TargetGroupArn": "<target group 2 arn>",
                 "Weight": 20 },
             ]
          }
         }]'

或者使用 AWS CloudFormation,JSON 节选如下:

"ListenerRule1": {
      "Type": "AWS::ElasticLoadBalancingV2::ListenerRule",
      "Properties": {
        "Actions": [{
          "Type": "forward",
          "ForwardConfig": {
            "TargetGroups": [{
              "TargetGroupArn": { "Ref": "TargetGroup1" },
              "Weight": 1
            }, {
              "TargetGroupArn": { "Ref": "TargetGroup2" },
              "Weight": 1
            }]
          }
        }],
        "Conditions": [{
          "Field": "path-pattern",
          "Values": ["foo"]
        }],
        "ListenerArn": { "Ref": "Listener" },
        "Priority": 1
      }
    }

如果您使用外部服务或工具来管理负载均衡器,您可能需要等待相关提供商更新他们的 API 以支持 Application Load Balancer 上的加权路由配置。

其他用途
除蓝/绿部署外,AWS 客户还可以将加权目标组用于另外两个使用案例:云迁移或在不同的 AWS 计算资源之间迁移。

当您将本地应用程序迁移到云中时,您可能需要逐步推进,在一段时期内需要在本地数据中心和云中同时运行应用程序。当您最终验证云端版的性能符合要求时,您可以彻底弃用本地应用程序。

同样,例如当您将工作负载从 EC2 实例迁移到在 AWS Fargate 上运行的 Docker 容器时,您可以轻松在新目标组上建立新的应用程序堆栈,然后通过更改目标组的权重逐步迁移流量,而不会给最终用户带来停机的问题。由于 Application Load Balancer 支持将 EC2、容器(Amazon ECSAmazon Elastic Kubernetes ServiceAWS Fargate)、AWS Lambda 函数和 IP 地址等多种 AWS 资源作为目标,您可以选择在任意这些资源之间迁移流量。

目标组粘性
有时,您会希望客户端在指定的时间段内使用相同版本的应用程序,或者您会希望当前使用此应用程序的客户端不会在其会话中切换到新部署的 (green) 版本。对于这些使用案例,我们还突出了目标组粘性功能。启用目标组粘性功能后,在指定时间段内来自一个客户端的请求将全部发送到同一目标组。在该时间段到期时,请求将会根据权重分配到目标组。ALB 会通过 Cookie 来保持目标组粘性。

请注意,目标组粘性与已经存在的目标粘性不同(也称为粘性会话)。粘性会话可以确保来自一个客户端的请求始终固定路由到一个目标组中的特定目标。目标组粘性仅确保请求会发送到特定的目标组。粘性会话可以与目标组粘性结合使用。

要从 AWS 命令行界面 (CLI) 添加或配置目标组粘性,您需要使用 TargetGroupStickinessConfig 参数,与以下类似:

aws elbv2 modify-listener \
    --listener-arn "<listener arn" \
    --default-actions \
    '[{
       "Type": "forward",
       "Order": 1,
       "ForwardConfig": {
          "TargetGroups": [
             {"TargetGroupArn": "<target group 1 arn>", "Weight": 20}, \
             {"TargetGroupArn": "<target group 2 arn>", "Weight": 80}, \
          ],
          "TargetGroupStickinessConfig": {
             "Enabled": true,
             "DurationSeconds": 2000
          }
       }
   }]'

可用性
Application Load Balancer 支持每个侦听器规则 5 个目标组,每个目标组都可有自己的权重。在不超过 API 阈值限制的前提下,权重调节的次数不受限制。实际流量权重的更新可能会有轻微的延迟。

加权目标组现已在所有 AWS 区域推出。在 Application Load Balancer 上使用加权目标组不会产生额外费用。

— seb

后记:请勿忘记删除为此博文创建的示例基础设施并停止产生 AWS 费用。由于我们手动修改了 CDK 创建的基础设施,使用简单的 cdk destroy 命令即可返回。请连接到 AWS CloudFormation 控制台,然后删除 AlbWtgStack。您还需要在 EC2 控制台中手动删除 bluegreen 目标组。