はじめに
EC2をスケジュールに合わせて自動起動・停止させてみました。また、著者はコードを記述できないため、できるだけ簡単な方法で実装しました。
使うサービス
・EC2:起動・停止対象となる仮想サーバです。
・Systems Manager(以下、SSM):AWSが用意したEC2の起動・停止コマンドを実行します。
・EventBridge:スケジュールに合わせてSystems Managerを起動させます。
手順
(1) EC2インスタンスの準備
セキュリティグループではインバウンドルールでSSH、HTTPSを許可します。
(2) VPCエンドポイントの作成
SSMとの通信のため、以下のエンドポイントを作成します。
ネットワーク設定では、EC2インスタンスを設置したVPC、セキュリティグループを選択します。
・com.amazonaws.ap-northeast-1.ssm
・com.amazonaws.ap-northeast-1.ec2messages
・com.amazonaws.ap-northeast-1.ssmmessages
(3) EC2にアタッチするIAM ロールの作成
ロールの信頼ポリシーに以下を設定します。
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
(4) EC2にIAMロールをアタッチ
EC2から、アクション→セキュリティ→IAMロールを変更
作成したIAMロールを選択し、IAMロールをアタッチします。
(5) EventBridgeからSSMを呼び出すIAM ロールの作成
ロールの信頼ポリシーに以下を設定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "events.amazonaws.com" },
"Action": "sts:AssumeRole"
}
]
}
SSM実行のみを許可する以下のIAMポリシーをアタッチします。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ssm:StartAutomationExecution",
"Resource": [
"arn:aws:ssm:ap-northeast-1::document/AWS-StartEC2Instance",
"arn:aws:ssm:ap-northeast-1::document/AWS-StopEC2Instance"
]
},
{
"Effect": "Allow",
"Action": [
"ec2:StartInstances",
"ec2:StopInstances" ,
"ec2:DescribeInstanceStatus",
"ec2:DescribeInstances"
],
"Resource": "arn:aws:ec2:ap-northeast-1:<account-id>:instance/<対象のインスタンスID>"
}
]
}
(6) EventBridgeルール作成
月曜日から金曜日の9時に起動処理が実行されるようなルールを作成します。
起動用ルール:start-ec2-daily
スケジュールタイプ:スケジュール
cron 式:cron(0 0 ? * MON-FRI *)
ターゲットタイプ:SSM Automation
ドキュメント名:AWS-StartEC2Instance
InstanceId: 対象インスタンスIDを入力
月曜日から金曜日の18時に停止処理が実行されるようなルールを作成します。
停止用ルール:stop-ec2-daily
スケジュールタイプ:スケジュール
cron 式:croncron(0 9 ? * MON-FRI *)
ターゲットタイプ:SSM Automation
ドキュメント名:AWS-StopEC2Instance
InstanceId: 対象インスタンスIDを入力
(7) 設定最終確認
正しく設定が行われているか、以下を確認します。
1 SSMのノードツールから、EC2インスタンスが認識されていること。
※EC2作成後、IAMロールをあとからアタッチした場合、SSM Agentが再認証されないことがあります。その場合はEC2に接続し、以下のコマンドを実行してください。
sudo systemctl restart amazon-ssm-agent
または EC2 インスタンス自体を再起動してみてください。
それでも認識されない場合は以下を確認します。
①EC2インスタンスにアタッチしたIAMロールが正しいこと
②作成したVPCエンドポイントの設定が正しいこと
SSM Agentが別リージョンのSSMエンドポイントに誤って接続しているケースがあります。
(8) 自動起動・停止の実装確認
テスト用のEventBridgeルールを作成し、起動中のEC2インスタンスが停止することを確認します。
最速で実行されるように1分毎に停止処理が実行されるルールを作成しました。
しばらくするとEC2インスタンスの状態が停止済みとなっていることが確認できます。
まとめ
ノーコードでEC2インスタンスの自動起動・停止機能を実装できました。