Сжатие для AWS HTTP APIs

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 также позволяет использовать встроенную функцию сжатия.

Если у вас есть идеи по улучшению библиотеки, пожалуйста, напишите об этом 🤗.

Оцените статью
devanswers.ru
Добавить комментарий