AWS EC2インスタンスの自動起動と自動停止

EC2インスタンスを毎回手動で起動させたり停止させたりするのが面倒である点と、停止し忘れ防止の為に、
AWS LambdaとCloudWatchを使ってEC2インスタンス自動起動と自動停止を試みた。


当方の環境は以下のとおり。
EC2インスタンス: 1台。t2.micro (amzn2-ami-hvm-2.0.20180622.1-x86_64-gp2)
S3バケット: 1台。
リージョン: ap-northeast-1a

IAMロールは予め作成しておく。
作成したIAMロールにはポリシーAWSLambdaExecuteをアタッチする。
自分の環境ではIAMロールのポリシー名はEC2_auto_on_offとした。


1.Lambdaの自動停止用関数の作成

1-1.Lambdaに入り、「今すぐ始める」ウインドウ内の「関数の作成」をクリック。

1-2.関数の作成ウインドウ内にて「一から作成」を選択、
「名前」欄に任意の文字列を入力。自分の場合はEC2_instance_auto_offとした。
「ランタイム」欄は、自分の場合は「Python 3.6」を選択。
「ロール」は既存のロールを選択。
「既存のロール」は予め作成していたEC2_auto_on_offを選択。
最後に「関数の作成」をクリック。

1-3.ec2_instance_auto_on_offに移る。
自分の環境ではec2_instance_auto_on_offだが、上記2の名前欄にて入力した文字列が画面左上に表示される。
画面上半分の「Designer」欄はそのまま。
画面下半分の「関数コード」内のエディタにて、元々有る2〜3行のスクリプトを消して、以下を入力する。
下記2行目のX-XXXXXXXXXは対象となるインスタンスIDを入力する。

import boto3
instances = ['X-XXXXXXXXX']
def lambda_handler(event, context):
    ec2 = boto3.client("ec2")
    ec2.stop_instances(InstanceIds=instances)

入力が完了したら、ウインドウ内右上の「保存」ボタンをクリックする。


2.Lambdaの自動起動用関数の作成

2-1.Lambdaのトップ画面に入り「関数の作成」をクリック。

2-2.関数の作成ウインドウ内にて「一から作成」を選択、
「名前」欄に任意の文字列を入力。自分の場合はEC2_instance_auto_onとした。
「ランタイム」欄は、自分の場合は「Python 3.6」を選択。
「ロール」は既存のロールを選択。
「既存のロール」は予め作成していたEC2_auto_on_offを選択。
最後に「関数の作成」をクリック。

2-3.ec2_instance_auto_on_offに移る。
自分の環境ではec2_instance_auto_on_offだが、上記2の名前欄にて入力した文字列が画面左上に表示される。
画面上半分の「Designer」欄はそのまま。
画面下半分の「関数コード」内のエディタにて、元々有る2〜3行のスクリプトを消して、以下を入力する。
下記2行目のX-XXXXXXXXXは対象となるインスタンスIDを入力する。

import boto3
instances = ['X-XXXXXXXXX']
def lambda_handler(event, context):
    ec2 = boto3.client("ec2")
    ec2.start_instances(InstanceIds=instances)

入力が完了したら、ウインドウ内右上の「保存」ボタンをクリックする。


3.CloudWatch Eventsの自動停止用の設定

3-1.CloudWatchのトップ画面に入り、画面左側の「イベント」をクリック。

3-2.「ルールの作成」をクリック。

3-3.「ステップ1: ルールの作成」ウインドウの「イベントソース」では「スケジュール」を選択。

3-4.続いて「Cron式」を選択。cronの文字列は以下の内容にした。

55 16 * * ? *

毎日16:55(日本時間01:55)に実行される事を表す。

3-5.画面右側の「ターゲット」では上記1.にて作成したLambdaの自動停止用関数を選択し、「詳細の設定」をクリック。

3-6.「ステップ2: ルールの詳細を設定する」ウインドウの「名前」欄は任意の文字列を入力し、「ルールの作成」をクリック。
自分の場合はCW_EC2_OFFとした。


4.CloudWatch Eventsの自動起動用の設定

4-1.CloudWatchのトップ画面に入り、画面左側の「イベント」をクリック。

4-2.「ルールの作成」をクリック。

4-3.「ステップ1: ルールの作成」ウインドウの「イベントソース」では「スケジュール」を選択。

4-4.続いて「Cron式」を選択。cronの文字列は以下の内容にした。

0 13 * * ? *

毎日13:00(日本時間22:00)に実行される事を表す。

4-5.画面右側の「ターゲット」では上記1.にて作成したLambdaの自動起動用関数を選択し、「詳細の設定」をクリック。

4-6.「ステップ2: ルールの詳細を設定する」ウインドウの「名前」欄は任意の文字列を入力し、「ルールの作成」をクリック。
自分の場合はCW_EC2_ONとした。


5.EC2インスタンス自動起動と自動停止実行の確認。

EC2インスタンスインスタンス管理画面にて、対象のインスタンスが設定どおりの時間で起動・停止した事を目視確認した。