vCPUの上限をチェックするLambdaを作成しました

はじめに

先日、EC2の上限管理方法が各インスタンスタイプの個数ではなく、インスタンスファミリーごとの合計vCPU数となりました。
rioner2525.hatenablog.com
今回はこちらのアップデートに対応するため、vCPUの上限をチェックするLambdaを作りました。

チェック方法①

普通のチェック方法はCloudWatch Alarmを用いてvCPUの閾値に達したらメールを出すといった方法になるかと思います。
アラームの作成は各クォータから簡単に作成できます。
f:id:rioner2525:20191024103555j:plain
作成したアラームにSNSトピックを紐づけるだけで、閾値になったらメール通知するといったチェック方法が簡単に実装できます。
ただし、実際に上限を引き上げた場合はアラームの閾値を手動で変更しなおす必要があるので注意してください。
この方法は多分ベストプラクティスというか、AWSさんが想定しているであろうチェック方法ですね。

チェック方法②

他にもLambdaでチェックする方法があるかなと思い、今回作成したのでコード紹介します。
わざわざLambdaでチェックする意味はあるのか...と考えましたが、とりあえず以下に羅列しておきます。

  • チェックするためのリソースが1つのLambdaで完結できる。
  • ロールを引き受けて複数アカウントを横断してチェックすることも可能。
  • メールやslackなど通知方法や通知内容が柔軟に対応可能。

コード

コードの置き場所はここです。
vCPU-Limit/lambda_function.py at master · rioner/vCPU-Limit · GitHub

軽い解説

やっていることは以下。

  • 1週間のうち最大値のメトリクスを取得する。
  • 現在の制限値と比較する。
  • 上記を各インスタンスファミリーに対して実行する。
  • 閾値を超えていたものがあったら通知する。

今回は1週間のメトリクスで考えました。
運用の想定としては1週間のメトリクスを見て、慢性的にEC2が起動されてきてるなーとなったら上限緩和申請を出す。スパイクで一瞬だけ閾値を超えるぐらいならスルーするといった感じです。
なので、このLambdaを1週間ごとに起動するCloudWatch Ruleに紐づけます。

20~29行目あたり、1時間間隔のメトリクスを取得していますが間隔はなんでもよいです。最大値を取りたいだけなので。
76行目など、関数を読んでいる箇所。引数に 'quotacode' と入れていますが、これは各クォータの実際のクォータコードを入力してください。
f:id:rioner2525:20191024114331j:plain
このクォータコードはリージョンごと?などでアカウントが違っても同じ文字列だと思っていますがビビって公開してません(;^ω^)
その他は特に難しいコードなどもないので問題ないかと思います。
何かしら読者の皆様の参考になれば幸いです。
メール本文は以下のような感じになります。

Running On-Demand Standard (A, C, D, H, I, M, R, T, Z) instances  
現在の制限値:xxxx  
過去1週間の最大値:xx  
上限緩和の検討しましょう。  
CloudWatchメトリクスのURLは以下となります。  
https://ap-northeast-1.console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#metricsV2:graph=~(metrics~(~(~'AWS*2fUsage~'ResourceCount~'Resource~'vCPU~'Service~'EC2~'Type~'Resource~'Class~'Standard*2fOnDemand))~period~300~stat~'Maximum~view~'timeSeries~stacked~false~title~'Running*20On-Demand*20Standard*20*28A*2c*20C*2c*20D*2c*20H*2c*20I*2c*20M*2c*20R*2c*20T*2c*20Z*29*20instances~region~'ap-northeast-1~start~'2019-10-17T03*3a00*3a00.999Z~end~'2019-10-24T02*3a59*3a59.000Z)  

さいごに

サービスクォータのboto3を使ったLambdaをはじめて作成しましたが、制限値はぱっと取れるのですが現在値はぱっと取れないのですね...。
サービスクォータが取ってきているであろうメトリクスの情報が取れますので、今回は現在値については1週間のメトリクスから取ってくる方向にいたしました。
あと、1週間のメトリクスの推移を見るためにURL付けましたがほぼ直打ちなのでアップデートあったら修正が必要です(:3 」∠ )_

(追記2019/11/05)
そういえばインスタンスごとの制限値出てたよな...と思って TrustedAdvisor を見てみたら vCPU の合計数の値が表示されていました...
メトリクスから取ってくる~とか言ってた努力は一体...
ただ TrustedAdvisor ではよく使われる Running On-Demand Standard (A, C, D, H, I, M, R, T, Z) instances だけっぽい?雰囲気なので一応意味はあったと思っておきます!