AWS Lambdaのメモリ監視
はじめまして、早川です!この4月にJOINしたばかりなので今回が記念すべき初投稿となります。
みなさん、AWSしてますか?サーバーレスしてますか?Lambdaしてますか?
おさらいですが、AWS Lambda(以下、Lambda)はプロビジョニングしておくメモリを128MBから3,008MBまでの間であらかじめ設定するのですが、実行時にこれを超えるメモリを使用した場合は例外が発生してしまいます。このためLambdaを使用する場合にはメモリの使用量を監視する必要がでてくるのですが、残念ながら標準メトリクスにはメモリに関連するものはありません。「Lambda メモリ 監視」でググるといろいろ出てきますが、標準機能だけで簡単にできないかなーと思ったのが今回の投稿のきっかけです。
AWS Lambdaのメモリ使用量
Lambdaを実行するとCloudWatch Logsに以下のような感じでログ出力されます。
1 |
REPORT RequestId: dbeb862f-84d2-466f-b54f-f8671b2dc615 Duration: 1464.68 ms Billed Duration: 1500 ms Memory Size: 128 MB Max Memory Used: 93 MB Init Duration: 157.33 ms |
このように呼び出しごとにREPORT:エントリが作成され、
- Memory Size・・・プロビジョニングされたメモリ容量(これを総メモリ容量と呼びます)
- Max Memory Used・・・実際に使用されたメモリ容量(これをメモリ使用量と呼びます)
ということを表しています。
つまりこのログを何らかの形で取得できればCloudWatchのみの標準機能で監視できるのではないかと考えたわけです。
メトリクスフィルターの作成
まずはじめにログから総メモリ容量とメモリ使用量の値を抽出します。そのためにはCloudWatch Logsのメトリクスフィルターを使用します。
CloudWatch Logsの画面から対象のロググループ(/aws/lambda/関数名)にチェックを入れ、「アクション」から「メトリクスフィルターを作成」を選択します。
次にフィルターパターンを入力するのですが、このフィルターパターンこそが今回のキモとなってきます。
このように[f1=REPORT, …]と入力します。
こうすることで先頭が「REPORT」という文字列となっている行をスペース区切りで抽出することができます。実際のログを使用してこのパターンをテストすると以下のように取得できたことがわかります。
$13が総メモリ容量、$18がメモリ使用章として取得できていることがお判りでしょうか?それでは値を取得するためのフィルター設定をしていきましょう。
メトリクス値に$13と入力することで総メモリ容量が値として取得できます。同様にメモリ使用量も設定するとこのようになっているはずです。
これでLambdaが出力したログからメトリクスフィルターを作成することによって、総メモリ容量およびメモリ使用量の値を取得することができるようになったかと思います。
メトリクスの確認
まずはメトリクスフィルターで設定した値がしっかりと取得できているか確認していきましょう。
メトリクスに値がのってくるのは、メトリクスフィルターを作成した後に出力されたログのみであるということに注意してください。そのため確認するために数回Lambdaを実行しておきます。
CloudWatchのメトリクスの画面から「LambdaMemory」→「ディメンションなしのメトリクス」とたどっていくと設定したメトリクス名で作成されており、これらにチェックを入れると確かに値が取れていました!
アラームの設定
ここまできたらもうできたも同然ですね。
監視ではよくメモリの何%超過したらアラームを飛ばす、ということをすると思います。ここではメモリ使用量が総メモリ容量の90%を超過したらアラームを飛ばすように設定していきます。
先ほどのメトリクスの画面から、「グラフ化したメトリクス」のタブに移り、それぞれ統計を「最大」、期間を「1分」に設定します。
次に数式から「一般」→「パーセンテージ」を選択します。
すると数式が入るのでこれを「100*(m2/m1)」として保存します。(デフォルトでは「100*(m1/m2)」となっているので注意!)
ついでにラベルも「MisoMemoryUseFuncMemoryUsedPercent」としておきました。グラフを見ると、確かにメモリ使用率が計算されていますね。
あとはこの画面のアクションから「アラームの作成」を選択してアラームを作成するだけですね。
おわりに
いかがでしたでしょうか?特に作りこみなども必要なく割と直感的に設定することができたのではないかなーと思います。システムによるかもしれませんが、Lambdaのメモリ監視は入れておきたいなという場合には是非入れてみてください!
(追記)
こちらを書ききったところで2020/10/8付けでAmazon CloudWatch Lambda Insightsがプレビュー版として発表されていました。
これにより今後はAWS側の標準機能でメモリ監視ができるようになっていくとは思いますが、今回のテクニックはメモリ監視だけでなく他にも応用がきくとは思いますので、自分たちのシステムに適用できそうか考えてみてください!
執筆者プロフィール
-
昔も今も新しいものが大好き!
インフラからアプリまで縦横無尽にトータルサポートや新技術の探求を行っています。
週末はときどきキャンプ場に出没します。