環境変数NODE_EXTRA_CA_CERTSがコールドスタートに与える影響を確認してみた

Node.js 20のランタイムはデフォルトでAmazonのRoot CA証明書を読み込まないので、コールドスタートが高速化されています
2024.01.22

環境変数NODE_EXTRA_CA_CERTSがコールドスタートに与える影響を確認してみた

CX事業本部@大阪の岩田です。

昨年11月にLambdaのランタイムでNode.js 20がサポートされるようになりました。

Node.js 18のランタイムと比較して色々な点が更新されているのですが、変更点の1つとしてRoot CA証明書の読み込みに関する挙動の変更が挙げられます。詳細については上記のAWSブログに記載されていますが、内容を要約すると以下の通りです。

  • Node.js 18までのランタイムはNode.jsが標準で読み込むRoot CA証明書に加えて、各種AWSサービスに接続するために必要なAmazonのRoot CA証明書を読み込んでいる
  • これらの証明書の読み込みはコールドスタートのパフォーマンス劣化につながるため、Node.js 20のランタイムでは追加のRoot CA証明書を読み込まないようになった
  • Node.js 20のランタイムでは/var/runtime/ca-cert.pemに全てのAmazonのRoot CA証明書を含むファイルが配置されている
  • Node.js 20のランタイムではLambdaの環境変数NODE_EXTRA_CA_CERTSに上記/var/runtime/ca-cert.pemを指定することでAmazon のRoot CA証明書が追加で読み込まれ、Node.js 18までと同じ振る舞いになる
  • /var/runtime/ca-cert.pemの読み込みは時間がかかるので、AmazonのRoot CA証明書を読み込む必要があるユースケースでは、必要な証明書のみをLambdaのデプロイパッケージに含めるようにし、環境変数NODE_EXTRA_CA_CERTSから参照するのが好ましい

実際にNODE_EXTRA_CA_CERTSの指定が、どの程度コールドスタートに影響を及ぼすのかを検証してみました。

環境

今回検証に利用した環境です

  • メモリ割当: 128M
  • CPUアーキテクチャ: arm64
  • ランタイム: nodejs:20.v14
  • ランタイムバージョンARN: arn:aws:lambda:ap-northeast-1::runtime:d4c968f0a85420c036d732975b0317307799fc7152619b3c4fb289f5d8e34f8a

検証手順

計測対象のLambdaのコードは以下の通りです。デフォルトのコードにsetTimeoutを利用した5秒の疑似Sleep処理を追加し、同時にLambdaが呼び出された場合にコールドスタートが発生しやすいように調整しています。

export const handler = async (event) => {
  
  await new Promise(resolve => setTimeout(resolve, 5000))
  const response = {
    statusCode: 200,
    body: JSON.stringify('Hello from Lambda!'),
  };
  return response;
};

上記のコードに加え、LambdaのデプロイパッケージにRDS用のRoot CA証明書を含めるようにします。

続いて以下のコードを実行し、上記のLambdaを連続で非同期呼び出しします。

import boto3
client = boto3.client('lambda')

for i in range(100):
    client.invoke_async(FunctionName='NodeExtraCaCerts',InvokeArgs="{}")

実行完了後、CloudWatch Logs Insightsから以下のクエリを実行し、コールドスタート関連の集計値を取得します。

filter @type = "REPORT" |
parse @message /Init Duration: (?<init>\S+)/ |
stats count(init) as count, min(init) as min,max(init) as max, avg(init) as avg, median(init) as median, pct(init, 95) as tile

計測結果

結果は以下の通りでした

環境変数NODE_EXTRA_CA_CERTS コールドスタート発生件数 最小値 最大値 平均 中央値 95%タイル
設定無し 91 128.56 201.57 139.8471 137.37 168.3
/var/task/ap-northeast-1-bundle.pem 96 141.45 216.89 155.3957 153.45 170.87
/var/runtime/ca-cert.pem 94 156.23 220.24 171.9132 171.59 181.15

追加のCA証明書を一切読み込まないNode.js 20のランタイム標準のパターンが一番高速で、すべての Amazon CA 証明書を読み込むパターンが一番遅いという結果でした。AWSブログの解説通りで予想通りの結果となっています。

まとめ

Node.js 20のランタイムにおいて環境変数NODE_EXTRA_CA_CERTSがコールドスタートに与える影響を確認してみました。AWSブログで解説されている通り、追加のCA証明書の読み込みが必要な場合は、必要最低限の証明書のみデプロイパッケージに含めるようにするのが良いでしょう。

また、Node.js 18以前のランタイムを利用している環境では、Node.js 20のランタイムに移行することでRoot CA証明書の読み込みに必要な処理時間が改善され、コールドスタートの高速化が期待できます。※CA証明書読み込み以外の最適化の恩恵も受けられるはずです。まだ移行できていない場合はランタイムのバージョンアップを検討してみてはいかがでしょうか?