【AWS】 Lambda関数でEC2インスタンスの起動・停止を行う

EC2インスタンスの起動および、停止をLambdaとEventBridgeを使用して決まった日時に行う方法をメモします。

基本的に以下AWS公式ドキュメントのQAページに記載の方法を参考にしています。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/start-stop-lambda-eventbridge/

1. 対象とするEC2インスタンスのidを控えておく
EC2の詳細画面から確認して「インスタンス ID」をコピー

2. IAMポリシーを作成する
上記、QAページ記載の通り、JSONをエディターに貼り付けて新規作成すればOK

{
  "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": "*"
    }
  ]
}

3. 2で作成したポリシーをLambda関数に付与するIAMロールにアタッチする (ロールがなければ作成)

4. Lambda関数を作成
ランタイムはPython3.9, 関数のソースコードもドキュメントのものをコピペでOK

関数はインスタンス起動用と停止用でそれぞれひとつずつ作成する

ソース内、インスタンスのリージョン名を利用中のリージョンに変更するのと、インスタンスid部分を1であらかじめ控えておいたものへ差し替える

(停止用)

import boto3
region = 'ap-northeast-1'
instances = ['i-xxxxxxxxxx']
ec2 = boto3.client('ec2', region_name=region)

def lambda_handler(event, context):
    ec2.stop_instances(InstanceIds=instances)
    print('stopped your instances: ' + str(instances))

(起動用)

import boto3
region = 'ap-northeast-1'
instances = ['i-xxxxxxxxxx']
ec2 = boto3.client('ec2', region_name=region)

def lambda_handler(event, context):
    ec2.start_instances(InstanceIds=instances)
    print('started your instances: ' + str(instances))

それぞれの関数に先ほどの3のIAMロールをアタッチする

関数の「基本設定を編集」より該当のIAMロールを選択する

関数をデプロイ済みにし、テストを実行する

テストにより、対象のインスタンスの起動または停止が行えていることを確認する

5. EventBridgeのルールを作成

Lambda関数を決まった日時に定期実行するために、EventBridgeのルールを作成する

Lambda関数同様、EventBridgeのルールも起動用、停止用にそれぞれひとつずつ作成する

各ルールごとにイベントスケジュールで日時を設定する
(インスタンスを起動させておきたい時間の前後で起動、停止の時刻を設定する)

各ルールのターゲット、編集 よりそれぞれ起動用、停止用のLambda関数を紐づける

Follow me!