今回のゴール
コスト削減の目的で、夜間使用しない時間帯にEC2を自動で停止・開始したい事があります。
今回はLambdaで実装するのではなく、SSM Automationを使用してEC2インスタンスの開始と停止をスケジューリングしたいと思います。
EC2インスタンス停止の設定
EventBridgeサービスの[イベント]-[ルール]より「ルールの作成」ボタンをクリックします。
【ルールを作成】
[名前]:ec2-stop(任意)
[イベントパターン]:スケジュール、Cron式を選択
[Cron式]:0 14 * * ? * を入力(毎日23時)
[ターゲット]:EC2 StopInstances API 呼び出し
[インスタンスID]:該当のEC2インスタンスを入力
EC2インスタンス開始の設定
EC2インスタンスの開始にはSystemManagerのAutomationを使用しますので、先にIAMロールを作成します。
IAMロールの作成
IAMサービスのロールのロールの作成で、[EC2]を選択します。
AmazonSSMAutomationRoleのポリシーをアタッチします。
[ロール名]:SSMAutomationRole(任意)
作成されたロールを選択して、「信頼関係の編集」をクリックします。
Principalに”ssm.amazonaws.com”を追加して下記のようにします。
Service部は配列になるので、[]で囲みます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"ssm.amazonaws.com",
"ec2.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
これでロールの作成は完了です。
後で使用するのでロールのARNコピーしておきます。
補足
CMKで暗号化されたEBSをもつEC2インスタンスの場合は、kms:CreateGrantのポリシーを付与します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"kms:CreateGrant"
],
"Resource": "KMSのCMKのARN"
}
]
}
ルールの作成
EC2停止と同じくEventBridgeサービス よりルールを作成します。
[名前]:ec2-start(任意)
[イベントパターン]:スケジュール、Cron式を選択
[Cron式]:0 22 * * ? * を入力(毎日7時)
[ターゲット]:SSM Automation
[ドキュメント]:AWS-StartEC2Instance
[InstanceId]:対象のEC2インスタンスID
[AutomationAssumeRole]: SSMAutomationRole (先ほど作成したロールのARN)
確認
指定された時間にEC2インスタンスが停止・開始されることを確認しました。
EventBridgeではCloudTrailの”StartAutomationExecution” APIが実行されますので、実行結果はCloudTrailで確認できます。
意図したように動作しない場合はCloudTrailで確認すればよいかと思います。