配置基于 Amazon SQS 的缩放 - Amazon EC2 Auto Scaling
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

配置基于 Amazon SQS 的缩放

以下步骤介绍如何配置基于 Amazon SQS 的自动扩缩。您将了解如何创建 CloudWatch 自定义指标,如何使用 Amazon CLI 设置目标跟踪策略,以及如何测试配置。

在开始之前,请确保您已经安装配置 Amazon CLI。此外,您必须有一个要使用的 Amazon SQS 队列。以下任务假设您已经有一个队列(标准队列或 FIFO 队列)、一个自动扩缩组以及 EC2 实例(运行使用队列的应用程序)。

有关 Amazon SQS 权限的更多信息,请参阅 Amazon 简单队列服务开发人员指南

步骤 1:创建 CloudWatch 自定义指标

自定义指标是使用您选择的指标名称和命名空间定义的。自定义指标的命名空间不能以 AWS/ 开头。有关发布自定义指标的更多信息,请参阅 Amazon CloudWatch 用户指南中的发布自定义指标主题。

按照此过程,通过首先从您的 Amazon 账户读取信息来创建自定义指标。然后,计算前面的章节中建议的每个实例的积压指标。最后,按照 1 分钟的粒度将该数字发布到 CloudWatch。只要可能,我们强烈建议您按 1 分钟粒度的指标进行扩展,以确保更快地响应系统负载变化。

要创建 CloudWatch 自定义指标(Amazon CLI)
  1. 使用 SQS get-queue-attributes 命令获取在队列中等待的消息数 (ApproximateNumberOfMessages)。

    aws sqs get-queue-attributes --queue-url https://sqs.region.amazonaws.com/123456789/MyQueue \ --attribute-names ApproximateNumberOfMessages
  2. 使用 describe-auto-scaling-groups 命令获取组的运行容量,这是处于 InService 生命周期状态的实例数。此命令返回 Auto Scaling 组的实例及其生命周期状态。

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names my-asg
  3. 将该队列中可供检索的大致消息数量除以该组的运行容量,计算得出每个实例的积压。

  4. 创建每分钟运行一次的脚本,以检索每个实例的积压,并将其发布到 CloudWatch 自定义指标。发布自定义指标时,需要指定该指标的名称、命名空间、单位、值以及零个或多个维度。维度由维度名称和维度值组成。

    若要发布自定义指标,请将斜体的占位符值替换为首选指标名称、指标值、命名空间(只要不是以 “AWS” 开头即可)和维度(可选),然后运行以下 put-metric-data 命令。

    aws cloudwatch put-metric-data --metric-name MyBacklogPerInstance --namespace MyNamespace \ --unit None --value 20 --dimensions MyOptionalMetricDimensionName=MyOptionalMetricDimensionValue

应用程序发出所需的指标之后,数据发送到 CloudWatch。该指标会显示在 CloudWatch 控制台中。您可以登录到 Amazon Web Services 管理控制台 并导航到 CloudWatch 页面来访问它。然后,通过导航到指标页面或者使用搜索框搜索指标来查看指标。有关查看指标的更多信息,请参阅 Amazon CloudWatch 用户指南 中的查看可用指标

步骤 2:创建目标跟踪扩展策略

现在,您可以将创建的指标添加到目标跟踪扩缩策略中。

创建目标跟踪扩缩策略(Amazon CLI)
  1. 使用以下cat命令可以在您的主目录的名为config.json的 JSON 文件中存储扩缩策略的目标值和自定义指标规范。将每个用户输入占位符替换为您自己的信息。对于 TargetValue,计算每个实例的可接受积压指标并在此处输入。要计算此数值,请考虑正常延迟值并将其除以处理一条消息所需的平均时间(如前面的章节所述)。

    如果您没有为步骤 1 中创建的指标指定任何维度,请不要在自定义指标规范中包含任何维度。

    $ cat ~/config.json { "TargetValue":100, "CustomizedMetricSpecification":{ "MetricName":"MyBacklogPerInstance", "Namespace":"MyNamespace", "Dimensions":[ { "Name":"MyOptionalMetricDimensionName", "Value":"MyOptionalMetricDimensionValue" } ], "Statistic":"Average", "Unit":"None" } }
  2. 使用 put-scaling-policy 命令以及在之前步骤中创建的 config.json 文件来创建扩展策略:

    aws autoscaling put-scaling-policy --policy-name sqs100-target-tracking-scaling-policy \ --auto-scaling-group-name my-asg --policy-type TargetTrackingScaling \ --target-tracking-configuration file://~/config.json

    这会创建两个警报:一个用于增加实例数量,另一个用于减少实例数量。它还将返回注册到 CloudWatch 的策略的 Amazon 资源名称(ARN),CloudWatch 使用该名称在超过指标阈值的任何时候调用扩缩。

步骤 3:测试扩展策略

在您完成设置后,验证您的扩展策略是否正常工作。您可以通过以下方式测试:增加 SQS 队列中的消息数,然后验证 Auto Scaling 组是否已启动更多 EC2 实例。您还可以通过以下方式测试:减少 SQS 队列中的消息数,然后验证 Auto Scaling 组是否终止了一个 EC2 实例。

测试扩展函数
  1. 按照创建 Amazon SQS 标准队列并发送消息创建 Amazon SQS FIFO 队列并发送消息中的步骤,将消息添加到您的队列。请确保您增加了队列中的消息数量,使得每个实例的积压指标超过目标值。

    您的更改调用警报可能需要几分钟时间。

  2. 使用 describe-auto-scaling-groups 命令验证该组是否已启动了实例:

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name my-asg
测试横向缩减功能
  1. 按照接收和删除消息(控制台)中的步骤,从队列中删除消息。请确保您减少了队列中的消息数量,使得每个实例的积压指标低于目标值。

    您的更改调用警报可能需要几分钟时间。

  2. 使用 describe-auto-scaling-groups 命令验证该组是否已终止了实例:

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name my-asg