
【第14回】AWS Systems Manager攻略マニュアル「Maintenance Windows実践編 メンテナンスタスク運用の効率化① タスクの登録方法」
Ops Todayでは「面倒なAWSシステム運用を効率化しよう!」をテーマに、AWSリソースを含むシステムの運用をする際に便利なサービス「AWS Systems Manager」に関する記事を複数回にわたってご紹介しています。(記事一覧はこちら)
今回は、Maintenance Windows実践編と題して、主にメンテナンスウィンドウへのタスク登録について解説します。Maintenance Windowsでは様々なAWSサービスと連携してタスクを登録できますが、上手に使い分けてタスクを登録できれば、メンテナンスタスク運用が大幅に効率化すること間違い無しです。
※以降、英語表記の “Maintenance Windows”はサービス名、カタカナ表記の “メンテナンスウィンドウ” はMaintenance Windows のコンポーネント名であるメンテナンスウィンドウとして使い分けます。
タスクとは
別記事「Maintenance Windows基本編」では、Maintenance Windowsの基礎知識と導入の流れについて、実際の設定画面を引用しながら解説しました。
今回も、導入フローに関する解説の続きとして「タスクの登録」を取り上げます。タスクはMaintenace Windowsによって実行される処理そのものであり、Maintenance Windows における最も根幹の部分と言えます。
タスク登録の選択肢
メンテナンスウィンドウの中で実行される処理を「タスク」といいます。
1つのメンテナンスウィンドウに対して、最大20個のタスクを登録することができます。
タスクは、次のAWSサービスによって実行することができます。
- AWS Systems Manager Run Command(以降、Run Commandと表記)
- AWS Systems Manager Automation(以降、Automationと表記)
- AWS Lambda(以降、Lambdaと表記)
- AWS Step Functions(以降、Step Functionsと表記)
したがって、タスクを登録する際にこれらのAWSサービスのうち、どのサービスを利用してタスクを作るか選択する必要があります。
タスク登録を行うAWSサービス、選定のポイント
どのAWSサービスを選択するか判断するには、それぞれのサービスの特徴を理解する必要があるでしょう。下記に、筆者が考える選定ポイントを挙げます。
タスクのコマンドログを出力したい場合: Run Commandを選択
S3バケット等にコマンド実行結果(ログ)を出力したい場合は、Run Commandを選択してください。出力先として、S3バケットかCloudWatch Logsを指定することができます。
実行ステータスをAmazon SNSで通知したい場合: Run Commandを選択
コマンド実行ステータスをAmazon SNSで通知したい場合、Run Commandを選択してください。あらかじめ作成したSNSトピックを使用して、コマンドステータスの変化をトリガーにして通知を行うことができます。
複雑なタスク制御が必要な場合:Run Command以外を選択
メンテナンスウィンドウで複数タスクを実行させる場合、途中でタスクが失敗しても後続タスクは影響を受けずに起動されます。
もし、前にあるタスクの実行結果に応じて後のタスクの振る舞いを変えるなど、細かいタスク制御を実現したい場合は、Run Command以外のサービスを検討した方がいいでしょう。
CloudWatchアラームによるエラー制御を行う場合:Run CommandかAutomationを選択
Run CommandかAutomationを選択した場合、CloudWatchアラームによるエラー制御が可能です。アラーム状態になった場合、タスクは実行停止します。
EC2以外のAWSリソースに対してタスクを実行する場合:Automationを選択
Run Commandは、EC2インスタンスでのコマンド操作(SSMドキュメント)を実行します。
一方、AutomationはEC2インスタンスも含めたAWSリソース全般に対する操作を実行できます(Automationで実行されるSSMドキュメントは ランブック(Runbook)と呼ばれます)。例えば、EC2インスタンスの起動/停止やバックアップなどはランブックで行います。
高負荷な処理、実行時間が長い処理:Lambda以外を選択
Lambdaは、継続的に行われる処理や複雑な処理の実行に向いていないと考えます。Lambdaで割り当て可能なメモリ容量は最大10,240MBであり、割り当てメモリ容量に応じてvCPUパワーも割り当てられることから、それほど大きなパフォーマンスを発揮できません。処理時間にも15分という制限があります。
高負荷な処理や実行時間が長い処理はStep Functionsによる実現を考慮した方がいいでしょう。
複雑なワークフローを伴うタスクの場合:Step Functionsを選択
Step Functionsを利用することで、視覚的にワークフローを意識してタスク作成が可能であり、処理の流れや実行状況をグラフィカルに把握することができます。
また、Step Functionsで作成したステートマシンよりLambda関数を実行することも可能なので、複雑な処理とワークフローをステートマシンで実現し、簡単な処理はLambda関数を呼び出すようにすることで、タスク構造を整理することもできるでしょう。
実際のタスク作成フロー
次に、それぞれの連携可能なAWSサービスを用いた実際のタスク作成フローを見ていきます。
メンテナンスウィンドウの一覧画面にて、タスクを作成するメンテナンスウィンドウのチェックボックスにチェックを入れ、画面右上にある「アクション」をクリックします。
表示されるメニューより、使用するツール名に応じて「[サービス名] タスクの登録」をクリックします。
※[サービス名]には「Run Command」、「Automation」、「Lambda」、「Step Functions」のいずれかが入ります。

