JT's Blog

Do the right things and do the things right.

Start and Stop EC2 Instances at Regular Intervals Using Lambda

| Comments

動機

在 AWS 運行 EC2 是以時計費的,但 staging 環境,下班後就沒在使用,能否關機 (省錢)

Survey AWS 有提供兩種方案

  1. 使用 AWS lambda 定時開啟、關閉 EC2 instances
  2. EC2 Spot instances (EC2 競價型執行個體)

原本就想玩 lambda,私心先挑方案一,之後再實驗方案二

Lambda New Function

start, stop 設定流程是一樣的,下面只介紹 stop

start 再重複一次流程,把 stop 地方改成 start

Blueprint

先到 AWS Lambda console,選擇 blank function

lambda console

Triggers

選用 CloudWatch Events,trigger rule 之後再設定

triggers

Lambda function

輸入 function name、Runtime 選擇 Python2.7

function

function code 調整如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import boto3

# Enter the region your instances are in, e.g. 'us-east-1'

region = 'XX-XXXXX-X'

# Enter your instances here: ex. ['X-XXXXXXXX', 'X-XXXXXXXX']

instances = ['X-XXXXXXXX']

def lambda_handler(event, context):

    ec2 = boto3.client('ec2', region_name=region)

    ec2.stop_instances(InstanceIds=instances)

    print 'stopped your instances: ' + str(instances)

Role

只要設定一次 start, stop 共用

在 role 的下拉選單,選擇 Create a custom role

role

Policy Document 調整如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
  "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": "*"
    }
  ]
}

Test

設定完畢,要測試設定是否成功

前往 Lambda console -> Functions

點選 Test 按鈕,會跳出輸入參數視窗,因為此 function 不需要接收參數,可以不用理會直接執行測試

請小心,測試時真的執行(哭),如果要測試,就選擇目前狀態做測試,例如:running instance 就測 start instance

CloudWatch

前往 CloudWatch console -> Events -> Create rule

左邊區塊設定 Event Pattern or Schedule(Cron Expression)

選擇 Schedule,使用 Cron expression 設定執行週期

1
2
# 週一到週五 早上九點start instances
0 1 ? * MON-FRI *

* EC2 以時計費(eg.跑一分鐘也收一小時的錢),建議整點開、關

* 使用 UTC 時間,時間要「減8hr」

* 不要怕 cron expressions,AWS 會根據 expression 貼心的產生結果給你 review

右邊設定 target,選擇 Lambda Function,指定要執行哪個 function

CloudWatch events rule

最後在設 rule name 就完成了!!

試算

目前狀況

  • EC2 Instance:t2.micro
  • EBS:2 GB EBS(SSD)

每月花費: $ 0.016 * 24 * 30 + $ 0.12 * 2 = $ 11.76

導入 CloudWatch Events + Lambda

  • CloudWatch Events:每月前一百萬次免費
  • Lambda:每月前一百萬次免費
  • EC2 Instance:t2.micro
  • EBS::2 GB EBS(SSD)

每月花費: $ 0.016 * 12 * 20 + $ 0.12 * 2 = $ 4.08

費用少了三分之一,有達到目的,但不知還有沒有其他費用產生,會在持續追蹤

另外 spot instances 也是不錯的選擇,再找機會測試

Reference

Comments