Lambdaで夜間にec2インスタンスを止める

今回行う内容

Lambdaではトリガーを設定して処理を実行させることが出来ます。

この記事では20時に所望のec2インスタンスを停止させるという目的のもと、Lambdaの使い方を説明して行きます。

Lambdaの新規作成

今回はec2のstart,stopの権限を追加しなければならないので、カスタムロールを作成します。

新規Lambdaの作成から、以下のようにカスタムロールの作成を選択してください(名前は適当に決めてください。ランタイムはPython3.6にします)。 新しいIAMロールの作成を選び、ロール名を適当に設定します。ポリシードキュメントを表示、編集から以下のように書き換えます。

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

許可するとLambda作成画面で勝手に既存のロールとして選択されますので、このまま関数の作成を押します。これで関数の画面に飛びます。

ec2インスタンスを停止させるスクリプトを書く

さて、ec2にアクセス権を持つLambdaを作成できたので、具体的にインスタンスを停止させるスクリプトをPythonで書いていきます。 AWS用のboto3というライブラリを使います。また、以下対象のインスタンスID(i-*****************)をmy_idと書きます。

関数コードのlambda_function.pyを編集していきます。

一番シンプルに書くと以下のようになります。コピペしてください。

import boto3
import os

def lambda_handler(event, context):
    instance_id = ['my_id']
    ec2 = boto3.client("ec2")
    ec2.start_instances(InstanceIds=instance_id)
    return 'Hello from Lambda'

コピペできたら、右上の保存ボタンで内容を保存し、テストを選択してテストしましょう。以下のように表示されたら成功です。選択したインスタンスが起動していることを確認しましょう。

トリガーを設定し、目的を達成する

中身はできたので、これを実行するタイミングを決めて目的を達成しましょう。20時にこのスクリプトを起動するためにCloudWatch Eventを使用します。

サービス→管理ツール→CloudWatchに入り、左のイベント→ルールの作成を選択します。

今回はcron式によって指定します。詳しくは公式ドキュメントから確認してください。

cron式とターゲット(作成したLambda関数)を選択します。今回のcron式はcron(0 18 * * ? *)です。

詳細に飛び、適当に説明を追加した後ルールの作成をします。 これで完成です。

8:00にインスタンスを起動させたいなら、同じようにまずLambda関数を作り、CloudWatchでイベントを設定してあげれば大丈夫です。