選択したサービスに関する「タスクの登録」画面が表示されます。
以下の図は、前手順にて「Run Commandタスクの登録」をクリックした場合の画面です。

タスク登録の設定項目
タスク登録時の設定項目は、各サービスによって共通している項目もあれば、異なる項目もあります。
そこで、以降説明する各設定項目の頭に、以下のように設定対象となるサービスをアイコンを使って示すことにしました。

アイコンは、左から「Run Command」、「Automation」、「Lambda」、「Step Functions」の順に並べており、その設定項目で対象となるサービスは色を活性化させています。
上記の例の場合、Run Command と Automation で設定が可能な項目という意味です。
それでは、さっそく各設定項目について見ていきましょう。
メンテナンスウィンドウタスクの詳細


新規作成するタスクの「名前」、「説明」、「新しいタスク呼び出しのカットオフ(New task invocation cutoff)」について設定する項目です。
「新しいタスク呼び出しのカットオフ」の「Enabled」にチェックを入れると、カットオフタイム以降のタスク起動が抑止されます。
コマンドドキュメント

Run Commandでのみ表示される設定項目です。Run Commandによって実行するSSMドキュメントに関する設定を行います。

「ドキュメント」欄では、実行タスクを定義するSSMドキュメントを選択します。
リストボックスより対象のSSMドキュメントを選択すると、画面下部にある「ドキュメントの説明」欄に、選択したSSMドキュメントの概要が表示されます。
独自のSSMドキュメントを指定する場合、Systems Manager Documentsであらかじめ作成しておく必要があります。
「ドキュメントのバージョン」欄では、使用するSSMドキュメントのバージョンを選択します。
「タスク優先度」欄では、作成するタスクの優先度を指定します。0(ゼロ)が最も高い優先度です。タスクは優先度順にスケジュールされ、優先度が同じタスクは並列でスケジュールされます。複数タスクを直列実行するか、並列実行するかを制御できます。
メンテナンスウィンドウでは、途中いずれかのタスクが失敗した場合も、その影響を受けずに後続タスクが実行されます。
オートメーションドキュメント

Automationでのみ表示される設定項目です。オートメーションで実行するランブックに関する設定を行います。

「ドキュメント」欄では、実行するオートメーションランブックを指定します。リストボックスよりオートメーションランブックを選択すると、画面下部にある「ドキュメントの説明」欄に、選択したランブックの概要が表示されます。
独自のランブックを指定する場合、Automationであらかじめ作成しておく必要があります。
「ドキュメントのバージョン」欄では、使用するオートメーションランブックのバージョンを選択します。
「タスク優先度」欄は、Run Commandのコマンドドキュメントで設定する「タスク優先度」と同様の設定項目です。
Lambdaパラメータ

Lambdaでのみ表示される設定項目です。実行するLambdaファンクション(関数)に関する設定を行います。

「関数」欄では、実行するファンクションを選択します。独自のファンクションを指定する場合、Lambdaであらかじめ作成しておく必要があります。
「ペイロード」欄では、Lambda関数に引数として渡す情報をJSONで指定します。
「クライアントコンテキスト」欄では、Lambda関数に引数として渡すクライアント固有の情報を指定します。
「修飾子」欄では、Lambda関数のバージョンやエイリアスを指定します。
「タスク優先度」欄は、Run Commandのコマンドドキュメントで設定する「タスク優先度」と同様の設定項目です。
Step Functions パラメータ

Step Functionsでのみ表示される設定項目です。実行するステートマシン(Step Functionで定義する一連の処理)に関する設定を行います。

「ステートマシン」欄では、リストから実行するステートマシンを選択します。独自のステートマシンを指定する場合、Step Functionsであらかじめ作成しておく必要があります。
「名前」欄には、実行タスク名を入力します。
「入力」欄には、その他の指定したい情報を入力します。疑似パラメータを入力することもできます。
「タスク優先度」欄は、Run Commandのコマンドドキュメントで設定する「タスク優先度」と同様の設定項目です。
ターゲット

タスク実行のターゲットとなるマネージドインスタンスに関する設定を行います。
事前に登録したターゲットを指定する場合は、「登録済みターゲットグループの選択」を選択します。登録済みターゲットが一覧表示されるので、対象とするターゲットにチェックを入れます。

