EC2をEventBrdgeとLambdaを使って自動で開始と停止してみた

に公開

やったこと

EC2をEventBridgeとLambdaで自動開始・停止をしました。
今回はマネジメントコンソールで作成し、EventBridgeのスケジュール機能を使いました。

目的

リソースを無駄に使わないため

対象読者

  • EC2を自動で開始と停止したい方
  • EventBridgeを使ってLambdaの動作に興味がある方

検証環境

  • EC2 Amazon Linux 2023
  • リージョン: ap-northeast-1(東京)
  • Lambda: Python 3.13(最新)

事前準備

自動化したいEC2のインスタンスIDを確認します。

手順

1. Lambda関数用のコードを作成

以下のコードの中のインスタンスIDを自分のものに変えます。

# EC2停止用コード
import boto3

def lambda_handler(event, context):
    """
    あらかじめ指定されたIDのEC2インスタンスを停止します。
    """
    # --- 設定 ---
    # 【重要】ここに停止したいインスタンスのIDを入力してください。
    # 例: ['i-0123456789abcdef0', 'i-abcdef01234567890']
    INSTANCE_IDS_TO_STOP = [
        'i-xxxxxxxxxxxxxxxxx',  # 1台目のインスタンスID
        'i-yyyyyyyyyyyyyyyyy'   # 2台目のインスタンスID (複数ある場合)
    ]
    
    # リージョンを指定します。
    REGION = 'ap-northeast-1'

    # EC2を操作するための準備
    ec2 = boto3.client('ec2', region_name=REGION)

    # 停止処理の実行
    try:
        print(f"以下のインスタンスを停止します: {', '.join(INSTANCE_IDS_TO_STOP)}")
        ec2.stop_instances(InstanceIds=INSTANCE_IDS_TO_STOP)
        print("インスタンスの停止リクエストを送信しました。")

    except Exception as e:
        # エラーが発生した場合
        print(f"エラーが発生しました: {e}")
# EC2開始用コード
import boto3

def lambda_handler(event, context):
    """
    あらかじめ指定されたIDのEC2インスタンスを開始します。
    """
    # --- 設定 ---
    # 【重要】ここに開始したいインスタンスのIDを入力してください。
    # 例: ['i-0123456789abcdef0', 'i-abcdef01234567890']
    INSTANCE_IDS_TO_START = [
        'i-xxxxxxxxxxxxxxxxx',  # 1台目のインスタンスID
        'i-yyyyyyyyyyyyyyyyy'   # 2台目のインスタンスID (複数ある場合)
    ]
    
    # リージョンを指定します。
    REGION = 'ap-northeast-1'

    # EC2を操作するための準備
    ec2 = boto3.client('ec2', region_name=REGION)

    # 開始処理の実行
    try:
        print(f"以下のインスタンスを開始します: {', '.join(INSTANCE_IDS_TO_START)}")
        ec2.start_instances(InstanceIds=INSTANCE_IDS_TO_START)
        print("インスタンスの開始リクエストを送信しました。")

    except Exception as e:
        # エラーが発生した場合
        print(f"エラーが発生しました: {e}")

2. インスタンス開始用のLambda関数を作成

Lambdaのページに移動して関数の作成をクリックします。

一から作成を選択し関数名を入力しランタイムをPythonは3.13(最新)にします。そして関数の作成をクリックします。

3. できたロールにポリシーを作成して追加

出来た関数に移動して設定のアクセス権限の中にある青く書かれているロール名をクリックして移動します。

許可の中の許可を追加をクリックしてインラインポリシーを作成をクリックします。

ポリシーエディタはJSONを選択しサービスにEC2と入力してその下の青いEC2をクリックします。

そしたら入力欄にstartと入力してStartInstancesを選択、下のリソースを追加をクリックします。

また、停止の場合はstopと入力してStopInstancesを選択します。

サービスはEC2リソースタイプはInstance あなたのEC2のREGION、ACCOUNTIDとあなたのInstancesIdに置き換えます。


arn:aws:ec2:ap-northeast-1:111122223333:instance/i-09a464415c4760009

入力できたら次へをクリックします。


名前を入力してポリシーを作成します。

LambdaのCODEにいきDeploy、Testをクリックします。その後、Testを押すとCreate new test event と出るので名前を入力して、保存してもう一度Testを実行します。

ちゃんとインスタンスが開始することを確認します。

4. インスタンス開始用EventBridgeを作成

EventBridgeスケジュールを選択してスケジュールを作成します。

スケジュール名を入力し定期的なスケジュールを選択します。タイムゾーンはTokyo
スケジュールの種類はcronベースのスケジュールです。

cron式の書き方
特殊なのは曜日です

1=日曜日
2=月曜日
3=火曜日
4=水曜日
5=木曜日
6=金曜日
7=土曜日

また日付を指定する場合は曜日を?にします。
逆に、曜日を指定する場合は日付を?にします。
*はいつでもいいという意味です。

順番は

分 時間 日 月 曜日 年

となります。

例えば、以下の場合

0 0 ? * 1 *

0:00の毎週日曜日に実行ということになります。

もし曜日を複数にしたい場合はカンマで追加することができます。

1,2=日曜日と月曜日


フレックスタイムウィンドウはオフです。
そしたら次へをクリックします。

ターゲットの選択でテンプレート化されたターゲットを選択しLambdaを選択します。

Lambdaの関数はさきほど作ったやつを選択します。
あとは特に変更せずに次へをクリックします。
下にスクロールしてスケジュールの作成をクリックします。


インスタンス開始用のLambdaとEventBridgeは完成です。終了用も同じように作成します。

感想・学び

無駄にリソースを使う必要がなくなり、よりクラウド環境の利点を享受できます。

Discussion