特定 EC2 インスタンスがどの Systems Manager 機能を利用しているか一括で確認できるスクリプトを作ってみた
はじめに
クラスメソッドオペレーションズの Shimizu です。
EC2インスタンスの運用において AWS Systems Manager(SSM)での管理はとても便利ですが、パッチマネージャーやセッションマネージャー、Run Command など機能が多岐にわたるため、いくつものコンソール画面を開いて情報を確認するのが大変、というケースも多いのではないでしょうか。
この記事ではそんなお悩みを解決するために、特定の EC2インスタンスがどの Systems Manager 機能を使っているか一括で確認できるシェルスクリプトを作ってみました。以下に、その内容をご紹介します!

シェルスクリプトの内容と使い方
下記のシェルスクリプト内容をコピーしてテキストファイルに貼り付け、「check-ssm-features.sh」という名前で保存して使用します。AWS CLI がインストールされた PC 端末、もしくは AWS CloudShell 上で実行可能です。
実行例
sh ./check-ssm-features.sh i-xxxxxxx ap-northeast-1
シェルスクリプト内容はこちら
#!/bin/bash
#
# check-ssm-features.sh
# 指定した EC2 インスタンスがどの Systems Manager 機能を使用しているか一括確認するスクリプト
#
# 使い方:
# sh ./check-ssm-features.sh <instance-id> [region]
#
# 例:
# sh ./check-ssm-features.sh i-0123456789 ap-northeast-1
#
# 注意点:
# 本スクリプトは API で取得可能な範囲の確認です。
# タグベースの Maintenance Window ターゲットや Automation の実行履歴等は別途確認が必要です。
set -euo pipefail
INSTANCE_ID="${1:?インスタンスIDを指定してください(例: i-0123456789)}"
REGION="${2:-ap-northeast-1}"
AWS_CMD="aws"
SEPARATOR="$(printf '=%.0s' {1..70})"
FOUND_FEATURES=()
echo "${SEPARATOR}"
echo " Systems Manager 機能利用状況チェック"
echo " インスタンス: ${INSTANCE_ID}"
echo " リージョン: ${REGION}"
echo " 実行日時: $(date '+%Y-%m-%d %H:%M:%S')"
echo "${SEPARATOR}"
echo ""
# --- 1. マネージドノード情報 ---
echo "【1. マネージドノード情報 (describe-instance-information)】"
INSTANCE_INFO=$(${AWS_CMD} ssm describe-instance-information \
--filters "Key=InstanceIds,Values=${INSTANCE_ID}" \
--region "${REGION}" \
--output json 2>&1) || true
INSTANCE_COUNT=$(echo "${INSTANCE_INFO}" | jq -r '.InstanceInformationList | length' 2>/dev/null || echo "0")
if [[ "${INSTANCE_COUNT}" -gt 0 ]]; then
echo " ✅ SSM マネージドノードとして登録済み"
echo "${INSTANCE_INFO}" | jq -r '.InstanceInformationList[] | " - AgentVersion: \(.AgentVersion // "N/A")\n - PingStatus: \(.PingStatus // "N/A")\n - LastPingTime: \(.LastPingDateTime // "N/A")\n - PlatformName: \(.PlatformName // "N/A")\n - PlatformVersion: \(.PlatformVersion // "N/A")\n - IPAddress: \(.IPAddress // "N/A")\n - AssociationStatus: \(.AssociationStatus // "N/A")"'
FOUND_FEATURES+=("SSM Agent")
else
echo " ❌ SSM マネージドノードとして登録されていません"
echo ""
echo "※ SSM Agent が未インストールまたは未起動の可能性があります。"
echo " 以降のチェックは正確な結果を返さない場合があります。"
fi
echo ""
# --- 2. State Manager (Association) ---
echo "【2. State Manager - Association】"
ASSOCIATIONS=$(${AWS_CMD} ssm describe-instance-associations-status \
--instance-id "${INSTANCE_ID}" \
--region "${REGION}" \
--output json 2>&1) || true
ASSOC_COUNT=$(echo "${ASSOCIATIONS}" | jq -r '.InstanceAssociationStatusInfos | length' 2>/dev/null || echo "0")
if [[ "${ASSOC_COUNT}" -gt 0 ]]; then
echo " ✅ ${ASSOC_COUNT} 件の Association が設定されています"
echo "${ASSOCIATIONS}" | jq -r '.InstanceAssociationStatusInfos[] | " - Name: \(.Name // "N/A") | AssociationId: \(.AssociationId // "N/A") | Status: \(.Status // "N/A") | AssociationName: \(.AssociationName // "なし")"'
FOUND_FEATURES+=("State Manager")
else
echo " ➖ Association は設定されていません"
fi
echo ""
# --- 3. Run Command 実行履歴 ---
echo "【3. Run Command - 実行履歴(直近5件)】"
COMMANDS=$(${AWS_CMD} ssm list-commands \
--instance-id "${INSTANCE_ID}" \
--max-results 5 \
--region "${REGION}" \
--output json 2>&1) || true
CMD_COUNT=$(echo "${COMMANDS}" | jq -r '.Commands | length' 2>/dev/null || echo "0")
if [[ "${CMD_COUNT}" -gt 0 ]]; then
echo " ✅ ${CMD_COUNT} 件のコマンド実行履歴があります"
echo "${COMMANDS}" | jq -r '.Commands[] | " - CommandId: \(.CommandId) | Document: \(.DocumentName) | Status: \(.Status) | RequestedAt: \(.RequestedDateTime)"'
FOUND_FEATURES+=("Run Command")
else
echo " ➖ コマンド実行履歴はありません"
fi
echo ""
# --- 4. Patch Manager / コンプライアンス ---
echo "【4. Patch Manager / コンプライアンス】"
COMPLIANCE=$(${AWS_CMD} ssm list-compliance-items \
--resource-ids "${INSTANCE_ID}" \
--resource-types "ManagedInstance" \
--region "${REGION}" \
--output json 2>&1) || true
COMP_COUNT=$(echo "${COMPLIANCE}" | jq -r '.ComplianceItems | length' 2>/dev/null || echo "0")
if [[ "${COMP_COUNT}" -gt 0 ]]; then
echo " ✅ ${COMP_COUNT} 件のコンプライアンスアイテムがあります"
echo ""
echo " タイプ別集計:"
echo "${COMPLIANCE}" | jq -r '[.ComplianceItems[].ComplianceType] | group_by(.) | .[] | " - \(.[0]): \(length) 件"'
echo ""
echo " ステータス別集計:"
echo "${COMPLIANCE}" | jq -r '[.ComplianceItems[].Status] | group_by(.) | .[] | " - \(.[0]): \(length) 件"'
FOUND_FEATURES+=("Patch Manager/Compliance")
else
echo " ➖ コンプライアンスアイテムはありません"
fi
echo ""
# --- 5. Inventory ---
echo "【5. Inventory(収集データ)】"
INVENTORY=$(${AWS_CMD} ssm get-inventory \
--filters "Key=AWS:InstanceInformation.InstanceId,Values=${INSTANCE_ID},Type=Equal" \
--region "${REGION}" \
--output json 2>&1) || true
INV_COUNT=$(echo "${INVENTORY}" | jq -r '.Entities | length' 2>/dev/null || echo "0")
if [[ "${INV_COUNT}" -gt 0 ]]; then
echo " ✅ インベントリデータが収集されています"
INV_SCHEMAS=$(${AWS_CMD} ssm list-inventory-entries \
--instance-id "${INSTANCE_ID}" \
--type-name "AWS:Application" \
--region "${REGION}" \
--output json 2>&1) || true
APP_COUNT=$(echo "${INV_SCHEMAS}" | jq -r '.Entries | length' 2>/dev/null || echo "0")
echo " - AWS:Application エントリ数: ${APP_COUNT}"
for INV_TYPE in "AWS:Network" "AWS:WindowsUpdate" "AWS:AWSComponent"; do
TYPE_RESULT=$(${AWS_CMD} ssm list-inventory-entries \
--instance-id "${INSTANCE_ID}" \
--type-name "${INV_TYPE}" \
--region "${REGION}" \
--output json 2>&1) || true
TYPE_COUNT=$(echo "${TYPE_RESULT}" | jq -r '.Entries | length' 2>/dev/null || echo "0")
echo " - ${INV_TYPE} エントリ数: ${TYPE_COUNT}"
done
FOUND_FEATURES+=("Inventory")
else
echo " ➖ インベントリデータは収集されていません"
fi
echo ""
# --- 6. Session Manager ---
echo "【6. Session Manager - セッション履歴(直近10件)】"
SESSIONS=$(${AWS_CMD} ssm describe-sessions \
--state History \
--filters "key=Target,value=${INSTANCE_ID}" \
--max-results 10 \
--region "${REGION}" \
--output json 2>&1) || true
SESSION_COUNT=$(echo "${SESSIONS}" | jq -r '.Sessions | length' 2>/dev/null || echo "0")
if [[ "${SESSION_COUNT}" -gt 0 ]]; then
echo " ✅ ${SESSION_COUNT} 件のセッション履歴があります"
echo "${SESSIONS}" | jq -r '.Sessions[] | " - SessionId: \(.SessionId) | Owner: \(.Owner // "N/A") | StartDate: \(.StartDate) | EndDate: \(.EndDate // "継続中")"'
FOUND_FEATURES+=("Session Manager")
else
echo " ➖ セッション履歴はありません"
fi
echo ""
# --- 7. Maintenance Window ---
echo "【7. Maintenance Window】"
MW_LIST=$(${AWS_CMD} ssm describe-maintenance-windows \
--region "${REGION}" \
--output json 2>&1) || true
MW_COUNT=$(echo "${MW_LIST}" | jq -r '.WindowIdentities | length' 2>/dev/null || echo "0")
MW_MATCHED=0
if [[ "${MW_COUNT}" -gt 0 ]]; then
for MW_ID in $(echo "${MW_LIST}" | jq -r '.WindowIdentities[].WindowId'); do
TARGETS=$(${AWS_CMD} ssm describe-maintenance-window-targets \
--window-id "${MW_ID}" \
--region "${REGION}" \
--output json 2>&1) || true
if echo "${TARGETS}" | jq -e ".Targets[] | select(.Targets[]? | select(.Key==\"InstanceIds\" and (.Values[]? == \"${INSTANCE_ID}\")))" > /dev/null 2>&1; then
MW_NAME=$(echo "${MW_LIST}" | jq -r ".WindowIdentities[] | select(.WindowId==\"${MW_ID}\") | .Name")
echo " ✅ Maintenance Window に含まれています: ${MW_NAME} (${MW_ID})"
MW_MATCHED=$((MW_MATCHED + 1))
fi
TAG_TARGETS=$(echo "${TARGETS}" | jq -r '.Targets[] | select(.Targets[]? | select(.Key | startswith("tag:")))' 2>/dev/null || true)
if [[ -n "${TAG_TARGETS}" ]]; then
MW_NAME=$(echo "${MW_LIST}" | jq -r ".WindowIdentities[] | select(.WindowId==\"${MW_ID}\") | .Name")
echo " ℹ️ タグベースのターゲットあり: ${MW_NAME} (${MW_ID}) ※インスタンスのタグと照合が必要"
fi
done
if [[ "${MW_MATCHED}" -gt 0 ]]; then
FOUND_FEATURES+=("Maintenance Window")
else
echo " ➖ InstanceId 直接指定の Maintenance Window ターゲットには含まれていません"
echo " ※タグベースのターゲットは手動確認が必要です"
fi
else
echo " ➖ Maintenance Window が定義されていません"
fi
echo ""
# --- 8. Distributor ---
echo "【8. Distributor - パッケージインストール履歴】"
DISTRIBUTOR=$(${AWS_CMD} ssm list-commands \
--instance-id "${INSTANCE_ID}" \
--filters "key=DocumentName,value=AWS-ConfigureAWSPackage" \
--max-results 10 \
--region "${REGION}" \
--output json 2>&1) || true
DIST_COUNT=$(echo "${DISTRIBUTOR}" | jq -r '.Commands | length' 2>/dev/null || echo "0")
if [[ "${DIST_COUNT}" -gt 0 ]]; then
echo " ✅ ${DIST_COUNT} 件の Distributor パッケージ配布履歴があります"
echo "${DISTRIBUTOR}" | jq -r '.Commands[] | " - CommandId: \(.CommandId) | Status: \(.Status) | RequestedAt: \(.RequestedDateTime)"'
FOUND_FEATURES+=("Distributor")
else
echo " ➖ Distributor パッケージ配布履歴はありません"
fi
echo ""
# --- サマリー ---
echo "${SEPARATOR}"
echo " サマリー"
echo "${SEPARATOR}"
if [[ ${#FOUND_FEATURES[@]} -gt 0 ]]; then
echo ""
echo " 利用が確認された SSM 機能:"
for feature in "${FOUND_FEATURES[@]}"; do
echo " ✅ ${feature}"
done
else
echo ""
echo " 利用が確認された SSM 機能はありませんでした。"
fi
echo ""
echo "${SEPARATOR}"
実行すると、指定した EC2 インスタンスのマネージドノードの登録有無やパッチマネージャー、セッションマネージャー、Run Command の実行履歴などをチェックします。
(ただしメンテナンスウィンドウや SSM オートメーションなど、ターゲットをインスタンスタグで指定している場合は取得できないものもあります)
なお前提条件として、PC 端末の AWS CLI から実行する場合は、対象アカウントの Systems Manager サービスを参照する権限(AmazonSSMReadOnlyAccess に相当する権限)が付与されている必要があります。
やってみた
AWS の CloudShell から、スクリプトを実行してみました。
前準備としてマネージドノード登録し、複数の Systems Manager サービスを利用したテストインスタンスを用意しています。
まず CloudShell のコンソール にアクセスして「アクション > ファイルのアップロード」をクリックします。

端末に保存しておいたスクリプトファイル「check-ssm-features.sh」をアップロードします。

対象のインスタンス ID を指定して、スクリプトを実行します。

しばらく待つと、対象インスタンスがどの SSM サービスを利用しているかと、コマンド履歴の ID などまで特定してくれました!

======================================================================
Systems Manager 機能利用状況チェック
インスタンス: i-05426715dd697aa1a
リージョン: ap-northeast-1
実行日時: 2026-04-23 09:46:04
======================================================================
【1. マネージドノード情報 (describe-instance-information)】
✅ SSM マネージドノードとして登録済み
- AgentVersion: 3.3.4177.0
- PingStatus: Online
- LastPingTime: 2026-04-23T09:45:16.035000+09:00
- PlatformName: Amazon Linux
- PlatformVersion: 2023
- IPAddress: 172.31.2.151
- AssociationStatus: Success
【2. State Manager - Association】
✅ 2 件の Association が設定されています
- Name: AWS-GatherSoftwareInventory | AssociationId: 954a2532 | Status: Success | AssociationName: ssm-feature-test-inventory
- Name: AWS-GatherSoftwareInventory | AssociationId: a14cf247 | Status: Skipped | AssociationName: InspectorInventoryCollection-do-not-delete
【3. Run Command - 実行履歴(直近5件)】
✅ 2 件のコマンド実行履歴があります
- CommandId: d348df09-d6bb | Document: AmazonInspector2-InvokeInspectorSsmPlugin | Status: Failed | RequestedAt: 2026-04-23T09:41:12.575000+09:00
- CommandId: e54ae04f-27c9 | Document: AmazonInspector2-ConfigureInspectorSsmPlugin | Status: Failed | RequestedAt: 2026-04-23T09:41:04.103000+09:00
【4. Patch Manager / コンプライアンス】
✅ 500 件のコンプライアンスアイテムがあります
タイプ別集計:
- Association: 9 件
- Patch: 491 件
ステータス別集計:
- COMPLIANT: 500 件
【5. Inventory(収集データ)】
✅ インベントリデータが収集されています
- AWS:Application エントリ数: 50
- AWS:Network エントリ数: 1
- AWS:WindowsUpdate エントリ数: 0
- AWS:AWSComponent エントリ数: 2
【6. Session Manager - セッション履歴(直近10件)】
✅ 1 件のセッション履歴があります
- SessionId: 1776904859-2exkzos | Owner: arn:aws:sts::assumed-role/cm-shimizu/177690 | StartDate: 2026-04-23T09:41:00.688000+09:00 | EndDate: 2026-04-23T09:41:05.275000+09:00
【7. Maintenance Window】
✅ Maintenance Window に含まれています: ssm-feature-test-mw (mw-09c0df15d848)
✅ Maintenance Window に含まれています: ssm-feature-test-mw (mw-0d3ad54e2e79)
【8. Distributor - パッケージインストール履歴】
✅ 1 件の Distributor パッケージ配布履歴があります
- CommandId: ef584642-eeef | Status: Success | RequestedAt: 2026-04-23T09:40:20.771000+09:00
======================================================================
サマリー
======================================================================
利用が確認された SSM 機能:
✅ SSM Agent
✅ State Manager
✅ Run Command
✅ Patch Manager/Compliance
✅ Inventory
✅ Session Manager
✅ Maintenance Window
✅ Distributor
======================================================================
今回試した内容は以上です。
さいごに
いかがでしたでしょうか。
Systems Manager の操作のために AWS コンソールの色々なページをさまようことなく、各 SSM 機能の利用状況をすばやく調べたい、という時に便利なスクリプトです。
普段はあまりない状況かもしれませんが、サポート問い合わせ時の情報収集などに役立つかと思います。
この記事がお役に立てば幸いです!
参考資料
- SSM Agent の使用 - AWS Systems Manager
- AWS Systems Manager State Manager - AWS Systems Manager
- Systems Manager でのアソシエーションの使用 - AWS Systems Manager
- AWS Systems Manager Run Command - AWS Systems Manager
- AWS Systems Manager パッチマネージャー - AWS Systems Manager
- パッチコンプライアンスレポートの使用 - AWS Systems Manager
- AWS Systems Manager セッションマネージャー - AWS Systems Manager
- Distributor パッケージの使用 - AWS Systems Manager
クラスメソッドオペレーションズ株式会社について
クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。
※2026年1月 アノテーション㈱から社名変更しました







