awscliで複数アカウント全リージョンのメンテナンスイベントを取得する(+cronでメール通知)

AWSでは不定期にメンテナンスがあったりするのですが、普段放置気味のアカウントがあると「本番稼動してるけど気づいたらリブートしてた」なんてことが起こりえます。
すごくアナログな方法ですが、EC2のメンテナンスイベントを確認するときはいつもawscliで以下のようにコマンドを打っていました。

$ aws ec2 describe-instance-status --profile <プロファイル名> --region <リージョン名> --filters Name=event.code,Values=instance-reboot,system-reboot,system-maintenance,instance-retirement,instance-stop | jq -r '.InstanceStatuses[] | "\(.InstanceId), \(.Events[] | .Code), \(.Events[] | .NotBefore), \(.Events[] | .NotAfter)"'

結果はこんな感じで返ってきます。

例)
インスタンスID, イベント, 開始時刻, 終了時刻
i-xxxxxxxx, system-reboot, 2016-XX-XXT02:00:00.000Z, 2016-XX-XXT04:00:00.000Z
i-yyyyyyyy, instance-stop, 2016-XX-XXT08:00:00.000Z, 2016-XX-XXT10:00:00.000Z

これだと1アカウント1リージョンしかずつしか確認できないので複数のAWSアカウントとリージョンを管理している場合、まあまあ辛かったりします。
そこでちょっとでも楽になる方法はないかなということで、どの環境でも入っているであろうシェルスクリプトとcronでまとめてメール通知してみました。

やってみる

参考URL

AWSで全てのリージョンから無駄リソースを抽出するワンライナー – Qiita
AWS CLIコマンドの実行オプション – Qiita

前提

awscliとjqが導入されているものとします。
管理対象のAWSアカウントを設定ファイルに記述しておきます。
A、B、Cの3つのアカウントがあるものとします。
configでデフォルトリージョンの指定をしていますが、シェル内でリージョンを全て確認しますので特に気にしなくてもいいかと思います。

~/.aws/config

[A]
output = json
region = us-west-2
[B]
output = json
region = ap-northeast-1
[C]
output = json
region = us-west-1

~/.aws/credentials

[A]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[B]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[C]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

awsコマンドの所在を確認しておきます。

$ which aws
/usr/local/bin/aws

シェルスクリプト

下記のようなシェルスクリプトを作成しました。
愚直にログファイルにリダイレクトしてますが、お好みで変えてください。

$ vi describe-events.sh
#!/bin/sh

# パス設定
PATH=$PATH:"前項which awsの結果"

# 変数設定
log_file="ログファイルのフルパス"
arr_profile=(A B C)

# リージョンリストの取得
result=`aws ec2 describe-regions --profile A | jq '.Regions | .[].RegionName' | sed -e 's/\"//g'`

# ログファイル初期化
echo "" > $log_file

# 主処理
for profile in ${arr_profile[@]}
do
echo "##############################" >> $log_file
echo "# $profile" >> $log_file
echo "##############################" >> $log_file
        echo "$result" | sed -e 's/\"//g' | while read region
        do
        echo "===== $region" >> $log_file
                aws ec2 describe-instance-status --profile $profile --region $region --filters Name=event.code,Values=instance-reboot,system-reboot,system-maintenance,instance-retirement,instance-stop | jq -r '.InstanceStatuses[] | "\(.InstanceId), \(.Events[] | .Code), \(.Events[] | .NotBefore), \(.Events[] | .NotAfter)"' >> $log_file
        done
echo "" >> $log_file
done

# メール送信
cat $log_file | mail -s "【重要】AWSメンテナンスのお知らせ" hoge@hoge.com

cron設定

$ crontab -e
30 0 * * * /bin/sh <シェルスクリプトのパス>/describe-events.sh

実行結果

下記のようなメールが飛んで来ればOKです。

##############################
# A
##############################
===== ap-south-1
===== eu-west-1
===== ap-southeast-1
===== ap-southeast-2
===== eu-central-1
===== ap-northeast-2
===== ap-northeast-1
i-xxxxxxxx, system-reboot, 2016-XX-XXT02:00:00.000Z, 2016-XX-XXT04:00:00.000Z
i-yyyyyyyy, instance-stop, 2016-XX-XXT08:00:00.000Z, 2016-XX-XXT10:00:00.000Z
===== us-east-1
===== sa-east-1
===== us-west-1
===== us-west-2

##############################
# B
##############################
===== ap-south-1
===== eu-west-1
===== ap-southeast-1
===== ap-southeast-2
===== eu-central-1
===== ap-northeast-2
===== ap-northeast-1
===== us-east-1
===== sa-east-1
===== us-west-1
===== us-west-2

##############################
# C
##############################
===== ap-south-1
===== eu-west-1
===== ap-southeast-1
===== ap-southeast-2
===== eu-central-1
===== ap-northeast-2
===== ap-northeast-1
===== us-east-1
===== sa-east-1
===== us-west-1
===== us-west-2

雑感

クライアントPCにLinuxやMacを使っていればcronが使えるので、サーバーに設定せずともログオフせずにいれば毎日勝手にメールを飛ばしてくれるようになりました。
複数アカウント複数リージョンを運用するときに多少マシになるかと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です