Sumo LogicでAWS Lambdaの料金を計算する

f:id:pentiotech:20200420115852p:plain こんにちは、Sumo Logic担当の新藤です。

今回はSumo LogicでAWS Lambdaの今月の料金を計算するクエリを書いてみました。AWS Lambdaの料金体系さえ把握してしまえばサクッとクエリを書けてしまう、小ネタです。そんなことを思いつつもこの記事を書きます。

準備するもの

  • AWS LambdaのログがSumo Logicに取得できている状態

AWS Lambdaの料金体系

まず、AWS Lambdaの料金体系からお話しします。AWSの公式ドキュメントの説明がとてもわかりやすいです。 aws.amazon.com

ドキュメントの内容を表にまとめると1ヶ月の料金は、

課金対象 料金(USD)
実行時間 GB-秒あたり 0.0000166667USD
リクエスト数 リクエスト100万件あたり0.20USD

となります。さらにAWS Lambdaには1ヶ月で無料で使用できる範囲が存在し、表にまとめると、

操作 無料枠
実行時間 400,000GB-秒
リクエスト数 1,000,000件

となります。実際のAWS Lambdaのログは以下の通りです。

f:id:cmt_192cm:20200422160509p:plain
AWS Lambdaのログ
AWS Lambdaの料金の計算で用いる変数は「Billed Duration」と「Memory Size」です。リクエスト数はSumo LogicにAWS Lambdaから送信された実行時ログの総数としています。

実際の計算

上記の料金体系を押さえてSumo Logicにてクエリを書くと、

_sourceCategory = Dev/AWS/CloudWatch/Lambda
| json "message"
| _sourceName as logStream
| _sourceHost as logGroup
| parse regex field=message "REPORT\s+RequestId:\s+(?<RequestId>[^\s]+)\s+Duration:\s+(?<Duration>[^\s]+)\s+ms\s+Billed Duration:\s+(?<BilledDuration>[^\s]+)\s+ms\s+Memory\s+Size:\s+(?<MemorySize>[^\s]+)\s+MB\s+Max\s+Memory\s+Used:\s+(?<MaxMemoryUsed>[^\s]+)\s+MB" 
| parse field=loggroup "/aws/lambda/*" as functionName
| count as RequestCount by functionName,BilledDuration,MemorySize

//実行時間による料金
| BilledDuration / 1000 * MemorySize / 1024 as ComputingDuration
| sum(ComputingDuration) as ComputingDurationSum,sum(RequestCount) as RequestCountSum 
| 400000 as freeComputing | 0.00001667 as USDperGB_s //定数の定義
| (ComputingDurationSum - freeComputing) * USDperGB_s as ComputingBilled
| if(ComputingBilled <= 0, 0, ComputingBilled) as ComputingBilled //無料利用枠の値の方が大きかったら料金は0

//リクエスト数による料金
| 1000000 as freeRequest | 0.2 / 1000000 as USDperRequest //定数の定義
| (RequestCountSum - freeRequest) * USDperRequest as RequestCountBilled
| if(RequestCountBilled <= 0, 0, RequestCountBilled) as RequestCountBilled //無料利用枠の値の方が大きかったら料金は0

//合計金額
| ComputingBilled + RequestCountBilled as Billed
| sum(Billed) as Billed


となります。クエリの内容は、前半でログメッセージをパースし、後半で実行時間による料金とリクエスト数による料金を計算し合計しています。

パースする際の正規表現とワイルドカード

ちなみに「parse」オペレータでは正規表現を用いた場合とワイルドカードを用いた場合とで、値の変数への格納の方法が異なります。 例えば正規表現を用いた場合は、上のクエリのように、

| parse regex field=message "REPORT\s+RequestId:\s+(?<RequestId>[^\s]+)\s+Duration:\s+(?<Duration>[^\s]+)\s+ms\s+

というように変数一つずつ個別にキャプチャしていかないと値が変数に格納されません。しかし、ワイルドカードを用いた場合では複数のフィールドを一度にparseできます。例えばLambda関数の階層を「/aws/lambda/team/functionName」とする社内規則があったとしたら以下のようにparseします。

| parse field=loggroup "/aws/lambda/*/*" as team,functionName

ワイルドカードを用いた場合は文末でまとめて変数に格納します。ワイルドカードを用いてparseするのは楽ですが、正規表現を用いてparseするほうが自由度が高くて良いですよね。使い分けていきたいところです。

それはさておき、以上のクエリを書いた上でログメッセージの検索期間をThis MonthにすればSumo Logicにて今月のAWS Lambdaによる料金を知ることができますね。

f:id:cmt_192cm:20200410153707p:plain
ログ検索期間を「This Month」にする

計算結果は以下のように表示することができます。

f:id:cmt_192cm:20200409104827p:plain
AWS Lambdaの料金の計算結果

これをダッシュボードにアップロードすれば操作は終了です。

まとめ

Sumo LogicにてAWS Lambdaの今月の料金をリアルタイムで監視することができるようになりました!