AWS Systems Manager(SSM)のメンテナンスウィンドウ(Maintenance Window)とオートメーション(Automation)を使用してタグ付けされた複数の EC2 インスタンスの自動起動・停止をスケジューリングする手順について解説します。
以前、個別に「インスタンス ID」を指定する方法になりますが、Systems Manager(SSM)のメンテナンスウィンドウ(Maintenance Window)とオートメーション(Automation)を使用して EC2 インスタンスの自動起動・停止をスケジューリングする手順を解説しました。
【AWS】【SSM】Systems Manager のメンテナンスウィンドウとオートメーションを使用して EC2 インスタンスの自動起動・停止をスケジューリングする手順
例えば、会社で数百台規模の EC2 インスタンスを保有している場合、検証環境は半分としても百台以上あります。
とすると、実際に使用しない夜間や週末は停止をしてコスト削減をしたいところです。
今回は EC2 インスタンスにタグ付けをして(キー:ENVIRONMENT、バリュー:PRODUCTION、DEVELOP など)、まとめて起動停止を実現します。
ちなみに、AWS コスト削減として、以前 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 インスタンス
作業の概要
以下、作業の概要です。
- 対象の 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 オートメーションワークフロー(オートメーション)」を利用します。
対象の EC2 インスタンスにタグ付け
最初に対象に EC2 インスタンスに対してタグ付けをします。
EC2 インスタンス一覧より、対象の EC2 インスタンスを選択し「タグ」タブをクリックし「タグの追加/編集」ボタンをクリックします。
「タグの追加/編集」画面で「タグの作成」ボタンをクリックします。
下図のように「キー:ENVIRONMENT、値:DEVELOP」を入力し「保存」ボタンをクリックします。
下図のようにタグが追加されていることを確認します。
Systems Manager メンテナンスウィンドウの管理下に置きたい EC2 インスタンスに対して上記タグ付けを行ないます。
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」のダッシュボードに移動したら左側ペインより「メンテナンスウィンドウ」をクリックします。
「メンテナンスウィンドウの作成」ボタンをクリックします。
「メンテナンスウィンドウの作成」画面でメンテナンスウィンドウの「名前(例:EC2InstancesAutomationStop)」を設定して下にスクロールします。
下図のようにスケジュールを入力して下にスクロールします。
下図では例として「30分ごと」に対象の EC2 インスタンスを停止しています。
「メンテナンスウィンドウの作成」ボタンをクリックします。
下図のようにメンテナンスウィンドウが作成されたことを確認します。
ターゲットとなる EC2 インスタンスの選択
メンテナンスウィンドウを作成したらターゲットとなる EC2 インスタンスを登録します。
作成したメンテナンスウィンドウをクリックします。
「ターゲット」タブをクリックします。
「ターゲットの登録」ボタンをクリックします。
「ターゲットの登録」画面でターゲットの「名前(例:TargetTagforEC2InstancesStop)」を入力して下にスクロールします。
「ターゲット」で「Specify instance tags」を選択し、「Instance tags」に以下のキーと値を入力し、「Add」ボタンをクリックします。
- キー:ENVIRONMENT
- 値 :DEVELOP
下図のようにタグが登録されていることを確認し「ターゲットの登録」ボタンをクリックします。
下図のように「ターゲット」が登録されていることを確認します。
オートメーションタスクを登録する
続けて「オートメーションタスク(今回の場合は EC2 インスタンスの停止)」を登録します。
対象のメンテナンスウィンドウの「タスク」タブを選択して「タスクを登録する」をクリックし「オートメーションタスクの登録」をクリックします。
「オートメーションタスクの登録」画面でオートメーションの「名前」を設定して下にスクロールします。
「オートメーションドキュメント」で「AWS-StopEC2Instance」にチェックを入れます。
「ドキュメントのバージョン」は「ランタイムのデフォルトのバージョン」を選択します。
「優先度」はデフォルトの「1」のままにして下にスクロールします。
ターゲットの「カテゴリ別ターゲット」で「登録済みターゲットグループの選択」を選択し、先ほど登録したターゲットにチェックを入れて、下図のようにターゲットが追加されたことを確認し、下にスクロールします。
レート制御で、下図のように設定をして下にスクロールします。
IAM サービスロールで「サービスロールのオプション」で「カスタムサービスロールを使用する」にチェックを入れてオートメーション用に作成したロール(例では「SSMAutomationRoleforStartStopInstances」)を選択し、入力パラメータ―の「InstanceId」に「{{ TARGET_ID }}」を入力して「オートメーションタスクの登録」ボタンをクリックします。
{{ TARGET_ID }} とは何か?
入力パラメータ―に変数「InstanceId」がありますが、この「値」に「インスタンス ID」を直接入力することもできます。
しかし、今回は変数「InstanceId」に値「{{ TARGET_ID }}」を渡しています。
{{ TARGET_ID }} について AWS 公式サイトに解説があります。
疑似パラメータについて
{{ TARGET_ID }} とは、疑似パラメータ構文で、パラメータに {{ TARGET_ID }} を指定すると、インスタンス ID が {{ TARGET_ID }} の代わりに渡されます。
- インスタンス ID を直接渡す ← 正規の?パラメータを渡している
- {{ TARGET_ID }} を渡す ← 疑似的なパラメータを渡している
■使用可能な擬似パラメータ
以下のリストでは、–task-invocation-parameters オプションの {{PSEUDO_PARAMETER}} 構文を使用して指定できる疑似パラメータについて説明しています。
- TARGET_ID: ターゲットの ID。ターゲットタイプがインスタンス (現在唯一サポートされているタイプ) の場合、ターゲット ID はインスタンス ID です。
- TARGET_TYPE: ターゲットのタイプ。現在は、インスタンスのみがサポートされています。
- WINDOW_ID: ターゲットメンテナンスウィンドウの ID。
- WINDOW_TASK_ID: 実行されているウィンドウタスクの ID。
- WINDOW_TARGET_ID: ターゲット (ターゲット ID) を含むウィンドウターゲットの ID。
- WINDOW_EXECUTION_ID: 現在のウィンドウ実行の ID。
- TASK_EXECUTION_ID: 現在のタスク実行の ID。
- INVOCATION_ID: 現在の呼び出しの 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インスタンスを定期再起動する
コメント