AWS Lambda のパフォーマンスを向上させるインメモリキャッシュの活用

AWS Lambda のパフォーマンスを向上させるインメモリキャッシュの活用

岩佐 孝浩
岩佐 孝浩
4 min read
Lambda In-memory Cache Closures in JavaScript

はじめに

AWS Lambda ユーザーは、インメモリキャッシュを利用してパフォーマンスを向上させ、コストを削減できます。

例えば、Secrets Manager に保存されているシークレット値は、最新の値を必要としない限り、handler の外でキャッシュできます。この手法は 静的初期化 として知られています。

この記事では、JavaScript のクロージャー を使用して、インメモリキャッシュを活用した AWS Lambda 関数の最適化方法を示します。

非最適化された Lambda 関数

主な課題

  • 各呼び出し時に SecretsManagerClient をインスタンス化する。
  • 関数が呼び出されるたびに Secrets Manager からシークレット値を取得する。
import {
  SecretsManagerClient,
  GetSecretValueCommand,
} from '@aws-sdk/client-secrets-manager';

export async function handler(event) {
  const client = new SecretsManagerClient();
  const command = new GetSecretValueCommand({ SecretId: '<YOUR_SECRET_ID>' });
  const { SecretString } = await client.send(command);

  return {
    statusCode: 200,
    body: SecretString,
  };
}

実行結果

この関数を複数回実行すると非効率性が明らかになります。例えば、以下のログは、各呼び出しで 153.66 msDuration がかかっていることを示しています。

Function Logs
START RequestId: 55f3596f-b4c1-4fcd-bc34-2c63674bd3cd Version: $LATEST
END RequestId: 55f3596f-b4c1-4fcd-bc34-2c63674bd3cd
REPORT RequestId: 55f3596f-b4c1-4fcd-bc34-2c63674bd3cd	Duration: 153.66 ms	Billed Duration: 154 ms	Memory Size: 128 MB	Max Memory Used: 89 MB

最適化された Lambda 関数

主な改善点

  • useGetSecret 内でクロージャーを使ったキャッシュを実装。
  • 初回の呼び出しでシークレット値をキャッシュし、ランタイムが終了するまで再取得を最小限に抑える。
  • 関心の分離を確保し、getSecret を呼び出す側がキャッシュロジックを意識する必要がない設計。
import {
  SecretsManagerClient,
  GetSecretValueCommand,
} from '@aws-sdk/client-secrets-manager';

const getSecret = useGetSecret('<YOUR_SECRET_ID>');

export const handler = async (event) => {
  const secret = await getSecret();
  return {
    statusCode: 200,
    body: secret,
  };
};

function useGetSecret(id) {
  const client = new SecretsManagerClient();
  const command = new GetSecretValueCommand({ SecretId: id });
  let secret = '';

  return async () => {
    if (secret) {
      return secret;
    }
    const { SecretString } = await client.send(command);
    secret = SecretString;
    return secret;
  };
}

実行結果

最適化された関数は実行時間を大幅に短縮します。例えば、以下のログは、各呼び出しで 1.28 msDuration に削減されていることを示しています。

Function Logs
START RequestId: aaba6d16-19ee-437a-9592-f708b3ed7c8b Version: $LATEST
END RequestId: aaba6d16-19ee-437a-9592-f708b3ed7c8b
REPORT RequestId: aaba6d16-19ee-437a-9592-f708b3ed7c8b	Duration: 1.28 ms	Billed Duration: 2 ms	Memory Size: 128 MB	Max Memory Used: 88 MB

まとめ

AWS Lambda ユーザーは、クロージャー などのインメモリキャッシュ技術を採用することで、関数のパフォーマンスを大幅に向上させ、コストを削減できます。この簡単な調整により、冗長なプロセスを最小限に抑え、実行効率を高めることが可能です。

Happy Coding! 🚀

岩佐 孝浩

岩佐 孝浩

Software Developer at KAKEHASHI Inc.
AWS を活用したクラウドネイティブ・アプリケーションの要件定義・設計・開発に従事。 株式会社カケハシで、処方箋データ収集の新たな基盤の構築に携わっています。 Japan AWS Top Engineers 2020-2023