6
1

More than 3 years have passed since last update.

Provisioned Concurrency for Lambda Functions ちょっと試してみた。

Last updated at Posted at 2019-12-04

AWSの一番好きなサービスはAWS Lambda な人です。


re:invnet 2019真っ最中で、量子コンピューティングサービス出てきたり、EKS for Fargateとか出ている中で、Lambdaのアップデートがいくつかありました。
その中で、過去の経緯上、個人にちょっと熱かった
Provisioned Concurrency for Lambda Functions
についてやってみたので、所感のメモです。

例によって、クラスメソッドさんが速報を上げてくれているので、こちらも

[速報]コールドスタート対策のLambda定期実行とサヨナラ!! LambdaにProvisioned concurrencyの設定が追加されました  #reinvent | Developers.IO

Lambdaをポーリング

AWS Lambda、非常に便利なんですが、VPC内で使うと、実行時にENI作成が起きて、場合によっては、1分ぐらいかかることがあって、
API Gatewayから呼び出したりすると、API Gatewayが先にタイムアウトする(最大29秒なので)ってことが起きていました。

今年、ENIをLambda関数デプロイ時に作成し、起動を高速化する改善がありましたが、それでも、リクエストが増えたときには、Lambdaの起動が発生し、コールドスタートは発生するっていう状況でした。

コールドスタートをなるべく少なくするために、Lambdaを起動し続けるように、ポーリングするという手段が取られていたわけですが、
今日発表されたProvisioned Concurrency for Lambda Functionsで、自前でポーリングをしなくても良いようになったようです。

あ、コールドスタートについては、Lambda関数のモジュールの大きさとかも絡んでくるので、一概に遅いわけではないです。悪しからず。

試してみた

すでに、東京リージョンにもできているので、新規作成してやってみます。

新規作成して、VPC指定(別に指定する必要はないみたいですけど、まあ)、バージョンを作成します。

同時実行数という項目の中に、プロビジョニングされた同時実行とい項目が追加されています。
設定画面

追加ボタンを押すとこんな感じのダイアログが出てきます。
登録ダイアログ
ちなみに、バージョン/エイリアス指定だと、当たり前ですが、選択肢が減ります。
バージョンで選択した場合

なお、#latestは指定できないみたいです。
latest指定不可

で設定してみます。とりあえず プロビジョニングされた同時実行 は10にしてみました
設定状況

実行数は、予約済み実行数と一緒で、「アカウントで指定されているLambdaの同時実行数から、一定数を割り当てる」ので、
あまり割り当てすぎると、割り当てしてないLambdaに大量アクセスがあった場合にスロットリングエラーが起きるかもしないですね。
今回は適当に10割り当てましたが、ちゃんとアクセス数の検討、負荷試験を実施して、適切な数値をセットしたいですね。

保存を押すと、設定が始まります。
設定中

なお。この状態では、該当Lambdaのロググループ内は空ですが、
スクリーンショット 2019-12-04 13.36.09.png

設定が進むと、ログストリームができてきます。(つまりLambdaのコンテナが起動した状態)
設定中

完了すると、、、なぜか20個のログストリームができていました。謎です。 この事象については何か分かったら追記します。。。
設定完了済み?

ちなみに、ログストリームには何も書かれてないです。テンプレートそのままなので、起動時に実行される処理があって、ログに吐き出すようにしていれば、そちらの記載されるのではないかと。

ログストリームの中は空

で、試しに、設定したバージョンでアクセス(テスト実行してます)すると、
テスト実行

起動したうちの1つにイベントに記載されました。
イベント

なお、#latestでテスト実行すると、
latestでテスト実行

対象外なので、別のログストリームが作成されます。
別のログストリーム作成

とりあえずは今日のところは以上です。
公式のブログにある通り、Apache Benchなどで、負荷かけてみないとダメかなーというところは、ちょっと今後の課題ということで。

価格

課金に関しては、以下になっているようです。

Price
Provisioned Concurrency $0.000005384 for every GB-second
Requests $0.20 per 1M requests
Duration $0.000012562 for every GB-second

以下めっちゃGoogle翻訳ですがw、
プロビジョニングされた同時実行性(Provisioned Concurrency)は、機能で有効化してから無効化するまでの時間から計算され、最も近い5分に切り上げられます。価格は、関数に割り当てるメモリの量と、それに設定する同時実行の量によって異なります。

期間(Duration)は、コードが実行を開始してから戻るか終了するまでの時間から計算され、最も近い100ミリ秒に切り上げられます。価格は、関数に割り当てるメモリの量によって異なります。

Lambdaの無料利用枠は、Provisioned Concurrencyが有効になっている機能には適用されません。関数のプロビジョニングされた同時実行を有効にして実行すると、以下の価格に基づいてリクエストと期間に対して課金されます。

無料利用枠対象外になるんですねー。これは注意が必要かも。


ポーリングを自前で設定しなくてもよくなったのは、大きいかもしれません。
数が多くなると、設定も面倒ですからねぇ。。。(遠い目)
こっちも一緒か。。。

ちなみに、同時に、Using Amazon RDS Proxy with AWS Lambda | Amazon Web Services
というアップデートも発表されており、
今年あったLambdaのアップデートで、今まで結構アンチパターンだと言われていた、Lambda + RDSの組み合わせが使いやすくなったのではないでしょうか?


2019/12/6 追記
作って1日放置してるんですが、 Cloudwatch Logsのロググループを見る限り、定期的にコンテナが再作成されている感じがします。
Pollingでもどんなにアクセスしてても、定期的には再作成されるような挙動だったので、この辺は一緒かもしれません。

そして、Billingのところでは、Provisioned Concurrency用の項目が出現。
billing

ほほ、Lambdaで課金されてるーwって軽く盛り上がった人ですw
個人の検証用アカウントなのでLambdaの無料枠になることはまずないので。。。


随時更新します。

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1