使用Terraform为Fargate服务设置基于日期和时间的调度
首先
本篇文章介绍了如何使用Terraform在Fargate服务上设置基于日期和时间的定时规模扩容/缩减的示例。
AWS CLIを使用しても、サービスのスケジュールを設定することができます。
使用Terraform构建的样例整体架构。
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 服务设置调度配置时的参考,那就太好了。