AWS Lambda のパフォーマンスを向上させるインメモリキャッシュの活用
岩佐 孝浩
4 min read
Lambda In-memory Cache Closures in JavaScript
はじめに
URL Copied!
AWS Lambda ユーザーは、インメモリキャッシュを利用してパフォーマンスを向上させ、コストを削減できます。
例えば、Secrets Manager に保存されているシークレット値は、最新の値を必要としない限り、handler
の外でキャッシュできます。この手法は 静的初期化 として知られています。
この記事では、JavaScript のクロージャー を使用して、インメモリキャッシュを活用した AWS Lambda 関数の最適化方法を示します。
非最適化された Lambda 関数
URL Copied!
主な課題
URL Copied!
- 各呼び出し時に
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,
};
}
実行結果
URL Copied!
この関数を複数回実行すると非効率性が明らかになります。例えば、以下のログは、各呼び出しで 153.66 ms の Duration
がかかっていることを示しています。
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 関数
URL Copied!
主な改善点
URL Copied!
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;
};
}
実行結果
URL Copied!
最適化された関数は実行時間を大幅に短縮します。例えば、以下のログは、各呼び出しで 1.28 ms の Duration
に削減されていることを示しています。
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
まとめ
URL Copied!
AWS Lambda ユーザーは、クロージャー などのインメモリキャッシュ技術を採用することで、関数のパフォーマンスを大幅に向上させ、コストを削減できます。この簡単な調整により、冗長なプロセスを最小限に抑え、実行効率を高めることが可能です。
Happy Coding! 🚀