AWS CLI と SSM を利用して Windows EC2 インスタンスの OS 情報とドライバーバージョンを一括取得してみた

AWS CLI と SSM を利用して Windows EC2 インスタンスの OS 情報とドライバーバージョンを一括取得してみた

Clock Icon2024.11.02

はじめに

テクニカルサポートの 片方 です。
Windows インスタンスで実行されている AWS ドライバーとドライバーバージョンの調査としては EC2 のマネジメントコンソール画面よりシステムログを確認する方法などがございますが、一つ一つ確認するのは手間ですね。
そのため、AWS CLI と SSM の一機能である Run Command を利用して Windows EC2 インスタンスの OS 情報と ドライバーバージョンを一括取得してみました。
もし、Linux EC2 インスタンスの OS 情報とカーネルバージョンを取得されたい場合は、以下をご参考にしてください。

https://dev.classmethod.jp/articles/aws-cli-ssm-linux-os-ec2-kernel-information/

前提条件

本ブログで紹介する方法では、取得対象の Windows EC2 インスタンスに以下の条件が必須です。

  • マネージドノードとして登録済み : Run Command を実行するため

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-setting-up-ec2.html

  • タグが付与されている : タグを利用して対象リソースを絞るため(例: Key=Environment, Values=Production)

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/Using_Tags_Console.html

やってみた

各種 Windows OS で取得可能であるかの検証も兼ねて、以下をマネージドノード登録されるように起動しました。

  • Windows Server2022 : Xen
  • Windows Server2022 : Nitro
  • Windows Server2019 : Nitro
  • Windows Server2016 : Nitro

1

AWS CLI コマンド実行元 EC2 インスタンス(Linux OS)を除く 4 台に対してタグを付与しました。
Key=Environment , Values=Production

2

これで準備は完了です。
以下の作成したスクリプトでは、aws ssm send-command 使って、タグ指定した Windows インスタンスで実行されている AWS ドライバーとドライバーのバージョンを一覧取得します。

https://repost.aws/ja/knowledge-center/ec2-windows-unreachable-after-driver-upgrade

注: 次の PowerShell コマンドを実行して、Windows インスタンスで実行されている AWS ドライバーとドライバーのバージョンを一覧表示できます。
Get-WmiObject Win32_PnpSignedDriver | Select-Object DeviceName, DriverVersion, InfName | Where-Object {$.DeviceName -like "AWS" -OR $.DeviceName -like "Amazon"}

※ AWS CLI コマンド例(targets はお客様環境に合わせて修正してください)

#!/bin/bash

# 1. コマンドを送信してコマンドIDを取得(OS情報のみ取得)
COMMAND_ID=$(aws ssm send-command \
    --document-name "AWS-RunPowerShellScript" \
    --targets "Key=tag:Environment,Values=Production" \
    --parameters 'commands=["$os = Get-WmiObject -Class Win32_OperatingSystem | Select-Object -ExpandProperty Caption; $drivers = Get-WmiObject Win32_PnpSignedDriver | Where-Object { $_.DeviceName -like \"*Elastic*\" -or $_.DeviceName -like \"*AWS*\" -or $_.DeviceName -like \"*Amazon*\" } | Select-Object DeviceName, DriverVersion, InfName; $output = \"OS: $os`nDrivers:`n\"; if ($drivers) { foreach ($driver in $drivers) { $output += \"$($driver.DeviceName)  $($driver.DriverVersion)  $($driver.InfName)`n\" }; Write-Output $output } else { Write-Output \"No drivers found.\" }"]' \
    --query "Command.CommandId" \
    --output text)

echo "Command ID: $COMMAND_ID"

# 2. コマンドの実行が完了するまで待機 (ポーリング)
while true; do
    STATUS=$(aws ssm list-command-invocations \
        --command-id "$COMMAND_ID" \
        --details \
        --query "CommandInvocations[].Status" \
        --output text)

    echo "Current Status: $STATUS"

    if [[ "$STATUS" == *"InProgress"* || "$STATUS" == *"Pending"* ]]; then
        echo "Command is still running. Waiting for completion..."
        sleep 5
    else
        break
    fi
done

