こんにちは。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を調査するスクリプトをご紹介いたしました。 どなたかのお役に立てれば幸いです。