Amazon Web Services ブログ
新機能 – Lambda 関数のプロビジョニングされた同時実行性
特にサーバーについて考える必要がない場合は、時間はあっと言う間に過ぎていきます。AWS Lambda は 5 年目を迎えました。チームは常に、顧客がより簡単な方法で、アプリケーションを構築して実行できるようにする新しい方法を探しています。
ミッションクリティカルなアプリケーションがサーバーレスに移行するにつれて、顧客はアプリケーションのパフォーマンスをさらに制御する必要があります。 本日、プロビジョニングされた同時実行数を開始します。これは、関数を初期化し、2 桁のミリ秒以内に応答するためのハイパーレディを維持する機能です。 ウェブおよびモバイルバックエンド、レイテンシーの影響を受けやすいマイクロサービス、同期 API などの対話型サービスの実装に最適です。
Lambda 関数を呼び出すと、呼び出しは実行環境にルーティングされ、リクエストが処理されます。関数がしばらく使用されていない場合、より多くの同時呼び出しを処理する必要がある場合、または関数を更新する場合、新しい実行環境が作成されます。実行環境の作成は、関数コードのインストールとランタイムの開始を処理します。デプロイパッケージのサイズやランタイムとコードの初期化時間に応じて、新しい実行環境にルーティングされる呼び出しのレイテンシーーが発生する可能性があります。このレイテンシーは通常、「コールドスタート」と呼ばれます。 ほとんどのアプリケーションでは、この追加のレイテンシーは問題になりません。ただし、一部のアプリケーションでは、このレイテンシーは許容されない場合があります。
関数のプロビジョニングされた同時実行を有効にすると、Lambda サービスは実行環境のリクエスト数を初期化して、呼び出しに応答する準備ができるようにします。
プロビジョニングされた同時実行の設定
同じ Java コードを使用し、Amazon API Gateway によってトリガーできる 2 つの Lambda 関数を作成します。本番稼働ワークロードをシミュレートするために、これらの関数は、初期化段階で 1,000 万回、呼び出しごとに 20 万回の数学的計算を繰り返しています。計算は java.Math.Random
と条件 (if ...
) を使用して、コンパイラの最適化 (反復の「ループ解除」など) を回避します。各関数には 1 GB のメモリがあり、コードのサイズは 1.7 MB です。
2 つの関数のいずれかでのみプロビジョニングされた同時実行を有効にして、同様のワークロードに対する反応を比較できるようにします。Lambda コンソールで、いずれかの機能を選択します。構成タブに、新しいプロビジョニングされた同時実行設定が表示されます。
設定を追加を選択します。プロビジョニングされた同時実行は、特定の Lambda 関数バージョンやエイリアスに対して有効にできます ($LATEST
は使用できません)。関数のバージョンごとに異なる設定を指定できます。エイリアスを使用すると、これらの設定を適切な関数バージョンに簡単に有効化できます。私の場合、AWS SAM AutoPublishAlias
関数設定を使用して、最新バージョンに更新し続けるエイリアスライブ
を選択します。プロビジョニングされた同時実行の場合、500
と保存を入力します。
現在、プロビジョニングされた同時実行の構成は進行中です。実行環境は、私の入力に基づいて同時に着信するリクエストを処理する準備ができています。 この間、関数は利用可能なままで、トラフィックを処理し続けます。
数分後、同時実行が準備状態になります。これらの設定により、最大 500 件の同時実行リクエストで、それらを処理するための準備が整った実行環境が見つかります。それを超えても、Lambda 関数の通常のスケーリングが適用されます。
負荷を生成するには、同じリージョンで Amazon Elastic Compute Cloud (EC2) インスタンスを使用します。シンプルにするために、Apache HTTP サーバーにバンドルされている ab
ツールを使用して、2 つの API エンドポイントを 500 件の同時実行で 10,000 回呼び出します。これらは新しい関数なので、次のことを期待できます。
- プロビジョニングされた同時実行が有効になっていて 500 に設定されている関数の場合、リクエストは事前に初期化された実行環境によって管理されます。
- プロビジョニングされた同時実行が無効になっている他の関数では、約 500 個の実行環境をプロビジョニングする必要があり、同じ量の呼び出し (合計の約 5%) に一部のレイテンシーが追加されます。
ab
ツールの優れた機能の 1 つは、一定時間内に処理されたリクエストの割合を報告することです。Tim Bray が書いたサーバーレスレイテンシーに関するこの投稿で説明されているように、これは API レイテンシーを調べるのに非常に良い方法です。
プロビジョニングされた同時実行を無効にする関数の結果は次のとおりです。
一定時間内に処理されたリクエストの割合 (ミリ秒)
50% 351
66% 359
75% 383
80% 396
90% 435
95% 1357
98% 1619
99% 1657
100% 1923 (最長リクエスト)
これらの数値を見ると、リクエストの 50% が 351 ミリ秒以内に処理され、66% のリクエストが 359 ミリ秒以内に処理されていることがわかります。リクエストの 95% 以上を見ると何かが発生することは明らかです。約 1 秒くらい時間が増加します。
プロビジョニングされた同時実行を有効にする関数の結果は次のとおりです。
一定時間内に処理されたリクエストの割合 (ミリ秒)
50% 352
66% 368
75% 382
80% 387
90% 400
95% 415
98% 447
99% 513
100% 593 (最長リクエスト)
グラフでこれらの数値を比較してみましょう。
テストワークロードの予想どおり、最も遅い 5% のリクエスト (95%~100%) の応答時間には大きな違いがあります。プロビジョニングされた同時実行が無効になっている関数は、新しい実行環境の作成によって追加されたレイテンシーの表示と、関数コードの (遅い) 初期化を無効にします。
一般に、追加されるレイテンシーの量は、使用するランタイム、コードのサイズ、および最初の呼び出しの準備をするためにコードで必要な初期化によって異なります。その結果、追加されたレイテンシーは、ここで経験したものよりも大きくなったり小さくなったりする可能性があります。
この追加レイテンシーの影響を受ける呼び出しの数は、Lambda サービスが新しい実行環境を作成しなければならない頻度によって異なります。通常、同時呼び出しの数がすでにプロビジョニングされている数を超えて増加した場合、または関数の新しいバージョンをデプロイした場合に発生します。
遅い応答時間のわずかな割合 (一般的にテイルレイテンシーと呼ぶ) は、実際にエンドユーザーエクスペリエンスに違いをもたらします。長期間にわたって、ほとんどのユーザーは一部の対話中に影響を受けます。プロビジョニングされた同時実行を有効にすると、ユーザーエクスペリエンスがはるかに安定します。
プロビジョニングされた同時実行は Lambda の機能であり、どのトリガーでも機能します。たとえば、WebSockets API、GraphQL リゾルバ、または IoT ルールで使用できます。この機能により、ウェブアプリやモバイルアプリ、ゲーム、または複雑なトランザクションの一部であるサービスなど、低レイテンシーを必要とするサーバーレスアプリケーションを構築する際の制御が強化されます。
今すぐ利用可能です
プロビジョニングされた同時実行は、コンソール、AWS コマンドラインインターフェイス (CLI)、新しい Lambda 関数または既存の Lambda 関数の AWS SDK を使用して構成できます。現在、米国東部 (オハイオ)、米国東部 (バージニア北部)、米国西部 (北カリフォルニア)、米国西部 (オレゴン)、アジアパシフィック (香港)、アジアパシフィック (ムンバイ)、アジアパシフィック (ソウル)、アジアパシフィック (シンガポール)、アジアパシフィック (シドニー)、アジアパシフィック (東京)、カナダ (中部)、欧州 (フランクフルト)、欧州 (アイルランド)、欧州 (ロンドン)、欧州 (パリ)、欧州 (ストックホルム)、中東 (バーレーン)、南米 (サンパウロ) の AWS リージョンでご利用いただけます。
また、AWS Serverless Application Model (SAM) と SAM CLI を使用して、プロビジョニングされた同時実行を使用するサーバーレスアプリケーションをテスト、デプロイ、および管理することもできます。
Application Auto Scaling を使用すると、関数に必要な並行性の構成を自動化できます。ポリシーとして、ターゲット追跡とスケジュールされたスケーリングがサポートされています。 これらのポリシーを使用すると、需要の高い時間帯に同時実行の量を自動的に増やし、需要が少ないときに同時実行の量を減らすことができます。
サーバーレスフレームワークと Terraform でプロビジョニングされた同時実行数の設定を構成したり、Datadog、Epsagon、Lumigo、New Relic、SignalFx、SumoLogic、および Thundra でメトリックを表示したりするなど、AWS パートナーツール でプロビジョニングされた同時実行もすぐに使用できます。
お客様が設定した同時実行の量とその設定期間に対してのみお支払いいただきます。米国東部 (バージニア北部) の料金は、プロビジョニングされた同時実行数の基準では GB/時間あたり 0.015 USD、期間基準では GB/時間あたり 0.035 USD です。リクエストの数は、通常の関数と同じ料金が請求されます。 詳細については、Lambda 料金ページをご覧ください。
この新機能により、開発者は非常に一貫したレイテンシーを必要とするさまざまなワークロードに Lambda を使用できます。この新機能を使って、何をしようと考えているか、ぜひ教えてください。
— Danilo