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

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

Clock Icon2024.10.11

はじめに

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

前提条件

本ブログで紹介する方法では、取得対象の Linux 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

やってみた

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

  • Amazon Linux2
  • Amazon Linux2023
  • AlmaLinux
  • Red Hat Enterprise Linux
  • Ubuntu
  • SLES(SUSE)
  • CentOS Linux

10

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

12

これで準備は完了です。
以下の作成したスクリプトでは、aws ssm send-command 使って、タグ指定したインスタンスに uname -r と /etc/os-release を取得するためのコマンドを送信してます。

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

#!/bin/bash

# 1. コマンドを送信してコマンドIDを取得(OS情報とカーネルバージョンを取得)
COMMAND_ID=$(aws ssm send-command \
    --document-name "AWS-RunShellScript" \
    --targets "Key=tag:Environment,Values=Production" \
    --parameters 'commands=["echo OS: $(cat /etc/os-release | grep ^PRETTY_NAME | cut -d= -f2); echo Kernel: $(uname -r)"]' \
    --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-RunShellScript" \
    --targets "Key=tag:Environment,Values=Production" \
    --parameters 'commands=["echo OS: $(cat /etc/os-release | grep ^PRETTY_NAME | cut -d= -f2); echo Kernel: $(uname -r)"]' \
    --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: c1525713-49ce-42cb-b6bd-6f09240ca402
Current Status: InProgress      InProgress      InProgress
Command is still running. Waiting for completion...
Current Status: Success Success Success Success Success Success Success
------------------------------------------------------------------------------------------------------------
|                                          ListCommandInvocations                                          |
+---------------------+------------------------------------------------------------------------------------+
|     InstanceId      |                                      Output                                        |
+---------------------+------------------------------------------------------------------------------------+
|  i-0963990f1b1ff0748|  OS: "Amazon Linux 2"
Kernel: 5.10.226-214.879.amzn2.x86_64
                       |
|  i-0870a36d0e949e47e|  OS: "Red Hat Enterprise Linux 9.4 (Plow)"
Kernel: 5.14.0-427.20.1.el9_4.x86_64
   |
|  i-085310d0fe7ae7993|  OS: "Amazon Linux 2023.5.20241001"
Kernel: 6.1.109-118.189.amzn2023.x86_64
       |
|  i-0e25aeb4e96730a45|  OS: "SUSE Linux Enterprise Server 15 SP6"
Kernel: 6.4.0-150600.23.17-default
     |
|  i-0f5c9a9711f2dcf81|  OS: "CentOS Linux 7 (Core)"
Kernel: 3.10.0-1160.76.1.el7.x86_64
                  |
|  i-01c3821e0516d3fa7|  OS: "AlmaLinux 8.7 (Stone Smilodon)"
Kernel: 4.18.0-425.3.1.el8.x86_64
           |
|  i-0e0cfae25958b6d72|  OS: "Ubuntu 24.04.1 LTS"
Kernel: 6.8.0-1016-aws
                                  |
+---------------------+------------------------------------------------------------------------------------+
sh-5.2$

110

成功しました!

まとめ

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

参考資料

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

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

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.