Scheduling For Start and Stop AWS EC2 - ตั้งเวลาเปิด/ปิด EC2 เพื่อประหยัดค่าใช้จ่ายกันเถอะ
--
ในการใช้งาน AWS EC2 นั้นมีค่าใช้จ่ายเสมอ นอกจากจะเป็น free tier ตามข้อกำหนดที่ AWS ตั้งไว้ (Instance type เป็น t2.micro เปิดใช้งานไม่เกิน 750 ชั่วโมงต่อเดือน) กรณีที่เราใช้งานแบบไม่ใช่ free tier ก็จะมีการคิดค่าใช้จ่ายแบบ On-demand, spot, RI และ Saving plan
แน่นอนว่าส่วนใหญ่จะใช้แบบ On-demand กันในระบบที่ไม่จำเป็นต้องเปิด 24 ชั่วโมง ยิ่งเปิดใช้นานก็จะมีค่าใช้จ่ายที่สูงขึ้น แต่ถ้าเปิดทิ้งโดยที่ไม่ได้ใช้งานก็จะยิ่งเสียค่าใช้จ่ายไปฟรีๆ วิธีที่ทำให้เราสามารถประหยัดค่าใช้จ่ายขึ้นอีกหนึ่งวิธีก็คือตั้งเวลาเปิดปิดนั่นเอง
การตั้งเวลาเปิดปิดมี AWS Service ที่เกี่ยวข้องด้วยกัน 3Service คือ CloudWatch, Lambda และ IAM มาเริ่มกันเลย
1.Create Lambda and configure permission
ไปที่ service “Lamba” → กดปุ่ม “Create Function”
เลือก Author from scratch → ตั้งชื่อ Function name → Rumtime Python 3.8 (เพราะเราจะใช้ python ในการเขียน script กัน) → Create a new role
Double click ที่ “lambda_function.py”
ใส่ code python ตามนี้ (InstanceId คือ Instance Id ของ EC2 ที่เราจะ start)
import boto3#Define region and start ec2 instance id
region = 'ap-southeast-1'
instances = ['InstanceId']
#create connection
ec2 = boto3.client('ec2', region_name=region)def lambda_handler(event, context):
#Start EC2
ec2.start_instances(InstanceIds=instances)
print('starting your instances: ' + str(instances))
เราสามารถสั่ง Start/Stop ได้หลาย EC2 พร้อมกัน โดยใช้แบบนี้
instances = [‘InstanceId1’,‘InstanceId2’,‘InstanceId3’]
จากนั้นไปเพิ่ม permission ให้กับ role ของ Lambda ที่เราสร้าง โดยไปที่ Tab “Configuration” → “Permissions” → คลิ๊กที่ “Role Name”
เพิ่ม permission โดยกดที่ปุ่ม “Edit Policy” และเพิ่ม start, stop EC2 permission
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "logs:CreateLogGroup",
"Resource": "arn:aws:logs:ap-southeast-1:AWSACCOUNTID:*"
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": [
"arn:aws:logs:ap-southeast-1:AWSACCOUNTID:log-group:/aws/lambda/startEC2:*"
]
},
{
"Effect": "Allow",
"Action": [
"ec2:StartInstances",
"ec2:StopInstances"
],
"Resource": "*"
}
]
}
2. Create CloudWatch Event Rule
ไปที่ Service “CloudWatch” → Events → Rules → กดปุ่ม “Create Rule”
ตั้งค่าให้ cron ทำงานตามเวลาที่ต้องการ เช่น ต้องการเปิดทุก 8 โมงเช้า วันจันทร์ ถึง วันศุกร์ ดังรูป (อย่าลืมลบชั่วโมงด้วย 7 เพื่อแปลงเป็นเวลา UTC/GMT)
กดปุ่ม “Add Target” ด้านขวามือ → เลือก Target เป็น Lamdba function ที่เราสร้างขึ้นมา → กดปุ่ม “Configure details”
ตั้งชื่อ Rule ของเรา → กดปุ่ม “Create rule”
Event Rule หรือ Schedule ตั้งเวลาของเราก็จะถูกสร้างขึ้นมา
หลังจากนั้นพอถึงเวลาที่เราตั้งไว้ ตัว CloudWatch Event Rule อันนี้ ก็จะไปสั่งให้ Lambda ที่เราสร้างไว้นั้นทำงาน เพื่อที่จะ start EC2 ของเราที่เรากำหนดไว้ใน code ขึ้นมานั่นเอง
แล้วถ้าจะตั้งเวลา Stop ล่ะ จะทำยังไง คำตอบก็คือทำด้วยขั้นตอนเดียวกันแต่เปลี่ยน code ที่เราจะให้ทำงานเป็นดังนี้
import boto3#Define region and start ec2 instance id
region = 'ap-southeast-1'
instances = ['InstanceId']
#create connection
ec2 = boto3.client('ec2', region_name=region)def lambda_handler(event, context):
#Stop EC2
ec2.stop_instances(InstanceIds=instances)
print('stopping your instances: ' + str(instances))
เท่านี้เราก็จะประหยัดค่าใช้จ่ายจากการเปิดเครื่องทิ้งไว้ อีกทั้งยังช่วยให้งาน operation ที่เราต้องมาทำให้มีความเป็น Automation มากขึ้น ไม่ต้องมานั่ง start/stop ทุกวัน หรือวันนึงเกิดลืมเปิดปิดขึ้นมา ก็จะช่วยประหยัดค่าใช้จ่ายที่เราต้องเสียไปฟรีๆ อีกด้วย
นอกจากตั้งเวลาเปิดปิด EC2 แล้ว ยังมีวิธีเปิดปิด Service อื่นๆ และทำงานหลายๆ อย่างให้เป็น Automation มากขึ้นอีกนะ เดี๋ยวว่างๆ จะมานั่งเขียนให้อ่านกันอีก ฝากติดตามกันด้วยนะครับผม :)