Systems Manager Run Commandを使ってWindows Updateをしてみた

2024.03.19

はじめに

こんにちは。AWS事業本部コンサルティング部に所属している和田響です。

この記事ではSystems ManagerのRun Commandを使ったWindows Updateのメリットについて解説し、実際にWindowsのOSで起動したEC2に対してWindows Updateを実行してみます。

どなたかの参考になれば幸いです。

Run Commandとは

Run Commandは、AWS Systems Managerのコンポーネントの1つで、AWSアカウント内の複数のEC2インスタンスに対して、リモートでコマンドを実行できる機能です。

Run Commandの主な使用例

Run Commandの主な利用例として、以下のようなものがあげられます。

  • ソフトウェアのインストール/アップデート
  • 設定ファイルの変更
  • アプリケーションの起動/停止
  • ログの収集
  • 一時的なスクリプトの実行

Run Command利用のメリット

Run Commandを利用するメリットとして、以下のようなものがあげられます。

  • 複数のインスタンスに対して同時に実行できるため、一括の作業が可能になる
  • 事前に定義されたRun Command用のスクリプトを使うことができる
  • 実行スケジュールを設定できるため、定期的なメンテナンス作業に活用できる

Run Commandを利用する方法

Run Command使用するためには以下の手順が必要です。

  • 対象のEC2インスタンスをマネージド化する
  • 対象のEC2インスタンスへのネットワークを確立する

対象のEC2インスタンスをマネージド化する

EC2インスタンスをマネージド化するするには以下の手順が必要です。

  • 対象のEC2インスタンスにSSM エージェントをインストールする
  • 対象のEC2インスタンスにインストールされたSSM エージェントを有効化する
  • 必要なIAMポリシーを割り当てる

対象のEC2インスタンスにSSM エージェントをインストールする
対象のEC2インスタンスにインストールされたSSM エージェントを有効化する
EC2インスタンスをマネージドインスタンス化するためには、対象のEC2インスタンスにSSM エージェントをインストールし有効化する必要があります。

しかしながら、現在では多くのAMIでデフォルトでSSM エージェントがインストールされているため、この手順が不要になる場合もあります。
執筆時点では以下のAMIにデフォルトでSSM エージェントがインストールされているようです。

  • AlmaLinux
  • Amazon Linux 1 Base AMIs dated 2017.09 and later
  • Amazon Linux 2
  • Amazon Linux 2 ECS-Optimized Base AMIs
  • Amazon Linux 2023 (AL2023)
  • Amazon EKS-Optimized Amazon Linux AMIs
  • macOS 10.14.x (Mojave), 10.15.x (Catalina), 11.x (Big Sur), 12.x (Monterey), 13.x (Ventura), and 14.x (Sonoma)
  • SUSE Linux Enterprise Server (SLES) 12 and 15
  • Ubuntu Server 16.04, 18.04, 20.04, and 22.04
  • Windows Server 2008-2012 R2 AMIs published in November 2016 or later
  • Windows Server 2016, 2019, and 2022


必要なIAMポリシーを割り当てる
Amazon EC2 インスタンスをマネージドインスタンスとして設定するためにはAmazonSSMManagedInstanceCoreというIAMポリシーを割り当てる必要があります。

対象のEC2インスタンスへのネットワークを確立する

以下のいずれかの方法で対象のSystems ManagerからEC2インスタンスへのネットワークを確立する必要があります。

対象のEC2インスタンスにパブリックIPアドレスまたはElastic IPアドレスが割り当てる
EC2インスタンスにパブリックIPアドレスまたはElastic IPアドレスが割り当てることで、インターネットゲートウェイを介したアクセスが可能になります。
しかしながらEC2インスタンスにパブリックIPを付与することはベストプラクティスの観点から推奨されていません。
以降に記載するセキュアな方法を検討しましょう。

NATゲートウェイを配置する
NATゲートウェイを作成し対象のEC2インスタンスが配置されたサブネットのルートテーブルに、NATゲートウェイへのルートを確立することで通信を可能にします。
NATゲートウェイを介した通信は「EC2→インターネット」の通信は許可するが、「インターネット→EC2」は許可しないため、EC2インスタンスにパブリックIPを付与する方法に比べセキュアといえますが、通信がインターネットを通らないわけではないという点を押さえておきましょう。

