Amazon EC2 Container Service
开发人员指南 (API Version 2014-11-13)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

教程:具有 CloudWatch 服务利用率指标的 服务 Auto Scaling

以下过程帮助您创建一个 Amazon ECS 集群和一种通过 CloudWatch 警报使用 服务 Auto Scaling 向上扩展(和向下扩展)的服务。

Amazon ECS 发布 CloudWatch 指标与服务的平均 CPU 和内存使用率。您可以使用这些服务利用率指标向上扩展您的服务以满足高峰期的大量需求,也可以向下扩展您的服务以在低利用率期间降低成本。有关更多信息,请参阅 服务利用率

在本教程中,您将使用 Amazon ECS 首次运行向导创建一个集群和一个服务(在 Elastic Load Balancing 负载均衡器后面运行)。然后,您使用 CloudWatch 警报在服务上配置 服务 Auto Scaling,该警报使用 CPUUtilization 指标向上或向下扩展您的服务,具体取决于当前应用程序负载。

当您的服务的 CPU 利用率上升至 75% 以上(这意味着,已使用为服务预留的 CPU 的 75% 以上)时,向外扩展警报将触发 服务 Auto Scaling 以向您的服务添加另一个任务来帮助处理增加的负载。相反,当您的服务的 CPU 利用率下降至 25% 以下时,向内扩展警报将促使服务预期数量减少,以便为其他资源和服务释放集群资源。

先决条件

本教程假定您有一个 AWS 账户和一个有权执行教程中介绍的所有操作的 IAM 管理用户,以及一个位于当前区域的 Amazon EC2 密钥对。如果您没有这些资源(或不确定是否有),则可以执行 Amazon ECS 的设置中的步骤来创建这些资源。

您的 Amazon ECS 容器实例还需要对您用来启动容器实例的 IAM 角色的 ecs:StartTelemetrySession 权限。如果您在 CloudWatch 指标可用于 Amazon ECS 之前已创建您的 Amazon ECS 容器实例,则可能需要添加此权限。有关检查您的 Amazon ECS 容器实例角色并为容器实例附加托管 IAM 策略的信息,请参阅在 IAM 控制台中检查 ecsInstanceRole

步骤 1:创建集群和服务

为集群和服务启用 CloudWatch 指标后,您可以使用 Amazon ECS 首次运行向导创建集群和服务。首次运行向导负责为本教程创建所需的 IAM 角色和策略(一个用于容器实例的 Auto Scaling 组),它还创建在负载均衡器后面运行的服务。该向导还将使稍后的清理过程变得轻松得多,因为您可以通过一个步骤删除整个 AWS CloudFormation 堆栈。

对于本教程,您将创建一个名为 service-autoscaling 的集群和一个名为 sample-webapp 的服务。

创建集群和服务

  1. 打开 https://console.amazonaws.cn/ecs/home#/firstRun 上的 Amazon ECS 控制台首次运行向导。

  2. 默认情况下,您可以选择创建一个映像存储库并将一个映像推送到 Amazon ECR。

     选择您的配置选项

    在本教程中,您将不会使用 Amazon ECR,因此请确保清除下方的选项。选择 Continue 以继续。

  3. Create a task definition 页面上,保留所有默认选项并选择 Next step

  4. Configure service 页面上,为 Container name: host port 选择 simple-app:80

    重要

    如果 Elastic Load Balancing 负载均衡器存在于您的 AWS 资源中时,则将产生费用。有关更多信息,请参阅 Elastic Load Balancing 定价

  5. 对于 Select IAM role for service,选择您已创建的现有 Amazon ECS 服务 (ecsServiceRole) 角色,或选择 Create new role 为您的服务创建所需的 IAM 角色。

  6. 此处的其余默认值是针对示例应用程序设置的,因此请将其保持不变并选择 Next step

  7. Configure cluster 页面上,输入以下信息:

    1. 对于 Cluster name,键入 service-autoscaling

    2. 对于实例类型,请选择任意可用实例类型。默认 t2.micro 非常适用于本教程。

    3. 对于 Number of instances,输入要在集群中启动的实例的数量。对于本教程,两个实例已够用。

      重要

      您的 AWS 账户从您启动实例的那一刻开始承担这些实例的标准 Amazon EC2 使用费,直至您终止实例(本教程最后一项任务),即使实例处于闲置状态也要计费。

    4. (可选)对于 Key pair,选择要用于对实例的 SSH 访问的密钥对。虽然此项不是必需的,但如果您稍后需要排查实例的问题,那么它对于诊断来说很有用。

    5. 对于 Container instance IAM role,选择您已创建的现有 Amazon ECS 容器实例 (ecsInstanceRole) 角色,或选择 Create new role 为您的容器实例创建所需的 IAM 角色。

    6. 选择 Review and Launch 以继续。查看您的配置并选择 Launch instance & run service 以完成操作。

    您将会转到 Launch Status 页面,此页面显示您的启动状态并描述此过程的每一步(在创建和填充您的 Auto Scaling 组时,这可能需要几分钟时间才能完成)。

  8. 创建集群和服务后,选择 View service 以查看新服务。

