Lambda 関数のコールドスタートの問題をトラブルシューティングする方法を教えてください。

所要時間1分
0

私の AWS Lambda 関数では、コールドスタートの待ち時間が長くなっています。

解像度

環境とコードに対する Lambda 関数リクエストの初期設定は、コールドスタート時間または起動レイテンシーと呼ばれます。Lambda 関数のコールドスタート時間とレイテンシーを最小限に抑えるには、ユースケースに合わせて以下の手順に従ってください。

Lambda 関数コードと設定のベストプラクティス

  • Lambda 関数に割り当てられるメモリを増やしてください。コールドスタートの範囲は、関数のサイズ、割り当てたメモリの量、およびコードの複雑さによって異なります。メモリを追加すると、それに比例して CPU の量が増え、利用可能な全体的な計算能力も増加します。詳細については、「メモリと計算能力」を参照してください。
  • デプロイパッケージのサイズを最小限にします。デプロイパッケージが小さいほど、機能の起動が速くなります。関数がインポートする依存関係と外部ライブラリの数を最小限に抑え、デプロイパッケージのサイズは 50 MB 未満にしてください。詳細については、「Lambda デプロイパッケージ」を参照してください。
  • Lambda 関数コードを最適化して、初期化にかかる時間を最小限に抑えます。関数がインポートする依存関係と外部ライブラリの数を減らします。初期化中に実行されるコードの量を減らします。
  • 起動時の複雑な計算は避けてください。大規模なデータセットの読み込みなど、関数の起動時に複雑な計算が必要な場合は、これをバックグラウンドで実行できます。Init フェーズでは、バックグラウンドスレッドで計算を実行します。次に、結果をキャッシュして、後続の呼び出しに備えます。結果をキャッシュすると、起動時の複雑な計算に必要な時間を短縮できます。
  • Amazon Relational Database Service (Amazon RDS) のデータベース接続を再利用します。関数が Amazon RDS データベースに接続する場合、関数用の Amazon RDSプロキシデータベースプロキシを作成できます。データベースプロキシは、データベース接続のプールを管理します。Amazon RDS データベース接続を再利用すると、関数が呼び出されるたびに接続を確立する時間を短縮できます。
  • プロビジョニングされた同時実行を設定します。プロビジョニングされた同時実行性を使用する関数は、呼び出し前に実行環境が準備されるため、コールドスタート動作を示しません。ファンクションインスタンスの数を指定して、ウォームアップとトラフィック管理を行うことができます。
  • 依存関係の複雑さを最小限に抑えます。実行環境の起動時にすばやく読み込まれるシンプルなフレームワークを使用してください。
  • Java で作成されたデプロイパッケージを Lambda が展開するのにかかる時間を短縮するには、依存関係の .jar ファイルを別の /lib ディレクトリに置きます。.jar ファイルを分離する方が、多数の .class ファイルを含む 1 つの jar に関数のコードをすべて格納するよりも高速です。詳細については、「.zip または JAR ファイルアーカイブによる Java Lambda関数のデプロイ」を参照してください。
  • モニタリングを使って問題を発見し、オブザーバビリティを使ってその理由を発見しましょう。関数のコールドスタートパフォーマンスを監視し、Amazon CloudWatch の Lambda Insightsを使用してパフォーマンスの問題をトラブルシューティングします。

詳細については、「Lambda 関数を使用する際のベストプラクティス」を参照してください。

プロビジョニングされた同時実行での INIT 時間が長い

オンデマンド Lambda 関数では、静的イニシャライザーはリクエストの受信後、ハンドラーが呼び出される前に実行されます。その結果、リクエスタに待ち時間が発生し、コールドスタートの全体的な所要時間に影響します。

  • 関数の同時実行が、設定されている同時実行性のレベルを超えているかどうかを判断します。関数が呼び出された回数を、ProvisionedConcurrencySpilloverInvocations CloudWatch メトリックスを使用して確認できます。ゼロ以外の値は、プロビジョニングされたすべての同時実行が使用中であり、コールドスタートで何らかの呼び出しが行われたことを示します。
  • 呼び出し頻度 (1 秒あたりのリクエスト数) を確認してください。同時実行がプロビジョニングされた関数では、プロビジョニングされた同時実行回数 (Lambda API リクエスト) につき、1 秒あたり最大 10 リクエスト (Lambda API リクエスト) が送信されます。たとえば、100 件の同時実行数を設定した関数は、1 秒あたり 1000 件のリクエストを処理できます。呼び出しレートが 1 秒あたり 1000 リクエストを超えると、コールドスタートが発生する可能性があります。詳細については、「Lambda プロビジョニングされた同時実行性を使用したコールドスタート」を参照してください。

詳細については、「Lambda 関数でプロビジョニングされた同時実行の問題をトラブルシューティングするにはどうすればよいですか?」を参照してください。

Lambda と統合された Amazon API Gateway リクエスト

API Gateway で Lambda を使用していて、IntegrationLatency メトリックスが高い場合は、Lambda 関数の CloudWatch ログを確認してください。Lambda 関数と統合されている API エンドポイントがクライアントに応答を送信するのに時間がかかりすぎる場合は、高レイテンシーに対処する必要があります。Lambda 関数のコールドスタートは関数の期間メトリックスに記録されないため、API の統合レイテンシーは関数の期間よりも長くなる可能性があります。コールドスタートでの機能の所要時間を確認するには、AWS X-Ray を使用してください。

詳細については、「Lambda と統合されている API Gatewayリクエストの高レイテンシーをトラブルシューティングするにはどうすればよいですか?」を参照してください。

関連情報

Java Lambda 関数の初期化と呼び出し時間のレイテンシーを減らすにはどうすればよいですか?

Java 11 ランタイム用 Lambda SnapStart による起動パフォーマンスの向上

Lambda のオペレーティング: パフォーマンスの最適化 — パート 1

AWS公式
AWS公式更新しました 1年前