特定 EC2 インスタンスがどの Systems Manager 機能を利用しているか一括で確認できるスクリプトを作ってみた

特定 EC2 インスタンスがどの Systems Manager 機能を利用しているか一括で確認できるスクリプトを作ってみた

EC2 インスタンスが利用しているAWS Systems Manager(SSM)の各機能を一括で確認できるスクリプトを作成しました。これでコンソール画面の迷子から解放されます。
2026.04.23

はじめに

クラスメソッドオペレーションズの Shimizu です。

EC2インスタンスの運用において AWS Systems Manager(SSM)での管理はとても便利ですが、パッチマネージャーやセッションマネージャー、Run Command など機能が多岐にわたるため、いくつものコンソール画面を開いて情報を確認するのが大変、というケースも多いのではないでしょうか。

この記事ではそんなお悩みを解決するために、特定の EC2インスタンスがどの Systems Manager 機能を使っているか一括で確認できるシェルスクリプトを作ってみました。以下に、その内容をご紹介します!

img-004

シェルスクリプトの内容と使い方

下記のシェルスクリプト内容をコピーしてテキストファイルに貼り付け、「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 のコンソール にアクセスして「アクション > ファイルのアップロード」をクリックします。

img-001

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

img-002

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

img-003

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

img-004

出力例
======================================================================
 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 機能の利用状況をすばやく調べたい、という時に便利なスクリプトです。
普段はあまりない状況かもしれませんが、サポート問い合わせ時の情報収集などに役立つかと思います。

この記事がお役に立てば幸いです!

参考資料

クラスメソッドオペレーションズ株式会社について

クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。
※2026年1月 アノテーション㈱から社名変更しました

この記事をシェアする

関連記事