AWS Systems Manager(SSM)のメンテナンスウィンドウ(Maintenance Window)とオートメーション(Automation)を使用して EC2 インスタンスの自動起動・停止をスケジューリングする手順です。
例えば、会社で数百台規模の EC2 インスタンスを保有している場合、検証環境は半分としても百台以上あります。
とすると、実際に使用しない夜間や週末は停止をしてコスト削減をしたいところです。
コスト削減として、以前 Lambda と CloudWatch Events で定期的に自動起動・自動停止をする仕組みを作りました。
【AWS】【Python】Lambda で EC2 インスタンスを起動・停止するプログラム&スケジュール化手順【2018年最新版】
【AWS】【Python】Lambda で EC2 インスタンスを起動・停止するプログラム&スケジュール化手順【2017年最新版】
【AWS】【Lambda】Lambda で Amazon RDS を自動停止するスクリプトの作成【2019年版】
【AWS】【Python】Lambda で RDS インスタンスを起動・停止するプログラム&スケジュール化手順【2017年最新版】
今回 EC2 インスタンスの自動起動・停止を設定する環境
下図の EC2 インスタンス 2台を利用します。
- Windows と Linux(RedHat)環境2台
- 2台とも EC2 インスタンス
作業の概要
以下、作業の概要です。
- オートメーション(Automation)を実行するロールの作成
- Automation用(自動化用)の信頼関係を追加する
- iam:PassRole ポリシーを Automation ロールにアタッチする
- メンテナンスウィンドウ(Maitenance Window)を実行するロールの作成
- Systems Manager が SSM エージェントにアクセスするためのロールの作成
- MaintenaceWindow用(メンテナンスウィンドウ用)の信頼関係を追加する
- メンテナンスウィンドウ(Maintenance Window)の設定
- オートメーション(Automation)の設定
- 動作確認
メンテナンスウィンドウ(Maintenance Window)とは
メンテナンスウィンドウ(Maintenance Window)は以下のタスクを実行できます。
- Systems Manager Run Command コマンド
- Systems Manager オートメーションワークフロー
- AWS Lambda 関数
- AWS Step Functions タスク
今回の自動化は「Systems Manager オートメーションワークフロー(オートメーション)」を利用します。
IAM ロールの作成
今回のように「メンテナンスウィンドウ」上に「オートメーション」を設定し定期的に実行する場合は合計3つのロールが必要になります。
- メンテナンスウィンドウ(Maitenance Window)を実行するロール ← 新規作成します。
- オートメーション(Automation)を実行するロール ← 新規作成します。
- Systems Manager から EC2 インスタンスにアクセスするためのロール ← 既存のロールを利用します。
※それぞれのロールは役割が異なります。
オートメーション(Automation)を実行するロールの作成
オートメーション(Automation)を実行するロールを作成します。
AWS 管理コンソールより「サービス」-「セキュリティ、ID、およびコンプライアンス」-「IAM」をクリックします。
IAM のダッシュボードに移動したら左側ペインより「ロール」をクリックし「ロールの作成」ボタンをクリックします。
「ロールの作成」画面が表示されたら下図のように「信頼されたエンティティの種類を選択」で「AWS サービス」を選択し、「このロールを使用するサービスを選択」で「EC2」をん選択肢「次のステップ:アクセス権限」ボタンをクリックします。
「Attach アクセス権限ポリシー」画面で「ポリシーのフィルタ」に「AmazonSSMAutomationRole」と入力して検索し表示された「AmazonSSMAutomationRole」にチェックを入れて「次のステップ:タグ」ボタンをクリックします。
「タグの追加」画面で必要な場合はタグを設定し「次のステップ:確認」ボタンをクリックします。
「確認」画面で「ロール名(例では SSMAutomationRoleforStartStopInstances)」を入力し「ロールの作成」ボタンをクリックします。
下図のようにロールが作成されていることを確認します。
Automation用(自動化用)の信頼関係を追加する
次に Automaition(自動化)を信頼するサービスロールポリシーを設定します。
先ほど作成した「SSMAutomationRoleforStartStopInstances」を検索してクリックします。
「概要」画面で「信頼関係」タブをクリックします。
「信頼関係」タブに移動したら「信頼関係の編集」ボタンをクリックします。
ポリシードキュメントで「ssm.amazonaws.com」を以下のように追加して「信頼ポリシーの更新」ボタンをクリックします。
以下、ポリシー部分です。
■追加前
{ |
■追加後
{ |
※注意点としては値が複数になることにより、[] が入ってくることです。
下図のように「信頼されたエンティティ」に「ID プロバイダー ssm.amazonaws.com」が追加されていることを確認します。
iam:PassRole ポリシーを Automation ロールにアタッチする
次に「iam:PassRole」ポリシーを自動化サービスロール(例:今回作成した SSMAutomationRoleforStartStopInstances)にアタッチします。
これにより、Automation(自動化ワークフロー)を実行する際に、自動化サービスによって他のサービスあるいは Systems Manager 機能にロールが渡されるようになります。
「SSMAutomationRoleforStartStopInstances」の概要を開き「インラインポリシーの追加」をクリックします。
「ポリシーの作成」ページの「ビジュアルエディタ」タブを選択し、「サービスの選択」をクリックします。
検索欄に「IAM」と入力し検索し、「IAM」をクリックします。
次に「アクション」の検索欄に「PassRole」と入力し[PassRole] オプションにチェックを入れます。
次に「リソース」の「指定」にチェックを入れて「ARN の追加」をクリックします。
「ARN の追加」画面で「IAM role の ARN の指定」に先ほど作成した「SSMAutomationRoleforStartStopInstances」の ARN を貼り付けて「追加」ボタンをクリックします。
■ARN はどこで確認できるのか?
「SSMAutomationRoleforStartStopInstances」の ARN は「SSMAutomationRoleforStartStopInstances」ロールの概要画面に下図のように記載されています。
設定内容を確認し「ポリシーの確認」ボタンをクリックします。
下図のように「インラインポリシー(SSMAutomationRoleforStartStopInstancePolicy)」が適用されていることを確認します。
メンテナンスウィンドウ(Maitenance Window)を実行するロールの作成
次に「メンテナンスウィンドウ(Maitenance Window)」を実行するロールを作成します。
IAM のダッシュボードより左側ペインの「ロール」をクリックし「ロールの作成」ボタンをクリックします。
「ロールの作成」画面が表示されたら下図のように「信頼されたエンティティの種類を選択」で「AWS サービス」を選択し、「このロールを使用するサービスを選択」で「EC2」をん選択肢「次のステップ:アクセス権限」ボタンをクリックします。
「Attach アクセス権限ポリシー」画面で、ポリシーのフィルタに「AmazonSSMMaintenanceWindowRole」と入力し、表示された「AmazonSSMMaintenanceWindowRole」にチェックを入れて「次のステップ:タグ」ボタンをクリックします。
「タグの追加」画面で必要な場合はタグを追加して「次のステップ:確認」ボタンをクリックします。
「確認」画面で「ロール名」を入力し「ロールの作成」ボタンをクリックします。
下図のようにロールが作成されていることを確認します。
MaintenaceWindow用(メンテナンスウィンドウ用)の信頼関係を追加する
次に MaintenaceWindow 用(メンテナンスウィンドウ用)の信頼関係を追加します。
上で作成したロール(例では「SSMMaintenanceWindowRoleforStartStopInstances」)をクリックして展開します。
「概要」画面で「信頼関係」タブを選択して「信頼関係の編集」ボタンをクリックします。
「信頼関係の編集」画面で以下のように Service に「ssm.amazonaws.com」を追加して「信頼ポリシーの更新」ボタンをクリックします。
ポリシーは以下のように修正します。
■修正前のポリシー
{ |
■修正後のポリシー
{ “ec2.amazonaws.com”, “ssm.amazonaws.com” ← 追加します。 ] |
「ID プロバイダー ssm.amazonaws.com」が追加されていることを確認します。
Systems Manager が SSM エージェントにアクセスするための IAM ロールの作成
次に Systems Manager から EC2 インスタンスにアクセスしてコントロールするための IAM ロールを作成します。
以下、以前に SSM エージェントのインストールおよび設定手順を解説した記事です。
【AWS】【SSM】Systems Manager の SSM エージェントをインストールその他設定して Systems Manager から認識されるようにする設定手順【Windows】
【AWS】【SSM】Systems Manager の SSM エージェントインストールおよびその他 Systems Manager から認識されるようにする設定手順【Linux】
AWS 管理コンソールより「サービス」–「セキュリティ、ID、およびコンプライアンス」–「IAM」をクリックします。
IAM ダッシュボードに移動したら左側ペインより「ロール」をクリックします。
「ロールの作成」ボタンをクリックします。
「信頼されたエンティティの種類を選択」で「AWS サービス」を選択し、「このロールを使用するサービスを選択」で「EC2」を選択し、「次にステップ:アクセス権限」ボタンをクリックします。
「ポリシーのフィルタ」に「SSM」と入力し検索をして「AmazonEC2RoleforSSM」にチェックを入れて「次のステップ:タグ」ボタンをクリックします。
「タグの追加」で必要な場合はタグを作成して「次のステップ:確認」ボタンをクリックします。
確認画面で「ロール名(SSMAgentRoleforEC2)」を入力し「ロールの作成」ボタンをクリックします。
下図のようにロールが作成されていることを確認します。
Systems Manager の管理下に置く EC2 インスタンスにロールを割り当てる
ロールを作成したら Systems Manager の管理下に置く EC2 インスタンスにロールを割り当てます。
対象の EC2 インスタンスを選択したら「アクション」-「インスタンスの設定」-「IAM ロールの割り当て/置換」をクリックします。
「IAM ロールの割り当て/置換」画面で「IAM ロール」に先ほど作成した「SSMAgentRoleforEC2」を入力し「適用」ボタンをクリックします。
以下のように「成功しました」のメッセージが表示されることを確認します。
対象の EC2 が Systems Manager の管理下に入っていることを確認
先ほど設定した対象の EC2 が Systems Manager の管理下に入っていることを確認します。
AWS 管理コンソールより「サービス」-「管理とガバナンス」-「Systems Manager」をクリックします。
「AWS Systems Manager」のダッシュボードに移動したら左側ペインより「マネージドインスタンス」をクリックします。
下図のようにマネージドインスタンスの一覧に表示されることを確認します。
メンテナンスウィンドウ(Maintenance Windows)の設定
メンテナンスウィンドウ(Maintenance Windows)で EC2 インスタンスの自動起動自動停止の設定を入れます。
(今回は EC2 インスタンスの停止のみ設定しています。)
AWS 管理コンソールより「サービス」-「管理とガバナンス」-「Systems Manager」をクリックします。
「AWS Systems Manager」のダッシュボードに移動したら左側ペインより「メンテナンスウィンドウ」をクリックします。
「メンテナンスウィンドウの作成」ボタンをクリックします。
「メンテナンスウィンドウの作成」画面でメンテナンスウィンドウの「名前」を設定して下にスクロールします。
下図のようにスケジュールを入力して下にスクロールします。
下図では例として「30分ごと」に対象の EC2 インスタンスを停止しています。
「メンテナンスウィンドウの作成」ボタンをクリックします。
下図のようにメンテナンスウィンドウが作成されたことを確認します。
ターゲットとなる EC2 インスタンスの選択
メンテナンスウィンドウを作成したらターゲットとなる EC2 インスタンスを登録します。
作成したメンテナンスウィンドウをクリックします。
「ターゲット」タブをクリックします。
「ターゲットの登録」ボタンをクリックします。
「ターゲットの登録」画面でターゲットの「名前」を入力して下にスクロールします。
「ターゲット」で「Choose instances manually」を選択し、「インスタンス」で対象のインスタンスを選択して「ターゲットの登録」ボタンをクリックします。
下図のように「ターゲット」が登録されていることを確認します。
オートメーションタスクを登録する
続けて「オートメーションタスク(今回の場合は EC2 インスタンスの停止)」を登録します。
対象のメンテナンスウィンドウの「タスク」タブを選択して「タスクを登録する」をクリックし「オートメーションタスクの登録」をクリックします。
「オートメーションタスクの登録」画面でオートメーションの「名前」を設定して下にスクロールします。
「オートメーションドキュメント」で「AWS-StopEC2Instance」にチェックを入れます。
「ドキュメントのバージョン」は「ランタイムのデフォルトのバージョン」を選択します。
「優先度」はデフォルトの「1」のままにして下にスクロールします。
ターゲットの「カテゴリ別ターゲット」で「登録済みターゲットグループの選択」を選択し、先ほど登録したターゲットにチェックを入れて下にスクロールします。
レート制御で、下図のように設定をして下にスクロールします。
IAM サービスロールで「サービスロールのオプション」で「カスタムサービスロールを使用する」にチェックを入れてオートメーション用に作成したロール(例では「SSMAutomationRoleforStartStopInstances」)を選択し、入力パラメータ―の「InstanceId」に「{{ TARGET_ID }}」を入力して「オートメーションタスクの登録」ボタンをクリックします。
以下のようにタスクが登録されることを確認します。
実行結果の確認
下図のようにメンテナンスウィンドウの実行のステータスが「成功」になることを確認します。
メンテナンスウィンドウの詳細を確認したい場合は対象の「メンテナンスウィンドウ」を選択し「詳細」ボタンをクリックします。
下図のように詳細を確認できます。
念のために EC2 インスタンスが実際に停止していることを確認します。
トラブルシューティング
下図のようにステータスが「失敗」になった場合です。
失敗の原因を調べるために対象のメンテナンスウィンドウを選択し「詳細」ボタンをクリックします。
■ステータスの詳細
Step fails when it is validating and resolving the step inputs. com.amazonaws.amiaserviceworker.exception.ActionInputsResolvingException: Input InstanceIds String pattern validation fails. Expected regex pattern: (^i-(\w{8}|\w{17})$)|(^op-\w{17}$). Actual value: . Please refer to Automation Service Troubleshooting Guide for more diagnosis details. |
■原因
原因は「{{ TARGET_ID }}」が入っていないことが原因なので下図の手順で追加します。
メンテナンスウィンドウを選択します。
対象のメンテナンスウィンドウの「タスク」タグをクリックします。
対象のタスクにチェックをれて「編集」ボタンをクリックします。
「InstanceId」に {{ TARGET_ID }} を入力します。(または {{ TARGET_ID }} が入力されていることを確認します。)
参考サイト
AWS 公式サイト
勉強になりました。ありがとうございます。
Systems Manager Maintenance Window で 任意のEC2インスタンスを定期再起動する
コメント