LambdaのProvisioned Concurrencyの価格を調べてみた

この記事は、ハンズラボ Advent Calendar 2019 12日目の記事です :snowman:

# はじめに

ハンズラボのPOSチームでテックリードをしている @zizi4n5 です :snowboarder:
ようやく消費税の増税・軽減税率対応なども落ち着いて、先週はラスベガスで開催された AWS re:Invent 2019 :airplane:に参加してきたのですが、その会場で発表された Lambdaの新機能 `Provisioned Concurrency` が非常に気になっています。

今まではLambdaの起動時間を早くする（コールドスタートさせない）対策として、定期的にLambdaの実行を行なっているサービスありますよね。
私が担当しているサービスでも、[serverless-plugin-warmup](https://github.com/FidelLimited/serverless-plugin-warmup) を導入してLambdaのwarmupを行なっています。

それが今後は、自前での定期実行やpluginを導せずに素早くLambdaを実行できるようになる便利機能の登場です。
その分、**やっぱりお高いんでしょう？**ってあたりが気になっていたので、**Provisioned Concurrencyの価格について調べた内容**を以下にまとめました。
なお、設定の仕方はすでに色々なサイトでまとめられていましたので、そちらを参考にしてみてください。

* [新機能 – Lambda 関数のプロビジョニングされた同時実行性](https://aws.amazon.com/jp/blogs/news/new-provisioned-concurrency-for-lambda-functions/)
* [Managing Concurrency for a Lambda Function](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-concurrency.html)
* [[速報]コールドスタート対策のLambda定期実行とサヨナラ！！ LambdaにProvisioned Concurrencyの設定が追加されました](https://dev.classmethod.jp/cloud/aws/lambda-support-provisioned-concurrency/)
* [Provisioned Concurrencyで予約したLambda実行環境が初期化されるまでの時間を計測してみた](https://dev.classmethod.jp/cloud/aws/calc-provisioned-concurrency-time/)

# Provisioned Concurrencyの価格
価格については、公式サイトで確認することができます。
なお、日本語のページにはまだ`Provisioned Concurrency`に関する記述が載っていないので、英語のページで確認する必要があります。

<img width="541" alt="Screen Shot 2019-12-11 at 22.55.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63892/2d4204e8-e7a2-84bd-8225-244b98162402.png">

* [AWS Lambda Pricing - Provisioned Concurrency Pricing](https://aws.amazon.com/lambda/pricing/?nc1=h_ls#Provisioned_Concurrency_Pricing)

料金体系としては、今までのProvisioned Concurrency設定なしのLambdaと比較すると以下のような違いがありました。

* プロビジョニングされた同時実行料金が発生する[^1]
* 計算料金が少し安い（25%OFFぐらい） [^2]
* 無料利用枠が適用されない  

[^1]: Lambda関数に割り当てるメモリサイズと`Provisioned Concurrency`に設定された数によって変動します。
[^2]: Lambda関数に割り当てるメモリサイズによって変動します。

||AWS Lambda価格[^3]|プロビジョニングされた同時実行価格[^3]|
|:-:|:-:|:-:|
|プロビジョニングされた同時実行性|ー|GB-sごとに0.000005384ドル|
|リクエスト|100万リクエストあたり0.20ドル|100万リクエストあたり0.20ドル|
|リクエスト(無料枠)|100万リクエスト|ー|
|期間|GB-sごとに0.000016667ドル|GB-sごとに0.000012562ドル|
|期間(無料枠)|400,000 GB-s|ー|

[^3]: 2019/12/11時点での`Asia Pacific(Tokyo)`の`AWS Lambda Pricing`と`Provisioned Concurrency Pricing`の値となります。


# 1ヶ月（31日）あたりの料金試算
私が開発しているサービスの概算値を利用して、1ヶ月（31日）あたりの料金について試算してみます。

* Provisioned Concurrencyを設定した場合の1ヶ月（31日）の料金
* 通常のAWS Lambdaを利用した場合の1ヶ月（31日）の料金

## サービスの概算値（31日あたり）

||概算値|
|:-:|:-:|
|メモリサイズ（MB）|256|
|同時実行性|10|
|リクエスト数|200万回|
|1リクエストあたりの平均実行時間（秒）|2.0|

## Provisioned Concurrencyを設定した場合の1ヶ月あたりの料金

### プロビジョニングされた同時実行料金
プロビジョニングされた同時実行価格は、GB-sあたり0.000005384 ドルです。

```
 - プロビジョニングされた同時実行が有効になっている合計期間（秒）= 31 * 24 * 3,600 秒 = 2,678,400 秒
 - 構成された同時実行の合計（GB）= 10 * 256 MB / 1,024 MB = 2.5 GB
 - プロビジョニングされた同時実行の合計量（GB-s）= 2.5 GB * 2,678,400 秒 = 6,696,000 GB-s
```
**プロビジョニングされた同時実行料金 = 6,696,000 * 0.000005384 ドル = 36.051264 ドル**


### リクエスト料金
リクエスト価格は、100万リクエストあたり0.20ドルです。
**リクエスト料金 = 200万リクエスト * 0.20 ドル / 100万リクエスト = 0.40 ドル**


### 計算料金
計算価格はGB-sあたり0.000012562ドルです。

```
 - 合計計算期間（秒）= 2,000,000 リクエスト * 2 秒 = 400万秒
 - 合計コンピューティング（GB-s）= 4,000,000 秒 * 256 MB / 1024 = 1,000,000 GB-s
```
**計算料金 = 1,000,000 GB-s * 0.000012562 ドル = 12.562 ドル**


### 合計料金
`合計料金=プロビジョニングされた同時実行料金+リクエスト料金+計算料金`
**合計料金 = 36.051264 ドル + 0.40 ドル + 12.562 ドル = 49.013264 ドル**


## 通常のAWS Lambdaを利用した場合の1ヶ月（31日）の料金

### リクエスト料金
リクエスト価格は、1,000,000リクエストあたり0.20ドルです。

```
 - リクエストの合計 - 100万件の無料利用枠リクエスト = 毎月の請求対象リクエスト
　　2,000,000 リクエスト - 1,000,000 リクエスト（無料枠） = 1,000,000 リクエスト
```
**リクエスト料金 = 1,000,000 リクエスト * 0.20 ドル / 1,000,000 リクエスト = 0.20 ドル**


### 計算料金
計算価格はGB-sあたり0.000016667ドルです。

```
 - 合計計算期間（秒）= 2,000,000 リクエスト * 2 秒 = 4,000,000 秒
 - 合計コンピューティング（GB-s）= 4,000,000 秒 * 256 MB / 1024 = 1,000,000 GB-s
 - 合計コンピューティング - 無料利用枠コンピューティング = 毎月の請求対象コンピューティング（GB-s）
　　1,000,000 GB-s - 400,000 GB-s（無料枠） = 600,000 GB-s
```
**計算料金 = 600,000 GB-s * 0.000016667 ドル = 10.0002 ドル**


### 合計料金
`合計料金=プロビジョニングされた同時実行料金+リクエスト料金+計算料金`
**合計料金 = 0.20 ドル + 10.0002 ドル = 10.2002 ドル**[^4]

[^4]: 無料利用枠がなかった場合の合計金額は17.067ドルでした。


## 料金比較
 
||通常のAWS Lambdaを利用した場合|Provisioned Concurrencyを設定した場合|
|:-:|:-:|:-:|
|1ヶ月あたりの料金|10.2002 ドル|49.013264 ドル|

私が開発しているサービスの規模では、無料利用枠を大きく超えるほどの利用がなかったため、Provisioned Concurrencyを利用すると料金が5倍ぐらいになってしまいました。

とはいっても、差だけに注目すると40ドルほどなので許容範囲内とするかどうかについては、今後検討しようと思います。

# 最後に
* 現時点ではAWS Consoleを利用して、Provisioned Concurrencyを有効にする時間帯（ex. 9:00-23:00）の指定といった細かい設定の仕方がわかりませんでした。
Provisioned Concurrencyを有効にする時間帯を限定できれば、`プロビジョニングされた同時実行料金`を減らすことができてより適切なコストコントールが可能になるので、もしやり方知ってる方いれば是非教えてください :pray:  

* Provisioned ConcurrencyではLambdaの同時実行性を担保するためにコンピューティングリソースを常時確保しているので、今後はFargateのSavings Plansのように大幅な利用費削減を見込める仕組みが出てきたりしないのかな？と期待しています。