步骤 2:配置 服务 Auto Scaling

现在,您已启动一个集群,并且已在该集群中创建一个在负载均衡器后面运行的服务,您可以通过创建根据 CloudWatch 警报向上和向下扩展您的服务的扩展策略来配置 服务 Auto Scaling。

配置基本 服务 Auto Scaling 参数

  1. Service: sample-webapp 页面上,您的服务配置应类似于下图(尽管任务定义版本和负载均衡器名称可能会不同)。选择 Update 以更新您的新服务。

     选择您的配置选项
  2. Update service 页面上,选择 Configure 服务 Auto Scaling

  3. 对于 服务 Auto Scaling,选择 Configure Service Auto Scaling to adjust your service’s desired count

     选择您的配置选项
  4. 对于 Minimum number of tasks,输入 1 作为 服务 Auto Scaling 要使用的任务数的下限值。您的服务的预期数量将不会自动调整到低于此数量。

  5. 对于 Desired number of tasks,此字段是使用您之前输入的值预先填充的。此值必须介于此页面上指定的最小任务数和最大任务数之间。将此值保留为 1。

  6. 对于 Maximum number of tasks,输入 2 作为 服务 Auto Scaling 服务要使用的任务数的上限值。您的服务的预期数量将不会自动调整到高于此数量。

  7. 对于 IAM role for Service Auto Scaling,选择一个 IAM 角色来授权 Application Auto Scaling 服务代表您调整您的服务的预期数量。如果您之前未创建此类角色,请选择 Create new role,系统将为您创建此角色。为了方便将来参考,为您创建的角色名为 ecsAutoscaleRole。有关更多信息,请参阅 Amazon ECS 服务 Auto Scaling IAM 角色

为您的服务配置扩展策略

以下步骤将帮助您创建扩展策略和可用于为您的服务触发扩展活动的 CloudWatch 警报。您可以创建一个 Scale out 警报来增大服务的预期数量,并创建一个 Scale in 警报来减小服务的预期数量。

  1. 服务 Auto Scaling (optional) 页面上,选择 Add scaling policy 以配置您的 ScaleOutPolicy

  2. 对于 Policy name,输入 ScaleOutPolicy

  3. 对于 Execute policy when,选择 Create new alarm

    1. 对于 Alarm name,输入 sample-webapp-cpu-gt-75

    2. 对于 ECS service metric,选择 CPUUtilization

    3. 对于 Alarm threshold,输入以下信息以匹配下图。这将导致 CloudWatch 警报在服务的 CPU 利用率高于 75% 的时间达到 1 分钟时触发。

       向外扩展警报
    4. 选择 Save 以保存您的警报。

  4. 对于 Scaling action,输入以下信息以匹配下图。这将导致服务的预期数量在触发警报时增加 1 个任务。

     向外扩展操作
  5. 对于 Cooldown period,输入 60 作为扩展操作之间的秒数,然后选择 Save 以保存您的 ScaleOutPolicy

  6. 返回到 服务 Auto Scaling (optional) 页面后,选择 Add scaling policy 以配置您的 ScaleInPolicy

  7. 对于 Policy name,输入 ScaleInPolicy

  8. 对于 Execute policy when,选择 Create new alarm

    1. 对于 Alarm name,输入 sample-webapp-cpu-lt-25

    2. 对于 ECS service metric,选择 CPUUtilization

    3. 对于 Alarm threshold,输入以下信息以匹配下图。这将导致 CloudWatch 警报在服务的 CPU 利用率低于 25% 的时间达到 1 分钟时触发。

       向内扩展警报
    4. 选择 Save 以保存您的警报。

  9. 对于 Scaling action,输入以下信息以匹配下图。这将导致服务的预期数量在触发警报时减少 1 个任务。

     向内扩展操作
  10. 对于 Cooldown period,输入 60 作为扩展操作之间的秒数,然后选择 Save 以保存您的 ScaleInPolicy

  11. 返回到 服务 Auto Scaling (optional) 页面后,选择 Save 完成 服务 Auto Scaling 配置。

  12. Update Service 页面上,选择 Update Service

  13. 当您的服务状态为已完成更新时,选择 View Service

