COMPANY SERVICE STAFF BLOG NEWS CONTACT
2025.09.10

複数の EC2 インスタンスからバージョン情報などを一括取得する方法

テクログaws

複数の EC2 インスタンスを管理していると OS などのバージョン情報などを確認する機会が多いと思います。

その都度サーバーに接続して情報を取得すると時間がかかってしまうため、AWS サービスの Lambda + SSM を用いて一括で情報を取得する方法をご紹介いたします。

前提条件

・EC2 インスタンス内に ssm-agent がインストール済みであること
・EC2 インスタンスのインスタンスプロファイルに IAM ポリシー AmazonSSMManagedInstanceCore がアタッチされていること

実装イメージ

Lambda 関数を作成

ランタイムは Python 3.13 で用意しました。

ソースコードは下記になります。

対象の EC2 インスタンスを取得

ssm-agent との疎通がオンラインの EC2 インスタンスのみを対象に取得します。

ssm = boto3.client('ssm')
target_instances: list = []

paginator = ssm.get_paginator('describe_instance_information')
pages = paginator.paginate()

for page in pages:
    for instance in page['InstanceInformationList']:
        is_online = 'Online' in instance['PingStatus']
        is_type = 'EC2::Instance' in instance['SourceType']
        if is_online and is_type:
            target_instances.append(instance['InstanceId'])

対象 EC2 インスタンスにコマンドを一括送信

今回は OS バージョンを取得する想定となります。
注意点として一括で送信可能な EC2 インスタンスの台数は50台までなので、超える場合は分割する必要があります。

# 送信するコマンド
OS_VERSION_COMMAND: str = r"""
if [ -f /etc/os-release ]; then
    grep '^PRETTY_NAME=' /etc/os-release | cut -d= -f2 | sed "s/\"//g"
elif [ -f /etc/redhat-release ]; then
    cat /etc/redhat-release
elif [ -f /etc/system-release ]; then
    cat /etc/system-release
else
    echo "-"
fi
"""

# 複数コマンドを送信することが可能
commands = [OS_VERSION_COMMAND]

# 配列データを渡すことで複数 EC2 インスタンスに一括送信が可能
res = ssm.send_command(
    InstanceIds=target_instances,
    DocumentName="AWS-RunShellScript",
    Parameters={
        "commands": commands,
        "executionTimeout": [
            "3000"
        ]
    },
)
command_id: str = res.get('Command', {}).get('CommandId')

for instance_id in target_instances:
    waiter = ssm.get_waiter('command_executed')
    waiter_config: dict = {
        'Delay': 1,
        'MaxAttempts': 10
    }
    # コマンド実行を待機
    waiter.wait(
        InstanceId=instance_id,
        CommandId=command_id,
        WaiterConfig=waiter_config
    )

    # 実行結果を取得
    command_result: dict = ssm.get_command_invocation(
        InstanceId=instance_id,
        CommandId=command_id
    )
    print(command_result["StandardOutputContent"])

実行結果

実行すると下記のように OS のバージョンが出力されます。

Amazon Linux 2

AlmaLinux 9.6 (Sage Margay)

:

まとめ

上記の構成で複数 EC2 インスタンスに所定のコマンドを実行してその結果を表示することができました。

今回は標準出力をしているだけなので、Google スプレッドシートなどと連携して出力ができるようになるとリソースやバージョンの管理がより楽になると思います。

この記事を書いた人

NOA

入社年
2024年
出身地
三重県
業務内容
SRE
特技・趣味
ゲーム・カラオケ・数独パズル

テクログに関する記事一覧