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が使えるので、サーバーに設定せずともログオフせずにいれば毎日勝手にメールを飛ばしてくれるようになりました。
複数アカウント複数リージョンを運用するときに多少マシになるかと思います。