步骤 3:触发扩展活动

使用 服务 Auto Scaling 配置服务后,可以通过将服务的 CPU 利用率推送到 ALARM 状态来触发扩展活动。由于本教程中的示例是一个在负载均衡器后面运行的 Web 应用程序,因此,您可以将数千个 HTTP 请求发送到服务(使用 ApacheBench 实用工具)以使服务 CPU 利用率迅速上升并超过我们的阈值。此峰值将触发警报,而警报反过来会触发一个扩展活动来向服务添加一个任务。

ApacheBench 实用工具完成请求后,服务 CPU 利用率应降至 25% 阈值以下,并触发将服务的预期数量返回至 1 的向内扩展活动。

为服务触发扩展活动

  1. 从控制台中的服务主视图页面,选择负载均衡器名称以在 Amazon EC2 控制台中查看其详细信息。您需要负载均衡器的 DNS 名称,类似于如下内容:EC2Contai-EcsElast-SMAKV74U23PH-96652279.us-east-1.elb.amazonaws.com

  2. 使用 ApacheBench (ab) 实用工具在短时间内向负载均衡器发出数千个 HTTP 请求。

    注意

    此命令在 Mac OSX 上是默认安装的,也可用于许多 Linux 分发版。例如,您可以在 Amazon Linux 上通过以下命令安装 ab

    Copy
    $ sudo yum install -y httpd24-tools

    运行以下命令,将替换您的负载均衡器的 DNS 名称。

    Copy
    $ ab -n 100000 -c 1000 http://EC2Contai-EcsElast-SMAKV74U23PH-96652279.us-east-1.elb.amazonaws.com/
  3. 通过以下网址打开 CloudWatch 控制台:https://console.amazonaws.cn/cloudwatch/

  4. 在左侧导航窗格中,选择 Alarms

  5. 等待 ab HTTP 请求在 CloudWatch 控制台中触发向外扩展警报。您应该会看到您的 Amazon ECS 服务向外扩展并将 1 个任务添加到服务的预期数量。

  6. ab HTTP 请求完成后的短时间内(1 到 2 分钟),您的向内扩展警报将触发,并且向内扩展策略会将服务的预期数量减至 1。

步骤 4:清理

完成本教程后,您可以选择保留您的集群、Auto Scaling 组、负载均衡器和 EC2 实例。但是,如果您没有主动使用这些资源,则应考虑将其清除以免您的账户产生不必要的费用。

删除集群和 CloudWatch 警报

  1. 在 Amazon ECS 控制台中,切换到左侧导航窗格中的 Clusters

  2. Clusters 页面上,选择 service-autoscaling 集群右上角的 x 以删除集群。

  3. 查看并选择 Delete 以确认删除集群。集群 AWS CloudFormation 堆栈的清理可能需要几分钟才能完成。

  4. 在 CloudWatch 控制台的 Alarms 视图中,选择以 sample-webapp-cpu- 开头的警报,然后选择 Delete 以删除警报。

  5. 选择 Yes, Delete 以确认删除警报。