学习如何快速部署 Terraform 自动缩放组

你是否厌倦了监控 AWS 实例的负载以及其接收的流量?为什么不通过部署 Terraform 自动伸缩组 来自动化一切呢?自动伸缩允许一些服务器在负载低的时候休眠,并在负载高的时候添加更多服务器,从而节省公司的电费。

在本教程中,您将学习如何构建和运行 Terraform 配置来构建自动伸缩组,并使用 Terraform 部署它们。

继续阅读,并在您的实例上实现零停机时间!

先决条件

本文将是一个逐步教程。如果您想跟着做,请确保您已经准备好了以下内容:

  • 一个 Amazon Web 服务 (AWS) 账户
  • A code editor – Even though you can use any text editor to work with Terraform configuration files, consider using Visual Studio (VS) Code as it understands the HCL Terraform language well.
  • Terraform – 本教程使用 Terraform v1.1.5 在 Ubuntu 20.04 LTS 上运行,但任何带有 Terraform 的操作系统都应该可以工作。

构建 AWS 自动伸缩组的 Terraform 配置

在运行 Terraform 命令来构建和部署基础架构之前,您必须创建 Terraform 配置文件。您将构建一个 Terraform 配置以在您的 AWS 帐户中创建一个 AWS Autoscaling 组。

1. 使用您喜欢的 SSH 客户端登录到您的计算机。

2. 接下来,创建一个名为 ~/terraform-autoscaling-demo 的文件夹,然后将工作目录更改 (cd) 到该文件夹。该文件夹将包含您在本教程中将要使用的所有配置文件。

mkdir ~/terraform-autoscaling-demo
cd ~/terraform-autoscaling-demo

3. 打开您喜欢的代码编辑器,复制/粘贴以下配置,并将文件保存为 main.tf 在 ~/terraform-autoscaling-demo 目录中。这个 main.tf 文件是 Autoscaling 组的 Terraform 配置。

下面的代码创建一个 autoscaling launch configuration (web_config) 并提供一个 Autoscaling 组 (autoscalegroup)。Autoscaling 组还附带其组件 (aws_autoscaling_scheduleaws_autoscaling_policy)。

# 创建包含AWS EC2实例详细信息的自动缩放启动配置
resource "aws_launch_configuration" "aws_autoscale_conf" {
# 定义自动缩放启动配置的名称
  name          = "web_config"
# 定义AWS EC2实例的镜像ID
  image_id      = "ami-04505e74c0741db8d"
# 定义AWS EC2实例的实例类型
  instance_type = "t2.micro"
# 定义用于访问AWS EC2实例的密钥
  key_name = "automateinfra"
}

# 在us-east-1a可用区内创建自动缩放组
resource "aws_autoscaling_group" "mygroup" {
# 定义启动AWS EC2实例的可用区
  availability_zones        = ["us-east-1a"]
# 指定自动缩放组的名称
  name                      = "autoscalegroup"
# 定义扩展时AWS EC2实例的最大数量
  max_size                  = 2
# 定义缩小时AWS EC2实例的最小数量
  min_size                  = 1
# 优雅期是AWS EC2实例在检查健康状态之前投入服务的时间。
  health_check_grace_period = 30
# 自动缩放将根据AWS CLoudwatch Alarm中定义的AWS EC2实例的健康状况发生
  health_check_type         = "EC2"
# force_delete在不等待池中所有实例终止的情况下删除自动缩放组
  force_delete              = true
# 定义终止策略,其中最老的实例将首先被替换
  termination_policies      = ["OldestInstance"]
# 缩放组依赖于自动缩放启动配置,因为涉及AWS EC2实例的配置
  launch_configuration      = aws_launch_configuration.aws_autoscale_conf.name
}
# 创建自动缩放组的自动缩放计划

resource "aws_autoscaling_schedule" "mygroup_schedule" {
  scheduled_action_name  = "autoscalegroup_action"
# 自动缩放组的最小大小
  min_size               = 1
# 自动缩放组的最大大小
  max_size               = 2
# Desired_capacity是自动缩放组中运行的EC2实例的数量
  desired_capacity       = 1
# 如果认为流量在此时可能达到峰值,则定义自动缩放的start_time。
  start_time             = "2022-02-09T18:00:00Z"
  autoscaling_group_name = aws_autoscaling_group.mygroup.name
}

# 创建自动缩放组的自动缩放策略
resource "aws_autoscaling_policy" "mygroup_policy" {
  name                   = "autoscalegroup_policy"
# 按比例调整的实例数。
  scaling_adjustment     = 2
  adjustment_type        = "ChangeInCapacity"
# 缩放完成后到下一次缩放开始之间的时间(秒)。
  cooldown               = 300
  autoscaling_group_name = aws_autoscaling_group.mygroup.name
}
# 创建根据CPU利用率自动调整AWS EC2实例的AWS CLoudwatch Alarm
resource "aws_cloudwatch_metric_alarm" "web_cpu_alarm_up" {
# 定义AWS Cloudwatch alarm的名称
  alarm_name = "web_cpu_alarm_up"
  comparison_operator = "GreaterThanOrEqualToThreshold"
  evaluation_periods = "2"
# 根据其进行缩放的metric_name(基于CPU)定义
  metric_name = "CPUUtilization"
# 与告警关联指标的命名空间
  namespace = "AWS/EC2"
# 触发AWS Cloudwatch Alarm后,它将等待60秒,然后自动缩放
  period = "60"
  statistic = "Average"
# CPU利用率阈值设置为10%
  threshold = "10"
  alarm_actions = [
        "${aws_autoscaling_policy.mygroup_policy.arn}"
    ]
dimensions = {
    AutoScalingGroupName = "${aws_autoscaling_group.mygroup.name}"
  }
}