「未登録ターゲットグループの選択」を選択した場合、ターゲットに登録していないものも含め、すべてのマネージドノードが一覧に表示されます。
「未登録ターゲット」を選択する場合、メンテナンスウィンドウの設定で未登録のターゲットを許可する必要があります。

Run Command以外のサービスでタスクを登録する場合、「Task target not required」の選択肢も表示され、これを選んだ場合はターゲットを指定せずに手順を進めることができます。

入力パラメータ

Automationでのみ表示される設定項目です。「オートメーションドキュメント」で指定したランブックに関するパラメータの値を設定します。
指定可能なパラメータは、どのランブックを指定したかによって異なります。

レート制御

タスクの同時実行数や、タスク失敗時のエラーしきい値を設定します。

「同時実行数」では、同時に実行するタスクの数をマネージドノードの数で決定するか、割合で決定するか選択することができます。
「エラーしきい値」では、タスク失敗とみなして実行を停止するしきい値について、エラーの数か割合によって定義することができます。
エラーしきい値を超過した場合、ただちにそのタスクを停止し、タスクのステータスは「失敗」となります。
例えば、「エラー:3(回)」と設定した場合、4回目のエラーが発生した時点で以降のタスクは実行されません。
ただ、先述した通り、タスクが失敗となっても後続タスクは影響を受けずに実行されます。
IAMサービスロール

Systems Managerがユーザーに代わってタスクを実行する際、他AWSサービスに対して必要となるIAMサービスロールを指定します。

サービスロールを指定しない場合は、Systems Manager はアカウントのサービスにリンクされたロールである「AWS Service-linked roles for AmazonSSM」というデフォルトロールが使用されます(ドロップダウンメニューに表示されません)。
アカウントに Systems Manager 用の適切なサービスにリンクされたロールが存在しない場合は、タスクが正常に登録されるとロールが作成されます。
※デフォルトロールを使用する場合で、LambdaやStepFunctionsを利用する場合、Lambda関数の名前やステートマシンの名前がSSMで始まる必要があります。
※デフォルトロールは許可された権限がやや広いので、カスタムロールの利用が推奨されています。
出力オプション

Run Commandによるタスク登録の場合のみ、コマンドの実行結果を他AWSサービスに出力するオプション設定を行うことができます。
出力先としては、Amazon S3バケット、Amazon CloudWatchを指定できます。

「S3への書き込みの有効化」をチェックすると、出力先にする「S3バケット名」や「キープレフィックス」の指定が可能となります。

「CloudWatch output」をチェックすると、出力先とするロググループ名を指定できます。

SNS通知

Run Commandによるタスク登録の場合のみ、コマンドの実行ステータスをAmazon SNSへ通知する設定が可能です。

「SNS通知の有効化」をチェックすると、SNSへの通知をトリガーするIAMロールやSNSトピック、イベントタイプ、通知内容を指定する欄が表示されます。

「イベントタイプ」は、通知するイベントステータスを次の選択肢から複数指定可能です。
- すべて
- 進行中
- 成功
- タイムアウト済み
- 失敗
- キャンセル済み
パラメータ

Run Commandによるタスク登録の場合のみ、実行するSSMドキュメントのパラメータを指定します。
指定可能なパラメータは、「コマンドドキュメント」で指定したSSMドキュメントによって変わります。
なお、次の2つは、すべてのSSMドキュメントで共通している設定項目です。
コメント | タスクに関するコメント |
タイムアウト(秒) | タスクのタイムアウト時間を秒単位で指定 |
CloudWatch alarm

モニタリング用のタスクに適用するCloudWatchアラームを指定します。
アラームが作動すると、タスクは停止されます。

CloudWatchアラームを指定すると、設定項目「Continue tasks if alarm status is unavailable」が活性化されます。
この項目をチェックすると、指定したCloudWatchアラームのステータスをメンテナンスウィンドウが取得できない場合、メンテナンスウィンドウタスクは実行を継続します。

すべての項目を設定し、画面最下部にある「Run Command タスクの登録」をクリックすると、Run Command タスクの登録処理が開始します。

その後、タスクの一覧画面が表示されます。
作成処理が完了すると、画面上部に次のメッセージが表示されます。

以上で、タスクの登録は完了です。
さいごに
今回は「AWS Systems Managerフル攻略マニュアル」の第14回ということで、Maintenance Windowsのタスク登録について解説しました。
実行するタスクの内容に応じて、最も適切なサービスを選択してタスクを登録しましょう。Run CommandやAutomation、Lambdaを利用した比較的単純なタスクも実行できますし、Step FunctionsからLambda関数やAutomationタスクを呼び出すような複雑なタスクも作成することができます。
次回は、登録したタスクを実際に動かしてみる実践編をまとめる予定です。次回も是非ご参照ください。