2016/1/14
現在、AWS Lambdaにはなんとリージョン毎!にアップロードできるパッケージの合計サイズがたったの1.5GBという悲しい制限があります。特にlibraryを同包したり、versioningを使ったりしてCIをガンガン回してると、結構すぐこの上限に達してしまいがちです。そこで、Lambdaの総容量はAWSコンソール上には表示されるものの、トラッキングし辛いので監視する仕組みを作ってみました。
仕組み
LambdaのScheduled Eventsを使って、ListFunctions
とListVersionsByFunction
APIを叩いて、個別functionのCodeSize
をサマって、PutMetricData
でCloudWatchに投げて、Alarm設定してるだけ。
(*) 2016/1/26
追記:@marcy_teruiさんからのご指摘でVersionsの容量計算が抜けてました。ありがとうございます。
といっても、今後別アカウントでいちいち設定(IAM role&policy、Lambda、SNS、CloudWatch)するのも非常に面倒くさいので、今回はCloudFormation Designerを使って、ほぼ一発で環境を再現できるようにしました。
CloudFormation
Stack Creation
Designerではこんな感じ。心なしか、jsonの苦痛が多少楽になったような。。後、Propertyの補完機能は良いけどショートカットがCmd+Space
なのでSpotlightさんがぁ。
s3からtemplateを指定。
template urlはhttps://s3-ap-northeast-1.amazonaws.com/ijin/aws/lambda/check_lambda_capacity/check_lambda_capacity.template
Parameterとしては以下が指定可能
- アラート閾値(Byte単位)
- SNS topic(空の場合は、自動作成される)
Stackを作成すると、諸々のリソースが数分で出来上がり。
Manual Labor
本当は以上で終了!にしたいところですが、LambdaのScheduled Eventsの設定はAWSコンソールからのみしか出来ないという情けない残念な状態(2016/1/14
現在)なので、ここからポチポチ設定作業。。(API重視の開発姿勢はどこ行ったんだろう)
(*) 2016/1/26
追記:この記事の翌日に発表された CloudWatch Events
の scheduling
機能 によって出来るようになりました。なんというタイミング。
最小頻度が5分毎
Graph
これで、グラフが取れて閾値を超えたらアラートが飛ぶようになる
Code
出来上がったCloudFormation templateコードはこちら。AWS::Lambda::Function
がlambdaのresource担当だけど、templateにfunctionをインラインで埋め込めるのは現時点ではnodejs
のみなので仕方なくzipしたpythonコードをs3にアップして参照するようにしてる。
元気があれば、そのうちnode版も書こうかな。。
GitHubのリポジトリはこちらから。