Параметры кэширования для AWS Lambda@Edge
Как лучше всего реализовать локальное кэширование для AWS Lambda@Edge?
Вот контекст: у нас в CloudFront есть триггер lambda@edge, который должен получить открытый ключ из открытого Интернета. Этот ключ периодически вращается. Публичный вызов из lambda@edge в общедоступный Интернет вводит штраф за задержку, поэтому в идеале мы хотели бы кэшировать данные. Конечно, мы могли бы использовать ElastiCache или DynamoDB в качестве уровня кэша, но это сведет на нет преимущество от того, что лямбда работает в крайнем местоположении, так как это потребовало бы общения с ресурсом в одном из регионов.
Один из способов, который я могу придумать, - хранить данные в статической корзине S3 веб-сайта с включенным распределением CloudFront. Если я правильно понимаю, это будет означать, что этот файл также будет присутствовать в CloudFront в том же самом краевом местоположении, что и сама лямбда. Затем Lambda может позвонить на статический веб-сайт и извлечь этот файл из пограничного кэша. Это правильный шаблон? Есть ли лучшее решение?
1 ответ
Что мы делаем, так это получаем ключ (в нашем случае JWK) из Интернета при запуске функции Lambda, то есть вне функции-обработчика. Таким образом, ключ извлекается только тогда, когда функция Lambda вызывается при холодном запуске. Последующие запросы будут использовать ключ в памяти.
import { JwtRsaVerifier } from "aws-jwt-verify";
// this is run on cold start
const verifier = JwtRsaVerifier.create({
options,
jwksUri: "https://login.microsoftonline.com/common/discovery/v2.0/keys",
});
export const handler = async (event, context, callback) => {
const request = event.Records[0].cf.request;
const headers = request.headers;
const accessToken = parseAccessTokenCookie(headers);
let hasValidJwt = false;
if (accessToken) {
try {
const payload = await verifier.verify(accessToken);
console.log("Token is valid");
hasValidJwt = true;
} catch {
console.log("Token not valid!");
}
} else {
console.log("No token provided");
}
}