4. 在~/terraform-autoscaling-demo目录下创建另一个名为provider.tf的文件,并填入以下内容。 provider.tf文件定义了诸如AWS、Oracle、Azure等提供商。该配置文件允许您将Terraform与正确的云服务连接起来。

本教程将在us-east-1区域创建资源。但您可以查找AWS支持的区域列表。

provider "aws" {
   region = "us-east-1"
 }

5. 最后,运行下面的tree命令,以验证项目文件夹(~/terraform-autoscaling-demo)中是否存在所有必需文件。

Verifying the Required Files for Building AWS Autoscaling Group in AWS Cloud

使用Terraform配置创建AWS Autoscaling组

现在您已经正确设置了Terraform配置文件和变量文件,是时候启动Terraform并创建AWS Autoscaling组了。

为了配置AWS Autoscaling组,与所有其他Terraform配置一样,Terraform使用三个连续的命令(terraform initterraform planterraform apply)。

1. 在 ~/terraform-autoscaling-demo 目录中运行 terraform init 命令。该命令会初始化所需的插件和提供者,以便与资源一起使用。

terraform init

如果一切顺利,您将在输出中看到 Terraform 初始化成功的消息,如下所示。

Initializing Terraform

2. 接下来,运行 terraform plan 命令,以确保配置文件的语法正确,并为将在基础架构中预配的资源提供蓝图。

terraform plan

如果成功,您应该会看到一个显示计划的消息,如下所示。

Executing the Terraform Plan

3. 最后,运行 terraform apply 命令,去掉训练轮并调用 Terraform 创建 AWS AutoScaling 组。

该命令告诉 Terraform 读取当前目录中的每个配置文件 (*.tf),编译发送到 AWS 的状态。然后,Terraform 构建 AWS Autoscaling 组和其他组件。

AWS Auto Scaling 不会产生额外费用。您只需支付运行应用程序所需的 AWS 资源。

Applying the Terraform Configuration to Build Autoscaling Group

在 AWS 云中验证 AWS Autoscaling 组

到目前为止,您应该已经使用 Terraform 创建了 AWS Autoscaling 组和相关组件。但是,您如何知道它们存在于您的 AWS 云中?通过在 AWS 管理控制台中手动检查来验证 Autoscaling 组。

1. 打开您喜欢的 Web 浏览器,然后登录到 AWS 管理控制台

2. 在控制台的主页上,点击搜索框,搜索并点击“EC2”以访问 EC2 仪表板。

点击 EC2 仪表板中的AWS 自动扩展组菜单项以管理您的自动扩展组。

在 EC2 仪表板上,您可以使用下面的自动缩放功能启动所需数量的 AWS EC2 实例。

Verifying the AWS Autoscaling Group with Scaling Policy Containing AWS CloudWatch Alarm

3. 最后,在 EC2 仪表板中点击 AWS 自动扩展启动配置。您将会看到您的自动扩展启动配置(web_config)如下所示。

Verifying the AWS Autoscaling Launch Configuration in AWS Cloud

使用负载测试对 EC2 实例进行自动缩放

现在,您已经验证了自动扩展组/策略和相关组件已正确设置,是时候测试自动缩放功能是否正常工作了。如何测试?通过在最近使用自动缩放组启动的实例上增加负载。

1. 使用 SSH 客户端打开使用自动扩展组启动的 AWS EC2 实例。

2. 接下来,启动终端,并运行下面的命令来安装负载压力工具stress-ng)。这个压力工具允许您定义和生成对 Ubuntu 机器的压力。

您也可以找到市场上其他的负载压力工具

sudo apt install stress-ng
Installing the Load Stress tool on the AWS EC2 instance

3. 运行下面的stress-ng命令来在实例上生成压力负载。

以下命令包含以下标志:

  • --cpu – 表示将在其上生成负载的核心数。
  • -v – 启用详细模式。
  • --timeout – 指定生成负载的时间。
sudo stress-ng --cpu 4 -v --timeout 3000s
Generating the load on AWS EC2 instance.

4. 立即运行以下top命令,显示生成负载后的Linux进程。

top

如下所示,您会看到在生成负载到实例后,CPU会出现波动。

Executing the top command to verify the CPU consumption

5. 转到AWS云上的AWS CloudWatch服务。您会注意到当CPU超过(10%)时,会生成一个警报。该警报通知了自动缩放组,根据自动缩放组中指定的配置,将实例数量从一个扩展到两个。

Viewing the Alarm Generated in the AWS CloudWatch Service

6. 最后,跳转到您在EC2仪表板中的实例,以验证AWS EC2实例。

您会看到启动了一个额外的实例,这证实了AWS自动缩放组及其组件的成功设置。

Verifying the AWS EC2 instances in the EC2 dashboard

您还可以在AWS自动缩放组活动中验证自动缩放活动,如下所示。

Verifying the AWS AutoScale group activities

结论

在本教程中,您已经学会了如何使用Terraform部署AWS自动缩放组及其组件。使用AWS自动缩放组构建自动缩放应用程序,使您能够在需要时进行扩展,是一项快速的任务。

现在,有了这些新发现的知识,可以放手实现与其他AWS服务的自动扩展,而不必担心服务器的负载!

Source:
https://adamtheautomator.com/terraform-autoscaling-group/