【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