我們有時候不想要讓Elastic Compute Cloud (Amazon EC2)的執行個體每個月都開720小時(24小時x30天),而是想要定時開關機來節省經費(例如:只想平日朝九晚五開啟執行個體),那要如何做? 我們可以使用Lambda和CloudWatch Events來達成定時開關機的任務。
雖然目前AWS已經有提供Instance Scheduler這個強大的排程服務,但是如果單純只想要定時開關機的話,使用Lambda和CloudWatch Events就好。
操作步驟
- 建立給Lambda的IAM角色(Role)和政策(Policy)
- 分別建立開機與關機的Lambda Function
- 分別建立開機與關機的可自動排成的CloudWatch Events
解決方案
Step1. 建立一個Lambda的IAM Policy
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Effect": "Allow",
"Action": [
"ec2:Start*",
"ec2:Stop*"
],
"Resource": "*"
}
]
}

Step2. 建立一個Lambda的IAM Role
Step3. 分別建立開機/關機的Lambda Function
# =================================================================================
# == 將 YOUR_EC2_INSTANCE_REGION 修改成 "自己實行個體的區域(Region)" ==
# == 將 YOUR_EC2_INSTANCE_ID 修改成 "自己實行個體的ID(Instance ID)" (可新增多台) ==
# =================================================================================
# 開機(Start)的Lambda Function Code
import boto3
region = 'YOUR_EC2_INSTANCE_REGION(eg.us-east-1)'
instances = ['YOUR_EC2_INSTANCE_ID(eg.i-12345cb6de4f78g9h)']
ec2 = boto3.client('ec2', region_name=region)
def lambda_handler(event, context):
ec2.start_instances(InstanceIds=instances)
print('started your instances: ' + str(instances))
# ----------------------------------------------------------
# 關機(Stop)的Lambda Function Code
import boto3
region = 'YOUR_EC2_INSTANCE_REGION(eg.us-east-1)'
instances = ['YOUR_EC2_INSTANCE_ID(eg.i-12345cb6de4f78g9h)']
ec2 = boto3.client('ec2', region_name=region)
def lambda_handler(event, context):
ec2.stop_instances(InstanceIds=instances)
print('stopped your instances: ' + str(instances))

Step4. 分別建立開機/關機的CloudWatch Event
Cron表達式說明:
- 以 分/時/每月-天/月/每月-周/年 排序
- 代表所有值
- 每月-天 為每個月的第X天 / 每月-周 為每個月的星期X
- 在 每月-天 與 每月-周 不得同時使用,另一 個必須為 ?
- 時間為 中原標準時間(GMT)
- 如果設定每天 台灣時間早上9點 開機, 台灣時間下午5點 關機
- 開機(start)Cron表達式 => 0 1 ? * MON-FRI *
- 關機(stop)Cron表達式 => 0 9 ? * MON-FRI *
- 如果設定每天 台灣時間早上9點 開機, 台灣時間下午5點 關機
- Cron設定完成後,下方會顯示接下來10個觸發的日期

Tags
AWScomments powered by Disqus