AWS HTTP APIs предоставляет новый способ развертывания REST APIs в AWS, обеспечивая ряд упрощений по сравнению с оригинальными REST APIs.
Однако при работе с HTTP API необходимо помнить о некоторых трудностях, например, о том, какие типы использовать для аргументов обработчика. REST API также предоставляют возможность включить сжатие полезной нагрузки. Однако для HTTP API мы должны сами сжимать полезную нагрузку.
К счастью, это относительно просто, и ниже я объясню все необходимые шаги. Для тех, кто ищет быстрое решение, я создал библиотеку lambda-compression
, которую вы можете использовать следующим образом.
Сжатие с помощью библиотеки
Библиотека lambda-compression
предоставляет только один метод compress
, который принимает переменную event
, передаваемую в функции-обработчики HTTP API, и «структурированный» результат (см. ответ лямбда-функции для формата 2.0).
Функция compress
вернет структурированный результат, который возвращается как результат функции-обработчика.
Библиотека может быть установлена как зависимость Node:
npm i lambda-compression
yarn add lambda-compression
Здесь приведен пример реализации с использованием JavaScript:
import { compress } from 'lambda-compression';
export const handler = async (event, context) => {
return compress(event, {
statusCode: 201,
headers: {
'Content-Type': 'application/json',
},
body: '{"data":"hello"}',
});
};
А здесь пример реализации с использованием TypeScript:
import { compress } from 'lambda-compression';
import {
Handler,
APIGatewayProxyEventV2,
APIGatewayProxyResultV2,
} from 'aws-lambda';
type ProxyHandler = Handler<APIGatewayProxyEventV2, APIGatewayProxyResultV2>;
export const handler: ProxyHandler = async (event, context) => {
return compress(event, {
statusCode: 201,
headers: {
'Content-Type': 'application/json',
},
body: '{"data":"hello"}',
});
};
Шаги, необходимые для сжатия
Логика, необходимая для реализации сжатия, довольно проста, поскольку мы можем полагаться на пакет zlib
, предоставляемый в Node.js.
Полный пример исходного кода можно посмотреть здесь: lambdaCompression.ts
.
По сути, нам нужно:
- Определить, какие форматы сжатия принимает клиент, запросив заголовок
accept-encoding
. - Если клиент не поддерживает сжатие, вернуть несжатую полезную нагрузку.
- Если клиент поддерживает сжатие:
- применяет поддерживаемый формат сжатия (
br
,gzip
илиdeflate
), - результат кодируется в Base64,
- установить свойство
isBase64Encoded
в результате, и - установить результат в Base64-кодировке в качестве
body
возвращаемого ответа.
- применяет поддерживаемый формат сжатия (
Заключительные размышления
Сжатие может требовать больших затрат процессора, поэтому может быть целесообразно кэшировать сжатые результаты, если ожидается, что один и тот же результат будет возвращаться многократно. Также можно разместить свой API за дистрибутивом CloudFront, который может позаботиться о сжатии полезной нагрузки при ограниченных обстоятельствах. Наконец, возврат к использованию REST API также позволяет использовать встроенную функцию сжатия.
Если у вас есть идеи по улучшению библиотеки, пожалуйста, напишите об этом 🤗.