【SSM】SSM Agentが未導入のEC2を調査するスクリプトのご紹介

記事タイトルとURLをコピーする

こんにちは。AWS CLIが好きな福島です。

はじめに

今回ご紹介するスクリプトは、正確には、Managed Nodesとして過去に1度も認識されたことがないEC2を調査するスクリプトになります。

そのため、このスクリプトの実行結果で出力されたEC2は、以下が未対応である可能性を示唆しております。

  • SSM Agentの導入
  • EC2へのSSMのアクセス権限付与

調査方法

調査方法は、以下の通りとなります。

  • ①Managed Nodesの一覧(Node ID)の取得
    ※過去に一度でもManaged Nodesとして認識されたNode IDを抽出します。
  • ②EC2一覧(Nameタグ,InstanceId)の取得
  • ③InstanceIdがManaged Nodesに含まれているかチェック

結論

スクリプトは、以下の通りとなります。

#!/bin/bash

aws ssm get-inventory --query "Entities[].[Id]" --output text > /tmp/awscli.tmp

aws ec2 describe-instances --query "Reservations[].Instances[].[Tags[?Key=='Name'] | [0].Value,InstanceId]" --output text | sort | while read line
do
   name_tag=$(echo $line | awk '{print $1}')
   instance_id=$(echo $line | awk '{print $2}')

   if [[ $(grep $instance_id /tmp/awscli.tmp | wc -l) -eq 0 ]] ; then 
      echo $name_tag $instance_id
   fi
done

rm /tmp/awscli.tmp

解説

スクリプトの処理の解説は、以下の通りです。 ##の箇所に解説を記載しております。

#!/bin/bash

## Managed Nodesの一覧(Node ID)をtmpファイル(/tmp/awscli.tmp)に出力します。
## tmpファイルの中身の例)
## i-xxxxxxxxxxxxx
## i-yyyyyyyyyyyy
aws ssm get-inventory --query "Entities[].[Id]" --output text > /tmp/awscli.tmp

## NameタグとInstanceIdの一覧をwhile readを使い、1行ずつlineという変数に代入していきます。
## また、出力結果を分かりやすくするため、sortコマンドを使い、昇順に並び替えています。
## NameタグとInstanceIdの一覧の例)
## linux-server i-xxxxxxxxxxxxx
## windows-server i-yyyyyyyyyyyy
aws ec2 describe-instances --query "Reservations[].Instances[].[Tags[?Key=='Name'] | [0].Value,InstanceId]" --output text | sort | while read line
do
   ## Nameタグの代入
   ## 例) linux-server
   name_tag=$(echo $line | awk '{print $1}')
   ## InstanceIdの代入
   ## 例) i-xxxxxxxxxxxxx
   instance_id=$(echo $line | awk '{print $2}')

   ## Managed nodesの一覧にinstance_idが含まれているかチェック
   ## 含まれていない場合、echoでNameタグとInstanceIdを出力する。
   if [[ $(grep $instance_id /tmp/awscli.tmp | wc -l) -eq 0 ]] ; then 
      ## 出力例)
      ## linux-server i-xxxxxxxxxxxxx
      echo $name_tag $instance_id
   fi
done

## tmpファイルの削除
rm /tmp/awscli.tmp

いつ認識されたEC2なのか

今回ご紹介したスクリプトは、Managed Nodesとして過去に1度でも認識されたEC2(get-inventory)を基に調査しておりますが、 具体的にいつ認識されたのかが気になるかもしれません。その場合、以下のコマンド(4列目)で確認することができます。

aws ssm get-inventory --query "Entities[].[\
Data.\"AWS:InstanceInformation\".Content[0].ComputerName,\
Id,\
Data.\"AWS:InstanceInformation\".Content[0].IpAddress,\
Data.\"AWS:InstanceInformation\".CaptureTime]" --output text

出力例

fk-test-c1ws-windows.WORKGROUP  i-0653ccf3e3a08c46b     10.88.1.82      2021-10-29T02:34:20Z
ip-10-88-0-59   i-0808672558492fde8     10.88.0.59      2021-11-26T06:01:13Z

各列の値は、以下の通りです。

1列目: ComputerName
2列目: InstanceId
3列目: PrivateIP
4列目: CaptureTime

終わりに

今回は、Managed Nodesとして認識されたことがないEC2を調査するスクリプトをご紹介いたしました。 どなたかのお役に立てれば幸いです。