【AWS】インスタンスID管理はもうやめる。タグを付けるだけでEC2を一括自動停止する(SSM State Manager)
はじめに
前回、EventBridge Schedulerを使って特定のEC2インスタンスを自動停止する方法を紹介しました。👉【AWS】サーバーレスでEC2自動起動・停止!EventBridge × SSM で無駄なコストを抑えよう!
しかし、運用を続けていくと新たな課題が出てきます。
「新しい検証用EC2を作るたびに、Schedulerの設定にインスタンスIDを追加するのが面倒くさい…」
人間なので、IDの追加忘れは必ず起こります。そしてまた課金が発生します。
そこで今回は、「特定のタグが付いているインスタンスは問答無用で停止する」という、より管理が楽な仕組みをSSM State Managerを使って構築します。
今回のアーキテクチャ
AWS Systems Manager (SSM) の機能の一つである State Manager(ステートマネージャー) を使用します。
-
ターゲット: タグキー
AutoStop、値trueが付いている全インスタンス -
ドキュメント:
AWS-StopEC2Instance - スケジュール: 毎日 20:00 (JST)
これにより、今後EC2を作成する際は、タグに AutoStop: true を付与するだけで、自動停止の対象になります。Schedulerの設定変更は一切不要です。
1. IAMロールの準備
State ManagerがEC2を停止するために必要なIAMロールを作成します。
(基本的には前回の記事で作成した Execution Role とほぼ同じ権限でOKですが、信頼関係の対象が少し異なります)
信頼ポリシー (Trust Policy):
SSMがこのロールを使用できるようにします。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ssm.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
許可ポリシー (Permissions):
ec2:StopInstances と ec2:DescribeInstanceStatus を許可します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:StopInstances",
"ec2:DescribeInstanceStatus"
],
"Resource": "*"
}
]
}
※ Resource は * にしています。タグで絞り込むため、特定のIDに縛られないようにします。
2. State Manager (関連付け) の作成
AWSマネジメントコンソールから設定します。
- Systems Manager > ステートマネージャー > 関連付けの作成 をクリック。
-
名前:
Stop-EC2-by-Tagなど分かりやすい名前を入力。 -
ドキュメント:
AWS-StopEC2Instanceを選択。 - パラメータ:
-
InstanceId: (空欄のままでOK) -
AutomationAssumeRole: 作成したIAMロールのARNを入力。
- ターゲット:
- タグを指定 を選択。
-
タグキー:
AutoStop -
タグ値:
true
- スケジュール:
- CRON式 を選択。
-
cron(0 11 * * ? *)(毎日UTC 11:00 = JST 20:00) - ※ JSTで指定したい場合はEventBridgeのCron式とは少し書き方が違うので注意(SSMはUTC基準が基本です)。
3. 動作確認
実際にEC2インスタンスを2台用意して検証します。
-
Instance A: タグ
AutoStop: trueを付与。 - Instance B: タグなし。
指定した時間(または「今すぐ適用」を実行)になると…
- Instance A → 停止 (Stopped)
- Instance B → 稼働中 (Running)
これで、「タグさえ付けておけば勝手に止まる」環境が完成しました!
まとめ
EventBridge Schedulerは「特定の重要リソース」を細かく管理するのに向いていますが、開発環境のような「数が増減しやすいリソース」には、今回のような**タグベースの管理(SSM State Manager)**が便利かなと個人的に思っています。
運用のフェーズや目的に合わせて、これら2つの自動化手法を使い分けていきましょう。
Discussion