Terraform Module สำหรับ ปิด/เปิด AWS EC2 Instance
ได้รับโจทย์มาว่าอยากปิด/เปิด EC2 ตามเวลาที่ตั้งไว้เช่น ปิดตอนเที่ยงคืน (0:00) แล้วเปิดตอนแปดโมงช้า (07:00) เดี๋ยวนี้ทำได้ง่ายๆผ่าน Terraform Module
หลักการทำงานของ Terraform Module นี้คือมันจะให้เราตั้งชื่อ Tag key กับ value ให้กับ resource ที่เราต้องการควบคุมการปิดเปิดตามเวลา
Terraform Module จะไปสร้าง resource AWS EventBridge rules เพื่อสร้าง schedule สำหรับ invoke Lambda function ตามเวลาที่กำหนด Lambda function เมื่อถูก invoke จะไปกวาดเอา resource ที่มี Tag key กับ value ที่กำหนด ถ้าเจอ resource ก็ทำการ ปิด หรือเปิด ตาม policy ที่กำหนด
Terraform Module ที่เอามาใช้คือ lambda-scheduler-stop-start ของ diodonfrost
Terraform Module นี้จะสร้าง AWS Lambda function ด้วย runtine Python 3.7 สามารถควบคุมการปิด/เปิด resource ดังต่อไปนี้ได้
- EC2 instances
- ECS service
- RDS clusters
- RDS instances
- Redshift clusters
- EC2 autoscaling group
- Cloudwatch Alarm
- DocumenDB (เอกสารบอกว่าใช้ได้ แต่ดูจากใน code ใช้ไม่ได้)
ตัวอย่างด้านล่างใช้ Terraform module โดยมี parameter ที่สำคัญดังต่อไปนี้
- ตั้งชื่อว่า ec2-auto-stop
- ตั้งให้ทำงานตอน 00:00 ของทุกวัน cloudwatch_schedule_expression = cron(0 17 * * ? *) เวลาใน parameter ใช้ time zone GMT
- schedule_action เป็นการบอกว่าจะให้ทำอะไร stop คือปิด start คือเปิด
- *_schedule จะเป็นการบอกว่าจะใช้ module นี้กับ resource ใดบ้าง เช่น ec2_schedule = true และ autoscaling_schedule = true เป็นการบอกว่าให้ทำงานกับ resource ที่เป็น EC2 instance และเป็น EC2 autoscaling group ที่มี Tag ตามที่กำหนด
- scheduler_tag กำหนด Tag name และ value เช่นในตัวอย่างกำหนดให้ใช้ Key = AutoStop และ value = true
- ถ้ารวมกับ parameter ทั้งหมดที่กำหนดหมายความว่าเราสร้าง schedule ชื่อ ec2-auto-stop เพื่อปิด EC2 instances และ Instances ใน autoscaling group ที่มี Tag AutoStop=true ตามเวลา 00:00 ของทุกๆวัน
data "aws_region" "current" {}
module "stop_ec2_instance" {
source = "diodonfrost/lambda-scheduler-stop-start/aws"
name = "ec2-auto-stop"
cloudwatch_schedule_expression = "cron(0 17 * * ? *)"
schedule_action = "stop"
autoscaling_schedule = "true"
ec2_schedule = "true"
ecs_schedule = "false"
rds_schedule = "false"
redshift_schedule = "false"
cloudwatch_alarm_schedule = "false"
scheduler_tag = {
key = "AutoStop"
value = "true"
}
tags = {
CreatedBy = var.created_by
ManagedBy = "Terraform"
Environment = "Dev"
Project = "CICD"
}
}
สำหรับการเปิด Instances ให้สร้าง schedule จาก Terraform Module นี้อีกตัวชื่อ ec2-auto-start โดยกำหนด schedule_action = start และ cloudwatch_schedule_expression = cron(0 0 * * ? *) คือตั้งให้เปิด Instances ตอน 07:00 ของทุกวัน (0:00 GMT)
module "start_ec2_instance" {
source = "diodonfrost/lambda-scheduler-stop-start/aws"
name = "ec2-auto-start"
cloudwatch_schedule_expression = "cron(0 0 * * ? *)"
schedule_action = "start"
autoscaling_schedule = "true"
ec2_schedule = "true"
ecs_schedule = "false"
rds_schedule = "false"
redshift_schedule = "false"
cloudwatch_alarm_schedule = "false"
scheduler_tag = {
key = "AutoStart"
value = "true"
}
tags = {
CreatedBy = var.created_by
ManagedBy = "Terraform"
Environment = "Dev"
Project = "CICD"
}
}
ใน source code ของ Terraform Module บน GitHub เองก็มีตัวอย่างในการใช้งานดังนี้
- Autoscaling scheduler — สร้าง lambda functions เพื่อ suspends autoscaling group และ CloudWatch alarm ที่มี Tag
tostop = true
ในทุกวันศุกร์ เวลา 23:00 GMT และ เปิด instance ในทุกวันจันทร์ เวลา 07:00 GMT - Autoscaling scheduler & terminate instances — สร้าง lambda functions เพื่อ suspends autoscaling group และ CloudWatch alarm และ terminate instances (ด้วยการกำหนด autoscaling_terminate_instances = true) ที่มี Tag
tostop = true
ในทุกวันศุกร์ เวลา 23:00 GMT และ เปิด instance ในทุกวันจันทร์ เวลา 07:00 GMT - Instance scheduler — สร้าง lambda functions เพื่อ ปิด ec2 instances ที่มี Tag
tostop = true
ในทุกวันศุกร์ เวลา 23:00 GMT และ เปิด instance ในทุกวันจันทร์ เวลา 07:00 GMT - Rds aurora — mariadb scheduler — สร้าง lambda functions เพื่อ ปิด rds mariadb instances และ aurora cluster ที่มี Tag
tostop = true
ในทุกวันศุกร์ เวลา 23:00 GMT และ เปิด instance ในทุกวันจันทร์ เวลา 07:00 GMT
ดู Input Output ทั้งหมดของ Module ได้จาก Terraform registry หรือ GitHub