【SSM ステートマネージャー】起動したEC2インスタンスに必ずパッチを当てる環境を作ってみる

『見つけ次第パッチ当てますね』 環境を作ってみる
2021.05.20

なぜステートマネージャか

もともと SSM メンテナンスウィンドウ を使って毎日特定の時刻にパッチをインストールする環境 を作っていました。 通常の EC2インスタンスはこの対応で問題無さそうです。

しかし、 AutoScaling Group(ASG)内のインスタンス を考慮したときに、 このメンテナンスウィンドウを使ったパッチ適用だけでは不十分です。 例えばパッチが当てられる特定時刻 "後" にインスタンス数 増減のスケジュールが 設定されていたときに、新しくできたインスタンスにはパッチが当たっていません。 困りました。

この問題の解決策の1つとして『ユーザーデータに yum update 等入れてしまう』 がありますが、ルール化/運用で一手間掛かりそうです。

そこで SSM ステートマネージャー の存在を知りました。 ステートマネージャー はインスタンスのあるべき状態を定義する機能です。 ステートマネージャとメンテナンスウィンドウは共通点が多いですが、 インスタンスが起動されたタイミングに特定のアクションを実行したい 場合には ステートマネージャが適しています。

このステートマネージャを使って、本タイトル 起動したEC2インスタンスに必ずパッチを当てる環境 を作ってみます。

前提条件

EC2インスタンスは SSM管理下(マネージドインスタンス)であることが前提条件です。

参考: Systems Manager の前提条件 - AWS Systems Manager

作ろうとしているもの

ステートマネージャー はインスタンスのあるべき状態を定義するものです。
この定義は 関連付け(Association) と言います。 関連付けには以下のような設定パラメータがあります。

  • 対象: どのインスタンスの状態を定義するか
  • 実行ドキュメント: どのドキュメントを実行するか
  • スケジュール: どの頻度で実行するか(or 1回のみの実施か)

今回作ろうとしている関連付けは以下のようなシンプルな設定です。

img

  • 対象: すべてのインスタンスです
  • 実行ドキュメント: AWS-RunPatchBaseline という『インスタンスにパッチを適用する』ドキュメントを使います
  • スケジュール: "1回のみ" とすることでインスタンス起動時のみの実行になります

作ってみる

[AWS Systems Manager > ステートマネージャー] 画面に行きます。 [関連付けの作成] を選択しましょう。

img

適当に名前を定めます。

img

ドキュメントは AWS-RunPatchBaseline を選択します。

img

以下 AWS-RunPatchBaseline の実行パラメーターです。 Operation = Install, Reboot Option = NoReboot と選択して、他は空白です。

img

ターゲットは 『Choose all instances』 、 スケジュールは 『スケジュールなし』 を選択します。

img

ほかはデフォルトで作成しちゃいます。 これで構築は完了です。

▼ 作成した関連付け

img

試してみる

EC2インスタンスを新規に作成します。

作成してしばらく、気が付くと既に関連付け(パッチ当て)が完了していました。

img

以下のように [実行履歴] > 実行ID から各パッチ当ての結果を確認できます。

img

↓↓↓

img

Patch Manager でパッチ適用状況を俯瞰できます。

img

※このダッシュボードについては以下ブログを参照ください

おわりに

ステートマネージャを使ったパッチ当て環境を作ってみました。

ステートマネージャでパッチ当てを行うか、 メンテナンスウィンドウでパッチ当てを行うか、 私なりにまとめた判断基準は以下のとおりです。

  • 割と厳密に全ての稼働しているインスタンスにパッチ当てを行う必要がある 場合はステートマネージャ (※1)
  • 特定タイミング(日時/時刻)にのみパッチ適用を行いたい 場合はメンテナンスウィンドウ (※2)
  • パッチ適用前後に別のアクション(ドキュメント)を実行したい 場合はメンテナンスウィンドウ

もちろん ※1 と ※2 を合わせて採用しても良いと思いました。

参考