使用Terraform为Fargate服务设置基于日期和时间的调度

首先

本篇文章介绍了如何使用Terraform在Fargate服务上设置基于日期和时间的定时规模扩容/缩减的示例。

AWS CLIを使用しても、サービスのスケジュールを設定することができます。

使用Terraform构建的样例整体架构。

00_fargate-autoscaling-sched.png

Terraform的示例代码和配置

$ tree aws-tf-fargate-autoscaling-sched
aws-tf-fargate-autoscaling-sched
├── modules
│   ├── autoscaling
│   │   ├── ecs_autoscaling.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── ecs
│   │   ├── alb.tf
│   │   ├── alb_listener.tf
│   │   ├── alb_security_group.tf
│   │   ├── alb_target_group.tf
│   │   ├── ecr_repository.tf
│   │   ├── ecs_cluster.tf
│   │   ├── ecs_security_group.tf
│   │   ├── ecs_service.tf
│   │   ├── ecs_task.tf
│   │   ├── ecs_task_definition.json
│   │   ├── ecs_task_role.tf
│   │   ├── ecs_task_trust_policy.json
│   │   ├── outputs.tf
│   │   └── variables.tf
│   └── network
│       ├── internet_gateway.tf
│       ├── outputs.tf
│       ├── route_table.tf
│       ├── subnet.tf
│       ├── variables.tf
│       └── vpc.tf
├── main.tf
├── provider.tf
├── Dockerfile
├── outputs.tf
├── terraform.tfvars-
└── variables.tf

参考:在tf文件中设置了基于日期和时间进行扩缩容的Fargate服务的调度安排。

resource "aws_appautoscaling_target" "ecs" {
  resource_id        = "service/${var.cluster_name}/${var.service_name}"
  scalable_dimension = "ecs:service:DesiredCount"
  service_namespace  = "ecs"
  min_capacity       = 1
  max_capacity       = 1

  lifecycle {
    ignore_changes = [min_capacity, max_capacity]
  }

}

resource "aws_appautoscaling_scheduled_action" "scale_out" {
  name               = var.scale_out_action.name
  resource_id        = aws_appautoscaling_target.ecs.resource_id
  scalable_dimension = aws_appautoscaling_target.ecs.scalable_dimension
  service_namespace  = aws_appautoscaling_target.ecs.service_namespace
  schedule           = var.scale_out_action.schedule
  timezone           = "Asia/Tokyo"

  scalable_target_action {
    min_capacity = var.scale_out_action.min_capacity
    max_capacity = var.scale_out_action.max_capacity
  }
}

resource "aws_appautoscaling_scheduled_action" "scale_in" {
  name               = var.scale_in_action.name
  resource_id        = aws_appautoscaling_target.ecs.resource_id
  scalable_dimension = aws_appautoscaling_target.ecs.scalable_dimension
  service_namespace  = aws_appautoscaling_target.ecs.service_namespace
  schedule           = var.scale_in_action.schedule
  timezone           = "Asia/Tokyo"

  scalable_target_action {
    min_capacity = var.scale_in_action.min_capacity
    max_capacity = var.scale_in_action.max_capacity
  }
}

在 main.tf 文件中设置参数。(schedule 参数可以设置任意的日期和时间。)

// 上記省略

module "autoscaling" {
  source     = "./modules/autoscaling"
  depends_on = [module.ecs]

  cluster_name = module.ecs.cluster_name
  service_name = module.ecs.service_name

  scale_out_action = {
    name         = "${module.ecs.service_name}-scale-out"
    schedule     = "cron(50 8 * * ? *)" # every day at 8:50 JST
    min_capacity = 2
    max_capacity = 2
  }

  scale_in_action = {
    name         = "${module.ecs.service_name}-scale-in"
    schedule     = "cron(10 18 * * ? *)" # every day at 18:10 JST
    min_capacity = 1
    max_capacity = 1
  }

}

准备工作在构建样本之前。

– 安装Docker Desktop
– 安装AWS CLI
– 安装Terraform
– 安装tfenv
– 获取IAM的访问密钥和安全密钥以执行Terraform操作

样本的操作确认环境

改变地球

$ terraform -version
Terraform v1.0.4
on darwin_amd64
+ provider registry.terraform.io/hashicorp/aws v3.54.0
+ provider registry.terraform.io/hashicorp/null v3.1.0
+ provider registry.terraform.io/hashicorp/template v2.2.0

AWS CLI 可以进行用户和资源管理的命令行界面。

$ aws --version
aws-cli/1.19.92 Python/3.7.4 Darwin/18.7.0 botocore/1.20.92

容器

