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指定(別に指定する必要はないみたいですけど、まあ)、バージョンを作成します。
同時実行数という項目の中に、プロビジョニングされた同時実行とい項目が追加されています。
追加ボタンを押すとこんな感じのダイアログが出てきます。
ちなみに、バージョン/エイリアス指定だと、当たり前ですが、選択肢が減ります。
で設定してみます。とりあえず プロビジョニングされた同時実行 は10にしてみました
実行数は、予約済み実行数と一緒で、「アカウントで指定されているLambdaの同時実行数から、一定数を割り当てる」ので、
あまり割り当てすぎると、割り当てしてないLambdaに大量アクセスがあった場合にスロットリングエラーが起きるかもしないですね。
今回は適当に10割り当てましたが、ちゃんとアクセス数の検討、負荷試験を実施して、適切な数値をセットしたいですね。
なお。この状態では、該当Lambdaのロググループ内は空ですが、
設定が進むと、ログストリームができてきます。(つまりLambdaのコンテナが起動した状態)
完了すると、、、なぜか20個のログストリームができていました。謎です。 この事象については何か分かったら追記します。。。
ちなみに、ログストリームには何も書かれてないです。テンプレートそのままなので、起動時に実行される処理があって、ログに吐き出すようにしていれば、そちらの記載されるのではないかと。
で、試しに、設定したバージョンでアクセス(テスト実行してます)すると、
とりあえずは今日のところは以上です。
公式のブログにある通り、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用の項目が出現。
ほほ、Lambdaで課金されてるーwって軽く盛り上がった人ですw
個人の検証用アカウントなのでLambdaの無料枠になることはまずないので。。。
随時更新します。