はじめに
この記事ではCloudWatchアラームが設定されたインスタンスIDとアラーム名をセットで出力するスクリプトを紹介します。
以前の記事ではEC2のAutoRecovery(自動復旧)を無効化するスクリプトを使用してインスタンスIDのリストを取得しましたが、CloudWatchアラームによるAutoRecoveryが設定されていないインスタンスIDも含まれてしまっています。
本当に無効化しても問題ないのか各インスタンスに対してCloudWatchアラームが設定されているか確認する必要があるのですが、膨大な数のインスタンスが存在する環境の場合、手作業での確認は非効率です。
そんな感じでリスト出力できると確認が楽になるだろうなぁと思って作成しました。
前回の記事はこちらになります。
目次
実行環境
検証用に3つのCloudWatchアラームを作成しました。
今回はCloudWatchアラーム名と、アラームに紐づいたインスタンスIDを出力するだけなのでアラームを設定するメトリクスはEC2に関するものでしたら何でも構いません。
用意した3つのアラームの詳細を確認してみます。
稼働確認
以下のスクリプトをCloudShell内で実行し、リストを作成します。
リストには先ほど確認したCloudWatchアラーム名とアラームが設定されたインスタンスIDがcsv形式で出力されます。
(CloudShellに限らず、EC2内やシェルスクリプトが実行可能な環境でしたら問題ありません。)
#!bin/bash
CloudWatchAlarmList="Alarm-List.tmp"
Output="Alarm-InstanceList.csv"
echo "AlarmName,InstanceName" > $Output
aws cloudwatch describe-alarms --query "MetricAlarms[*].[AlarmName]" --output text >> $CloudWatchAlarmList
cat $CloudWatchAlarmList | while read AlarmName
do
#アラームが設定されたインスタンスIDを取得
read InstanceName < <(aws cloudwatch describe-alarms --alarm-names $AlarmName --query "MetricAlarms[*].Dimensions[?Name=='InstanceId'].Value" --output text )
echo "$AlarmName,$InstanceName" >> $Output
done
rm $CloudWatchAlarmList
早速スクリプトを実行してみます。
「Alarm-InstanceList.csv」というファイルが出力されました。
作成したCloudWatchアラーム名とインスタンスIDがセットで取得できました!!
おわりに
CloudShell内でスクリプトを実行することが多いのですが、動きがもっさりしてて重いなぁって思ってます
インスタンス数が非常に多く、リスト作成に時間がかかりそうな場合はスペックが少し高めのEC2内で実行したほうがいいかもしれません。※未検証なので間違ってたらすみません。スクリプトを修正してループを減らすとか内部の実行回数減らすとかしたほうが早いと思いますが。。。
CLIを使ったJsonの取得記事ばっか書いてますが、まだまだqueryをうまく使いこなせていないので頑張って上達します。。。