AWS LambdaのPricingを読み解く


#はじめに
AWS Lambdaの課金体系はこれまでのAWSサービスとくらべて少しユニークなものとなっています。というわけで今回はネタハック的な内容ではなく、その料金に関して詳しく見ていきます。決してネタ切れとかではございません。

なお、本投稿は2014年12月18日時点の公開情報に基づいて個人でまとめたものであり、所属する企業や団体における公式見解ならびに公式発表ではございません。

#基本

まず、以下の2つがLambda利用時における課金対象となっています。

- Lambdaファンクションのリクエスト数
- Lambdaファンクションの実行時間

リクエスト数とはイベントが発生してLambdaファンクションが起動される回数のことです。実行時間とはLambdaファンクションが起動してから終了するまでの時間となっています。
リクエスト数に関しては割りとシンプルな課金体系となっていて100万リクエストあたり$0.2となっています。実行時間および無料枠に関してはこの後で説明します。

#実行時間の価格表
以下の表は[料金表](http://aws.amazon.com/jp/lambda/pricing/)のページに記載のものを転記したものです。

|メモリ(MB)|1か月の無料利用枠の秒数|100ミリ秒単位の価格(ドル)|
|:-:|--:|--:|
|128|3200000|0.000000208|
|192|2133333|0.000000313|
|256|1600000|0.000000417|
|320|1280000|0.000000521|
|384|1066667|0.000000625|
|448|914286|0.000000729|
|512|800000|0.000000834|
|576|711111|0.000000938|
|640|640000|0.000001042|
|704|581818|0.000001146|
|768|533333|0.000001250|
|832|492308|0.000001354|
|896|457143|0.000001459|
|960|426667|0.000001563|
|1024|400000|0.000001667|


まず、 **非常に大事なことですがこの表における価格はおおよその価格になります。**あくまでも **おおよその価格**です。大事なことなので2回言いました。理由は後ほど説明します。

上記のようにLambdaファンクションに設定可能なメモリ量に応じて価格が変動します。メモリは最小128MBであり、64MB単位で設定することが可能で、最大で1024MB=1GBとなっています。最大の特徴はやはり100ミリ秒あたりとなっていることで、他のサービスと異なってかなり粒度が細かくなっています。これはLambdaはあくまでもイベントドリブンの関数実行であり、従来の長時間のバッチ処理の代替ではないということを表しているとも言えます。
また、メモリ容量に応じて単価が異なるだけでなく、CPU能力やIO能力も異なってきます。メモリ量を多く設定するとこれらの能力もあがるということですね。この辺りの話からLambdaの裏側に関して何かピンときた人がいるかもしれませんが大人の対応をお願いします。
なお、100ミリ秒以下の実行時間の場合、100ミリ秒に切り上げられます。


**ここからがすごく大事なところです。**

勘違いしやすいのですが **単価としては1GBのファンクションを1秒間実行するにあたり$0.00001667**ということです。つまり512MBのメモリ設定で1秒動かした場合は512/1024=0.5ということで$0.00001667 * 0.5 = $0.000008335となります。上記の表ではさらにミリ秒にしていますので10で割り算する必要があります。従って正確な値は$0.0000008335です。上記の表では$0.000000834となっていて四捨五入されています。これがおおよその価格であると述べた理由です。
そして、金額を計算する際は1GB、1秒あたりに換算して算出する必要があるということです。決してこの表の単価を元に計算してはいけません。何度もいいますがこの表の単価はおおよその価格です。

#無料枠

その他のサービスと同様にLambdaにも無料枠が存在します。リクエスト数と実行時間それぞれで無料の範囲が定められています。リクエスト数のほうは月間100万リクエストまでは無料となっていますが、問題は実行時間の無料枠です。こちらは前出の表の通り単価と同様にメモリの容量ごとに利用可能な無料枠が変動する設定となっています。
こちらについても単価と同様、1GBのファンクションが基準です。つまり、1GBのファンクションが40万秒まで無料で実行できるということです。従って仮に128MBのファンクションであれば、40万秒 * 1024/128(=8)の320万秒が無料枠となります。
320万秒ということは時間になおすと888.88888...時間ですのでおよそ889時間分くらいは無料で利用可能です。EC2のt2.microを使った場合の無料枠が月間750時間（ただし最初の一年のみ）なので、スペックの違いがあるので単純比較はできないものの1インスタンスを1ヶ月立ち上げっぱなしにする以上の時間数が無料枠として利用できます。

また、もう一つの特徴としてt2.microとは異なり無料枠が最初の一年間だけということはなく、現時点では既存ユーザも新規ユーザも無期限にこの無料枠は適用され続けます。

#料金の計算例
というわけで料金の計算例を何パターンか示してみます。
面倒なので本家と同じパターンで自分なりに解釈してみます。なお、全て小数点第二位で四捨五入をしています。

###計算例1：512MBのメモリを割り当て、3,000,000回実行し、毎回の実行時間が1秒間だった場合

まず、毎回の実行時間が1秒なので総実行時間は300万秒になりますね。
次にファンクションのメモリが512MBと基準となる1GBの半分です。従って単価は半分になりますが、一方で無料利用枠は倍になります。従ってこの場合は以下のような計算になります。

課金対象の実行時間：300万秒 - 80万秒(40万秒 * 2) = 220万秒
実行時間に対する課金額：$0.00001667 * 0.5(512/1024) * 220万秒 = $18.34

リクエストに対する課金額は無料枠超過分が200万回で$0.2/100万回なので$0.4となります。
従ってこの場合の課金額は以下のようになります。

**$18.34 + $0.4 = $18.74**

###計算例2：128MBのメモリ量を割り当てて30,000,000回実行し、毎回の実行時間が200ミリ秒間だった場合

これも基本的には計算例1と同じように計算します。まず、一回あたりの実行時間が200ミリ秒、つまり0.2秒ですので総実行時間としては3000万回×0.2秒で600万秒です。今回はファンクションに割り当てたメモリが128MBと基準となる1GBの8分の1ですので無料枠は8倍となります。従って課金対象の実行時間は、

課金対象の実行時間：(3000万回 * 0.2) - (40万秒 * 8) = 600万秒 - 320万秒 = 280万秒

となり、課金額は

実行時間に対する課金額：$0.00001667 * 0.125(128/1024) * 280万秒 = $5.83

となります。
リクエストに対する課金は無料超過分が2900万回となるので$0.2 * 29で$5.8となります。
つまり、この場合の課金額は、

**$5.83 + $5.8 = $11.63**

###計算例3：異なるメモリ量で関数を実行した場合

最後は複雑なパターンですが、実際はこうなることのほうが多いのではないでしょうか。
複数のLambdaファンクションを定義していて各々がメモリ量や実行時間、実行回数が異なる場合です。

**ファンクション1**
メモリ量 128 MB、実行回数 25,000,000 回/月、実行時間 200 ミリ秒

**ファンクション2**
メモリ量 448 MB、実行回数 5,000,000 回/月、実行時間 500 ミリ秒

**ファンクション3**
メモリ量 1024 MB、実行回数 2,500,000 回、実行時間 1 秒

計算は面倒ですが、ポイントとしては以下のようになります。

- 実行時間に対する金額はそれぞれで計算
- 無料枠に関してはファンクションごとではなく全体で計算
- リクエスト回数に関してもファンクションごとではなく全体で計算

では早速やってみます。
まず、それぞれのファンクションの実行時間に対する料金を計算します。ここでは無料枠を考慮せずに計算します。

**ファンクション1**
毎回の実行時間が200ミリ秒で実行回数が2500万回なので、2500万回 * 0.2秒で500万秒です。
従って実行時間に対する課金額は以下のようになります。

$0.00001667 * 0.125(128/1024) * 500万秒 = $10.42

**ファンクション2**
毎回の実行時間が500ミリ秒で500万回実行されたので、500万回 * 0.5秒で250万秒が実行時間となります。メモリが448MBですので単価は448/1024となります。

$0.00001667 * 0.4375(448/1024) * 250万秒 = $18.23

**ファンクション3**
これは簡単ですね。まず毎回1秒なので総実行時間は250万秒です。というわけで以下のようになります。

$0.00001667 * 250万秒 = $41.68

というわけでこれら3つの課金額を合計して実行時間に対する金額は、

**$10.42 + $18.23 + $41.68 = $70.33**

となります。
次に無料枠の金額ですが、これは単純に40万秒の金額となりますので **$0.00001667 * 40万秒 = $6.67**となります。
続いてリクエストに対する料金を計算します。リクエストに対しては総リクエスト数で計算しますので以下のようになります。2500万回（ファンクション1） + 500万回（ファンクション2） + 250万回（ファンクション3） - 100万回（無料枠） = 3150万回なので **$0.2 * 31.5 = $6.3**です。

最後にこれまでの値をもとに計算します。

**$70.33 - $6.67 + $6.3 = $69.96**


#EC2の料金と比較してみる
参考までにオンデマンドのt2.microを1ヶ月間立ち上げっぱなしにしてずっと処理が稼働し続けたと仮定した場合の比較をしてみます。

まず、オンデマンドのt2.microインスタンスの1ヶ月にかかる費用は以下となります。

$0.013/1時間 * 24時間 * 31日 = $9.67

一方、メモリサイズがt2.microの1GBと同じLambdaファンクションを同じ時間数分実行した場合は以下のようになります。ここでは起動しっぱなし状態の再現として、1GBのファンクションを60秒に一回、つまり月間で44,640回起動し、毎回の実行時間は60秒とします。つまり総実行時間としては2678400秒となり、無料枠分をマイナスすると2,278,400秒が課金対象となる実行時間です。また、リクエスト数による課金は無料枠範囲に収まるため発生しません。従って、

$0.00001667 * 2278400秒 = $37.98

となります。

実際にはEC2インスタンスでは1GBのメモリを全てアプリケーションで利用できるわけではありませんし、ファンクションとして実装するようなものは1つの処理としては小さいことが多く、その分実行回数が多いと思われます。また、イベントドリブンなアプリケーションを開発したりサーバを運用管理するコストを鑑みつつ判断するのがいいと思われます。

というわけであまり参考になる比較にはなりませんでした。

#最後に
というわけで今回はプライシングに関するお話でした。
なお、2014年12月22日（月）にAWS LambdaのMeetupが開催されます。

[AWS Lambda Meetup #0](http://connpass.com/event/10556/)

計算間違いなどありましたら教えてください。

**免責
こちらは個人の意見で、所属する企業や団体は関係ありません。**