プロビジョニングされた同時実行性と自動スケーリングを使用して AWS Lambda 関数を最適化する方法
AWS Lambda 関数は、独自のサーバーをセットアップせずにクラウドでコードを実行するためのサーバーレス ソリューションです。主な欠点は、初期化時間が長くなり、遅延が増加する可能性があることです。プロビジョニングされた同時実行性を使用すると、この問題を解決できます。
プロビジョニングされた同時実行性とは何ですか?
Lambda 関数は独自の「実行環境」で実行され、通常はリクエストが行われると自動的に起動されます。関数の呼び出し後、環境は約 5 ~ 15 分間「ウォーム」状態に保たれ、初期化コードを再度実行する必要はありません。
ただし、その期間が経過した場合、または複数のリクエストを同時に処理する必要がある場合は、新しい実行環境を起動する必要があり、「コールド スタート」と呼ばれる起動時間の増加につながります。これは、Java など、起動時に大量の JIT コンパイルを実行する必要がある言語で特に顕著です。ネット。
これを解決するために、AWS にはプロビジョニングされた同時実行と呼ばれる機能があり、基本的に一定数の実行環境を予約して、1 日を通して永続的にウォーム状態にすることができます。これは、すべての初期化コードが事前に実行されるため、コールド スタートを経験する必要がないことを意味します。
ユーザー向けのリクエストを処理するために Lambda に依存している場合は、たとえコストが多少高くなっても、プロビジョニングされた同時実行性を検討することをお勧めします。通常、コールド スタートはリクエストの 1% のみを占めますが、その 1% はアプリケーションのロードの待機に数秒以上費やされる可能性があります。ただし、これはコードの実行時間とサイズによって異なります。
プロビジョニングされた同時実行のコストはどれくらいですか?
リザーブド EC2 インスタンスとは異なり、プロビジョニングされた同時実行性は、Lambda の他の部分と同様に、依然としてほとんどが「使用した分だけ支払う」料金設定です。各環境をプロビジョニングする時間ごとに少額の料金を支払い、その後は通常どおり Lambda リクエストに対して支払います。
ただし、トラフィックは AWS 側でより予測可能であり、初期化コードを常に実行する必要がないためコストがかからないため、プロビジョニングされた同時実行で行われたリクエストの関数ごとのコンピューティング コストは実際には低くなります。制限を超えてもマイナス面はなく、標準の同時実行料金が請求されるだけです。
全体として、トラフィックが非常に予測可能であり、正確にその量の容量を予約している場合、プロビジョニングされた同時実行性はわずかに安くなります (約 5 ~ 10%)。ただし、場合によってはもう少し高価になる場合もあります。詳細については、分析を確認し、AWS の Lambda 料金計算ツールに接続してください。
プロビジョニングされた同時実行性の有効化
プロビジョニングされた同時実行性を有効にするのは非常に簡単ですが、欠点が 1 つあります。それは、デフォルトの $LATEST バージョンを指すことができないということです。このタグは変更される可能性のあるエイリアスであり、特定のバージョンを指すものではなく、プロビジョニングされた同時実行では特定のバージョンを予約する必要があります。したがって、新しいバージョンをまだ持っていない場合は、Lambda から新しいバージョンを公開する必要があります。
次に、そのバージョンを指すようにエイリアスを構成します。このエイリアスは更新でき、プロビジョニングされた環境の更新がトリガーされます。
エイリアスが設定されたら、[設定] > [同時実行] で、Lambda の設定から新しい同時実行設定を追加できます。これはエイリアス設定から直接構成することもできます。
プロビジョニングされた同時実行の設定は簡単です。エイリアスを選択し、プロビジョニングする量を入力します。
AWS API または CLI を使用してこの値を設定および更新することもでき、これを使用して 1 日を通して自動化できます。
aws lambda put-provisioned-concurrency-config --function-name MyFunction \
--qualifier LatestProvisioned --provisioned-concurrent-executions 10
プロビジョニングされた同時実行性による自動スケーリング
プロビジョニングされた同時実行性は 1 日を通して調整できるため、 AWS の Application Auto Scalingに接続して使用状況に基づいて調整することもできます。これを接続するのは簡単で、AWS CLI または API からいくつかのコマンドを実行するだけです。これは、このための管理コンソールがまだないためです。
まず、Lambda 関数をスケーリング ターゲットとして登録する必要があります。ここでは、関数の名前 (MyFunction) とエイリアス (latestProvisioned) を編集し、最小容量と最大容量の範囲も調整する必要があります。
aws application-autoscaling register-scalable-target --service-namespace lambda \
--resource-id function:MyFunction:LatestProvisioned --min-capacity 2 --max-capacity 10 \
--scalable-dimension lambda:function:ProvisionedConcurrency
次に、関数名とエイリアスをリソース ID として使用し、JSON スケーリング ポリシーで構成して、自動スケーリング ポリシーを有効にすることができます。LambdaProvisionedConcurrencyUtilization
この例では、70% を超えるか下回るとスケールアップまたはスケールダウンするように設定します。
aws application-autoscaling put-scaling-policy --service-namespace lambda \
--scalable-dimension lambda:function:ProvisionedConcurrency --resource-id function:MyFunction:LatestProvisioned \
--policy-name my-policy --policy-type TargetTrackingScaling \
--target-tracking-scaling-policy-configuration '{ "TargetValue": 0.7, "PredefinedMetricSpecification": { "PredefinedMetricType": "LambdaProvisionedConcurrencyUtilization"}}'
これは、長く続かない急速な使用など、すべてのケースに対応できるわけではありませんが、一貫したトラフィックにはうまく機能し、トラフィックが少ない夕方には費用を節約できます。
コメントを残す