AWS CLI と SSM を利用して Linux EC2 インスタンスの OS 情報とカーネルバージョンを一括取得してみた
はじめに
テクニカルサポートの 片方 です。
kernel バージョンの調査としては EC2 のマネジメントコンソール画面よりシステムログを確認する方法などがございますが、一つ一つ確認するのは手間ですね。
そのため、AWS CLI と SSM の一機能である Run Command を利用して Linux EC2 インスタンスの OS 情報と kernel バージョンを一括取得してみました。
前提条件
本ブログで紹介する方法では、取得対象の Linux EC2 インスタンスに以下の条件が必須です。
- マネージドノードとして登録済み : Run Command を実行するため
- タグが付与されている : タグを利用して対象リソースを絞るため(例: Key=Environment, Values=Production)
やってみた
各種 Linux OS で取得可能であるかの検証も兼ねて、以下をマネージドノード登録されるように起動しました。
- Amazon Linux2
- Amazon Linux2023
- AlmaLinux
- Red Hat Enterprise Linux
- Ubuntu
- SLES(SUSE)
- CentOS Linux
AWS CLI コマンド実行元 EC2 インスタンスを除く 7 台に対してタグを付与しました。
Key=Environment , Values=Production
これで準備は完了です。
以下の作成したスクリプトでは、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$
成功しました!
まとめ
古い kernel バージョンをご利用の場合、何らかの不具合が発生するといった事例もございます。
棚卸しも兼ねて、定期的に確認することをお勧めします。
本ブログが誰かの参考になれば幸いです。
参考資料
- AWS Systems Manager Run Command - AWS Systems Manager
- EC2 インスタンスでの Systems Manager の利用 - AWS Systems Manager
- Amazon EC2 リソースのタグの追加と削除 - Amazon Elastic Compute Cloud
- send-command — AWS CLI 2.18.4 Command Reference
アノテーション株式会社について
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。