🐤

【AWS EC2】インスタンス起動時間を制限してコストを節約する【LambdaとEventBridge】

に公開

1日の内決まった時間にしか利用しないインスタンスを
自動で指定した時間に起動・停止を行うイベントスケジュールを作成したい

流れ

ステップ1: IAM ポリシー作成
ステップ2: IAM ロール作成
ステップ3: Lambda関数を作成
ステップ4: EventBridgeルール作成

ステップ1: IAM ポリシー作成

①IAMコンソールにアクセス
②ポリシー:ポリシーの作成
ポリシーエディタ:JSONを選択
以下のコードを記述する

  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:StartInstances",
        "ec2:StopInstances"
      ],
      "Resource": "arn:aws:ec2:*:*:instance/*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    }
  ]
}

⑤次へ
ポリシー名(LambdaEC2ControlPolicy)・説明を適当に記入
⑦ポリシーの作成

ステップ2: IAMロール作成

①IAMコンソールにアクセス
②ロールの作成
信頼されたエンティティタイプ:AWSサービス
ユースケース:Lambdaを選択
③許可ポリシー
さっき作ったポリシー(LambdaEC2ControlPolicy)を選択
④ロール名:(LambdaEC2ControlRole)(任意)を設定
⑤ロールを作成

ステップ3: Lambda関数を作成

①サービスメニュー → Lambda を選択します。
②関数の作成 をクリックします。
関数名:EC2Scheduler(任意)
ランタイム:Python 3.9(または最新のPythonバージョン)
デフォルトの実行ロールの変更:既存のロールを使用 を選択
LambdaEC2ControlRole を選択
コードソースにコードを記入

import boto3
import os

REGION = "ap-northeast-1"  # 東京リージョン
INSTANCE_ID = os.getenv("INSTANCE_ID")  # 環境変数からインスタンスIDを取得

def lambda_handler(event, context):
    ec2 = boto3.client("ec2", region_name=REGION)
    action = event.get("action")

    try:
        if action == "start":
            ec2.start_instances(InstanceIds=[INSTANCE_ID])
            print(f"Started instance: {INSTANCE_ID}")
            return {"status": "started"}
        elif action == "stop":
            ec2.stop_instances(InstanceIds=[INSTANCE_ID])
            print(f"Stopped instance: {INSTANCE_ID}")
            return {"status": "stopped"}
        else:
            print("Invalid action specified")
            return {"status": "invalid action"}
    except Exception as e:
        print(f"Error: {str(e)}")
        return {"status": "error", "message": str(e)}

エディタ内のenvironmental variables(環境変数)を開く
キー:INSTANCE_ID
値:i-xxxxxxxxxxxxxx(起動・停止させたいEC2インスタンスID)

Deployを押してデプロイ

ステップ4: EventBridgeルール作成

①Amazon EventBridge スケジュールを選択
②スケジュールの作成

自動起動スケジュール
スケジュール名:EC2AutoStartRule
スケジュールのパターン
頻度:定期的なスケジュール
タイムゾーン:Asia/Tokyo
cron 式: 0 12 * * ? * (12:00に実行する場合) と記載
全部記入すると

実行予定時間が出るので確認する

フレックスタイムウィンドウ:オフ

③次へ
ターゲット選択:AWS LAbmda
Lambda 関数:EC2Schedulerを選択
コードを記入(自動起動)

{
  "action": "start"
}

④アクセス許可
実行ロール:このスケジュールの新しいロールを作成

⑤次へ
⑥スケジュール作成

自動起動スケジュール
スケジュール名:EC2AutoStartRule
スケジュールのパターン
頻度:定期的なスケジュール
タイムゾーン:Asia/Tokyo
cron 式: 0 21 * * ? * (21:00に実行する場合) と記載

フレックスタイムウィンドウ:オフ

③次へ
ターゲット選択:AWS LAbmda
Lambda 関数:EC2Schedulerを選択
コードを記入(自動停止)

{
  "action": "stop"
}

④アクセス許可
実行ロール:既存のロールを選択⇒自動起動で作ったロールを選択
⑤次へ
⑥スケジュール作成

おわり!

Discussion