VPCエンドポイントを使用する
VPCエンドポイントを使用することで、インターネットゲートウェイを経由せずにSystems Managerとプライベートな通信が可能になります。
従って上記の2つに比べてよりセキュアといえます。

Systems Managerからのアクセスに必要なエンドポイントは以下の3つのエンドポイントが必要になります。

  • ssm.region.amazonaws.com
  • ssmmessages.region.amazonaws.com
  • ec2messages.region.amazonaws.com

やってみた

検証用のEC2インスタンスを作成します。
今回はruncommand-test-windows-ec2という名前で、OSはWindows Server 2022を選択しました。
Windows Server 2022のAMIはデフォルトでSSMエージェントがインストールされているので、今回の検証ではSSMエージェントのインストールは不要です。

また、検証のためパブリックIPを付与してネットワークを確立します。

マネージドコンソールから「IAM」-「ロール」を開き、「ロールの作成」をクリックします。

信頼されたエンティティタイプは「AWSのサービス」を選択します。

「EC2 Role for AWS Systems Manager」を選択し、「次へ」をクリックします。

許可ポリシーに「AmazonSSMManagedInstanceCore」が表示されていることを確認し、「次へ」をクリックします。

任意のロール名を入力し「ロールを作成」をクリックします。
これで「AmazonSSMManagedInstanceCore」のポリシーが許可されたIAMロールが作成できました。

続いて作成したIAMロールをEC2にアタッチします。
対象のEC2インスタンスを選択し、「アクション」-「セキュリティ」から「IAMロールを変更」をクリックします。

先ほど作成したIAMロールを選択し、「IAMロールを更新」をクリックします。

これでEC2インスタンスのマネージドインスタンス化が完了しました。

続いて以下の2つのRun Commandをを実行しWindows Updateを行います。

  • AWS-FindWindowsUpdates:インストールされていないWindows Updateをスキャンし、見つかった更新プログラムの一覧を出力する
  • AWS-InstallMissingWindowsUpdates:インストールされていないWindows Updateを自動的にスキャンし、見つかった更新プログラムをインストールする

「Systems manager」-「Run Command」を開き、「Run Command」をクリックします。

AWS-FindWindowsUpdatesを選択します。

コマンドのパラメータの「Update Level」をAllにし、すべてのインストールされていない更新プログラムをスキャンします。

対象のEC2インスタンスを選択し、「実行」をクリックします。  

「コマンド履歴」から先ほど実行したコマンドを選択し、「インスタンス ID」をクリックします。

「Output」タブを開き、出力を確認するとImportant Updates: 3の記載があり、重要なUpdateが3つあることがわかります。

続いて、再びRun Commnadを開きAWS-InstallMissingWindowsUpdatesを選択します。
先ほどと同様の設定で実行します。

ステータスが成功になったら、「コマンド履歴」から先ほど実行したコマンドの「コマンド履歴」を確認します。 Important Updates: 3の記載があり、重要なUpdateを3つ行ったことがわかります。

もう一度AWS-FindWindowsUpdatesを実施し、残っているUpdateがないかを確認します。

Important Updates: 1の記載があり、重要なUpdateが1つ残っていることがわかります。

同様の手順でAWS-InstallMissingWindowsUpdatesを実行します。

ステータスが成功になったら同様に「コマンド履歴」を確認します。
Important Updates: 1の記載があり、重要なUpdateを1つ行ったことがわかります。

再びAWS-FindWindowsUpdatesを実施し、残っているUpdateがないかを確認します。

Important Updates: 0の記載があり、残っているUpdateがないことが確認できました。

以上でRun Commandを使って最新のWindows Updateまで完了できました。

最後に

今回はSystems ManagerのRun Commandを使ったWindows Updateについて記載しました。WindowsサーバにRDPせずにWindows Updateができるのは魅力的ですね。
この記事が、どなたかの参考になれば幸いです。