docker --version
Docker version 20.10.7, build f0df350

建立样品的步骤 de

假定本操作是在Mac环境下进行的。
下载Terraform代码。

git clone https://github.com/okubo-t/aws-tf-fargate-autoscaling-sched.git

进入包含 Terraform 代码的目录。

$ cd aws-tf-fargate-autoscaling-sched

创建一个terraform.tfvars文件。

cp -p terraform.tfvars- terraform.tfvars

根据环境的不同,可以选择自行更改在创建的 terraform.tfvars 文件中的每个参数。

# リージョン
aws_region = "ap-northeast-1"

# リソース名のプレフィックス
prefix = "fargat-as-sched"

# リソースの環境
env = "demo"

# ALBに HTTPアクセスする時の送信元 IPアドレス
my_remote_ip = "0.0.0.0/0"

接下来,我将执行命令。

$ export AWS_ACCESS_KEY_ID=""
$ export AWS_SECRET_ACCESS_KEY=""
$ export AWS_DEFAULT_REGION=ap-northeast-1
$ terraform init
$ terraform plan
$ terraform apply

Apply complete! Resources: 30 added, 0 changed, 0 destroyed.

Outputs:

alb_dns_name = "fargat-as-sched-demo-alb-1234567890.ap-northeast-1.elb.amazonaws.com"
ecr_repository = "1234567890.dkr.ecr.ap-northeast-1.amazonaws.com/fargat-as-sched-demo-app"
scale_in_action_name = "fargat-as-sched-demo-svc-scale-in"
scale_out_action_name = "fargat-as-sched-demo-svc-scale-out"

這樣,使用Terraform建立環境已經完成。
我將記錄部署後產生的輸出內容。

我会使用HTTP来确认alb_dns_name的值。启动容器可能需要一点时间。

$ curl -I http://fargat-as-sched-demo-alb-1234567890.ap-northeast-1.elb.amazonaws.com

HTTP/1.1 200 OK
Date: Sat, 14 Aug 2021 05:40:08 GMT
Content-Type: text/html
Content-Length: 612
Connection: keep-alive
Server: nginx/1.21.1
Last-Modified: Tue, 06 Jul 2021 15:21:03 GMT
ETag: "60e474df-264"
Accept-Ranges: bytes

请确认以下命令中已注册了基于日期和时间进行的缩放计划:

$ aws application-autoscaling describe-scheduled-actions \
    --service-namespace ecs \
    --scheduled-action-names fargat-as-sched-demo-svc-scale-in fargat-as-sched-demo-svc-scale-out
{
    "ScheduledActions": [
        {
            "ScheduledActionName": "fargat-as-sched-demo-svc-scale-in",
            "ScheduledActionARN": "arn:aws:autoscaling:ap-northeast-1:1234567890:scheduledAction:*********-**********-***********:resource/ecs/service/fargat-as-sched-demo-cluster/fargat-as-sched-demo-svc:scheduledActionName/fargat-as-sched-demo-svc-scale-in",
            "ServiceNamespace": "ecs",
            "Schedule": "cron(10 18 * * ? *)",
            "Timezone": "Asia/Tokyo",
            "ResourceId": "service/fargat-as-sched-demo-cluster/fargat-as-sched-demo-svc",
            "ScalableDimension": "ecs:service:DesiredCount",
            "ScalableTargetAction": {
                "MinCapacity": 1,
                "MaxCapacity": 1
            },
            "CreationTime": 1628919499.148
        },
        {
            "ScheduledActionName": "fargat-as-sched-demo-svc-scale-out",
            "ScheduledActionARN": "arn:aws:autoscaling:ap-northeast-1:1234567890:scheduledAction:*********-**********-***********:resource/ecs/service/fargat-as-sched-demo-cluster/fargat-as-sched-demo-svc:scheduledActionName/fargat-as-sched-demo-svc-scale-out",
            "ServiceNamespace": "ecs",
            "Schedule": "cron(50 8 * * ? *)",
            "Timezone": "Asia/Tokyo",
            "ResourceId": "service/fargat-as-sched-demo-cluster/fargat-as-sched-demo-svc",
            "ScalableDimension": "ecs:service:DesiredCount",
            "ScalableTargetAction": {
                "MinCapacity": 2,
                "MaxCapacity": 2
            },
            "CreationTime": 1628919499.144
        }
    ]
}

在预定的日期和时间,确认服务进行缩容/扩容。

清理垃圾

请使用以下命令来删除由Terraform创建的AWS环境。

$ terraform destroy

最后

如果能成为在使用 Terraform 对 Fargate 服务设置调度配置时的参考,那就太好了。