Loading...

我們有時候不想要讓Elastic Compute Cloud (Amazon EC2)的執行個體每個月都開720小時(24小時x30天),而是想要定時開關機來節省經費(例如:只想平日朝九晚五開啟執行個體),那要如何做? 我們可以使用LambdaCloudWatch Events來達成定時開關機的任務。

雖然目前AWS已經有提供Instance Scheduler這個強大的排程服務,但是如果單純只想要定時開關機的話,使用Lambda和CloudWatch Events就好。

操作步驟

  1. 建立給Lambda的IAM角色(Role)和政策(Policy)
  2. 分別建立開機與關機的Lambda Function
  3. 分別建立開機與關機的可自動排成的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 *
  • Cron設定完成後,下方會顯示接下來10個觸發的日期







Tags

AWS

comments powered by Disqus