1. はじめに
テスト環境の場合、コスト削減の観点で、決まった時間に起動、停止したいケースは多いと思います。
よくある方法として、インスタンスIDを指定する方式がありますが、対象のインスタンスが変動する場合は、メンテナンスが面倒になります。
ベターな方法として、タグの編集で制御する方法が考えられます。
本記事では、定期的なEC2の起動/停止を特定タグで管理して実現する方法を纏めました。
2. 実現したいこと(要件)
- 稼働時間帯:月-金の9時-20時
- 停止要件
- 時間帯:月-金の20時に対象インスタンスを停止する
- 対象インスタンス:下記のタグが設定されていること
- Key:EC2AutoStop
- Value:true
- 起動要件
- 時間帯:月-金の9時に対象インスタンスを起動する
- 対象インスタンス:下記のタグが設定されていること
- Key:EC2AutoStart
- Value:true
3. 構成図
実行の流れ
- ①Amazon EventBridgeにより、設定した時刻にSSMのDocumentsを呼出す
- ②SSMのDocumentが、条件が一致するタグを検索し、該当のEC2インスタンスを停止
※起動要件は停止と同じになる為、記載省略
4. 実装の流れ
- 事前準備
- テスト用EC2準備
- IAM
- ポリシー作成:タグ情報取得用
- ロール作成:SSM操作実行用
- SSM
- デザイン編集:StartAutomationExecutionを流用
- コード編集:タグ指定版にカスタマイズ
- EventBridge
- スケジュール設定
- ターゲット選択:SSMのドキュメント指定
5. 事前準備(テスト用EC2準備)
① EC2を2台用意する
停止/起動対象として処理されるもの、されないものをテストしたい為
② タグを設定する。
EC2AutoStart、EC2AutoStopをそれぞれ設定
6. IAM
下記記事を参考に「ポリシー」「ロール」を作成してください。
https://www.k-friendly.com/16551
①読替え1:作成対象
起動・停止それぞれで作成する必要はありません。兼用可
②読替え2:信頼ポリシーを編集
編集前: “Service”: “ec2.amazonaws.com”
編集後: “Service”: “scheduler.amazonaws.com”
※このIAMロールは、EventBridgeSchedulerが実行する為、上記サービス名になります
7. SSM
7.1 デザイン編集:StartAutomationExecutionを流用
①AWS Systems Managerに移動する
②左メニューから、「ドキュメント」をクリックする。
7.2 コード編集:タグ指定版にカスタマイズ
②カスタマイズ
schemaVersion: '0.3'
description: '*このデフォルトのテキストをランブックに関する指示や他の情報に置き換えてください。* --- # Markdown とは何ですか? Markdown とは、プレーンテキスト形式のコンテンツを、構造的に有効なリッチテキストに変換する軽量のマークアップ言語です。## 見出しを追加できます *斜体*を追加したり、フォントを**太字**にしたりできます。1. 番号付きリストを作成する * 箇条書きを追加する > `コードサンプル`にインデントを設定する [別のウェブページへのリンク](https://aws.amazon.com) を作成できます。'
mainSteps:
- name: StartAutomationExecution
action: aws:executeAwsApi
isEnd: true
inputs:
Service: ssm
Api: StartAutomationExecution
schemaVersion: '0.3'
description: Stop EC2 instances by tagname
parameters:
TagName:
type: String
description: ''
default: EC2AutoStop
mainSteps:
- name: StopEC2Instances
action: aws:executeAwsApi
isEnd: true
inputs:
Service: ssm
Api: StartAutomationExecution
DocumentName: AWS-StopEC2Instance
TargetParameterName: InstanceId
Targets:
- Key: tag:{{ TagName }}
Values:
- 'true'
- parameters:追加
- TagNameを設定
- default:停止用タグ名を指定
- description:任意
- mainSteps:
- name:任意
- DocumentName: AWS-StopEC2Instanceを指定
- TargetParameterName: InstanceIdを指定
- Tatgets:EC2停止条件を設定

④「自己所有」タブから該当ドキュメントが作成されていることを確認
⑤検証
作成したドキュメントをお試し実行する
「オートメーションを実行する」をクリック
8. EventBridge
8.1 スケジュール設定
①「EventBridge」を検索する
②左のメニューから、「スケジュール」をクリック
③「スケジュールを作成」をクリック
④スケジュール名と説明を入力
任意の情報を記載
8.2 ターゲット選択:SSMのドキュメント指定
①「すべてのAPI」を選択
②「Systems」を検索し、「SystemsManager」をクリック
③「StartAuto」を検索し、「StartAutomation」をクリック
④入力に作成した、「EC2AutoStop」のドキュメントを指定し、「次へ」をクリック

9. EC2起動要件の対応
9.1 SSM
「7. SSM」で作成したドキュメントを流用する
①「EC2AutoStop」を選択し、アクションから「ドキュメントのクローン作成」をクリック
③「Stop」を「Start」に置き換え、ランブックを作成する

⑤検証
作成したドキュメントを実行する
「オートメーションを実行する」をクリックする
7.SSM⑤で「停止」したインスタンスが「実行中」になったことを確認
9.2 EventBridge
「8. EventBridge」と同様に作成する
10. 全体テスト
スケジュールの時刻をテスト時間に近い時刻に設定し、
想定通りの動作を確認した方が良いと思います。
今回は割愛します。
引用元
本記事は下記資料を参考に作成しています。