# 3. コマンドの結果を取得して表形式で表示
aws ssm list-command-invocations \
    --command-id "$COMMAND_ID" \
    --details \
    --query "CommandInvocations[*].{InstanceId:InstanceId,Output:CommandPlugins[0].Output}" \
    --output table

実行結果

sh-5.2$ #!/bin/bash

# 1. コマンドを送信してコマンドIDを取得(OS情報のみ取得)
COMMAND_ID=$(aws ssm send-command \
    --document-name "AWS-RunPowerShellScript" \
    --targets "Key=tag:Environment,Values=Production" \
    --parameters 'commands=["$os = Get-WmiObject -Class Win32_OperatingSystem | Select-Object -ExpandProperty Caption; $drivers = Get-WmiObject Win32_PnpSignedDriver | Where-Object { $_.DeviceName -like \"*Elastic*\" -or $_.DeviceName -like \"*AWS*\" -or $_.DeviceName -like \"*Amazon*\" } | Select-Object DeviceName, DriverVersion, InfName; $output = \"OS: $os`nDrivers:`n\"; if ($drivers) { foreach ($driver in $drivers) { $output += \"$($driver.DeviceName)  $($driver.DriverVersion)  $($driver.InfName)`n\" }; Write-Output $output } else { Write-Output \"No drivers found.\" }"]' \
    --query "Command.CommandId" \
    --output text)

echo "Command ID: $COMMAND_ID"

# 2. コマンドの実行が完了するまで待機 (ポーリング)
while true; do
    STATUS=$(aws ssm list-command-invocations \
        --command-id "$COMMAND_ID" \
        --details \
        --query "CommandInvocations[].Status" \
        --output text)

    echo "Current Status: $STATUS"

    if [[ "$STATUS" == *"InProgress"* || "$STATUS" == *"Pending"* ]]; then
        echo "Command is still running. Waiting for completion..."
        sleep 5
    else
        break
    fi
done

# 3. コマンドの結果を取得して表形式で表示
aws ssm list-command-invocations \
    --command-id "$COMMAND_ID" \
    --details \
    --query "CommandInvocations[*].{InstanceId:InstanceId,Output:CommandPlugins[0].Output}" \
    --output table
Command ID: 055134ea-7e4f-4c89-932c-d83b0e435b43
Current Status: InProgress      InProgress      InProgress      InProgress
Command is still running. Waiting for completion...
Current Status: Success Success Success Success
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|                                                                                                                       ListCommandInvocations                                                    |
+---------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|     InstanceId      |                                                                                                                    Output                                                    |
+---------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|  i-0d899f8af0f5563bb|  OS: Microsoft Windows Server 2019 Datacenter
Drivers:
Amazon Elastic Network Adapter  2.8.0.0  oem5.inf
AWS NVMe Elastic Block Storage Adapter  1.5.0.33  oem2.inf

                                                                        |
|  i-0e004769924919ee1|  OS: Microsoft Windows Server 2022 Datacenter
Drivers:
Amazon Elastic Network Adapter  2.8.0.0  oem88.inf
AWS NVMe Elastic Block Storage Adapter  1.5.0.33  oem3.inf

                                                                       |
|  i-004e7fc7a9e45c5ec|  OS: Microsoft Windows Server 2016 Datacenter
Drivers:
Amazon Elastic Network Adapter  2.8.0.0  oem12.inf
AWS NVMe Elastic Block Storage Adapter  1.5.0.33  oem19.inf

                                                                      |
|  i-03f9d78414220a029|  OS: Microsoft Windows Server 2022 Datacenter
Drivers:
AWS Interface  8.2.7.5  oem1.inf
AWS PV Network Device  8.2.5.32  oem2.inf
AWS PV Network Class  8.2.9.8  oem4.inf
AWS PV Storage Host Adapter  8.4.1.6  oem81.inf
AWS PV Bus

   |
+---------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
sh-5.2$

3

4

成功しました!

まとめ

古いドライバーバージョンをご利用の場合、何らかの不具合や疎通性の問題が発生するといった事例もございます。
棚卸しも兼ねて、定期的に確認することをお勧めします。
本ブログが誰かの参考になれば幸いです。

参考資料

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.