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