

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 配置基于 Amazon SQS 的缩放


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

在开始之前，请确保已 AWS CLI [安装](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)并[配置](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)。此外，您必须有一个要使用的 Amazon SQS 队列。以下任务假设您已经有一个队列（标准队列或 FIFO 队列）、一个自动扩缩组以及 EC2 实例（运行使用队列的应用程序）。

有关 Amazon SQS 权限的更多信息，请参阅 [Amazon 简单队列服务开发人员指南](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/)。

**Topics**
+ [

## 步骤 1：创建 CloudWatch 自定义指标
](#create-sqs-cw-alarms-cli)
+ [

## 步骤 2：创建目标跟踪扩展策略
](#create-sqs-policies-cli)
+ [

## 步骤 3：测试扩展策略
](#validate-sqs-scaling-cli)

## 步骤 1：创建 CloudWatch 自定义指标


自定义指标是使用您选择的指标名称和命名空间定义的。自定义指标的命名空间不能以 `AWS/` 开头。有关发布自定义指标的更多信息，请参阅 *Amazon CloudWatch 用户指南*中的[发布自定义指标](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/publishingMetrics.html)主题。

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

**创建 CloudWatch 自定义指标 (AWS CLI)**

1. 使用 SQS [get-queue-attributes](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sqs/get-queue-attributes.html) 命令获取在队列中等待的消息数 (`ApproximateNumberOfMessages`)：

   ```
   aws sqs get-queue-attributes --queue-url https://sqs.region.amazonaws.com/123456789/MyQueue \
     --attribute-names ApproximateNumberOfMessages
   ```

1. 使用 [describe-auto-scaling-groups](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-auto-scaling-groups.html) 命令获取组的运行容量，这是处于 `InService` 生命周期状态的实例数。此命令返回 Auto Scaling 组的实例及其生命周期状态。

   ```
   aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names my-asg
   ```

1. 将该队列中可供检索的大致消息数量除以该组的运行容量，计算得出每个实例的积压。

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

   要发布您的自定义指标，请将中的*italics*占位符值替换为首选指标名称、指标值、命名空间（只要不是以 `AWS` “” 开头）和维度（可选），然后运行以下[put-metric-data](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/cloudwatch/put-metric-data.html)命令。

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

应用程序发出所需的指标之后，数据发送到 CloudWatch。该指标在 CloudWatch 控制台中可见。您可以通过登录 AWS 管理控制台 并导航到该 CloudWatch 页面来访问它。然后，通过导航到指标页面或者使用搜索框搜索指标来查看指标。有关查看指标的信息，请参阅 *Amazon CloudWatch 用户指南*中的[查看可用指标](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/viewing_metrics_with_cloudwatch.html)。

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


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

**创建目标跟踪扩缩策略（AWS CLI）**

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

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

   ```
   $ cat ~/config.json
   {
      "TargetValue":100,
      "CustomizedMetricSpecification":{
         "MetricName":"MyBacklogPerInstance",
         "Namespace":"MyNamespace",
         "Dimensions":[
            {
               "Name":"MyOptionalMetricDimensionName",
               "Value":"MyOptionalMetricDimensionValue"
            }
         ],
         "Statistic":"Average",
         "Unit":"None"
      }
   }
   ```

1. 使用 [put-scaling-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/put-scaling-policy.html) 命令以及在前面的步骤中创建的 `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
   ```

   这会创建两个警报：一个用于增加实例数量，另一个用于减少实例数量。它还会返回向其注册的策略的 Amazon 资源名称 (ARN) CloudWatch，该名称 CloudWatch 用于在指标阈值被违反时调用缩放。

## 步骤 3：测试扩展策略


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

**测试扩展函数**

1. 按照[创建 Amazon SQS 标准队列并发送消息](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/creating-sqs-standard-queues.html)或[创建 Amazon SQS FIFO 队列并发送消息](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/creating-sqs-fifo-queues.html)中的步骤，将消息添加到您的队列。请确保您增加了队列中的消息数量，使得每个实例的积压指标超过目标值。

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

1. 使用 [describe-auto-scaling-groups](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-auto-scaling-groups.html) 命令确认该组已启动一个实例。

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

**测试横向缩减功能**

1. 按照[接收和删除消息（控制台）](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/step-receive-delete-message.html)中的步骤，从队列中删除消息。请确保您减少了队列中的消息数量，使得每个实例的积压指标低于目标值。

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

1. 使用 [describe-auto-scaling-groups](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-auto-scaling-groups.html) 命令确认该组已终止一个实例。

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