Saltar al contenido
Aback Tools Logo

Generador de scripts de compresión Lambda@Edge

Genere una función Lambda@Edge lista para producción que agregue compresión Brotli y GZIP a las respuestas de CloudFront, para orígenes que no admiten la compresión de forma nativa. Configure el tipo de evento (Respuesta de origen o Respuesta del espectador), el algoritmo de compresión y los encabezados opcionales. El generador de scripts de compresión lambda@edge produce el código de función, la política de confianza de IAM, la política de ejecución de IAM y los comandos de implementación de AWS CLI paso a paso. Toda la generación ocurre en su navegador sin necesidad de registrarse.

Lambda@Edge Compression Script Generator

Configure the options below to generate a Lambda@Edge function that adds Brotli and GZIP compression to CloudFront responses. The lambda@edge compression script generator produces the function code, IAM trust policy, IAM execution policy, and deployment steps. All generation happens in your browser - no signup required.

Node.js 20.x is recommended. Lambda@Edge supports Node.js 18.x and 20.x.

Response Headers

Skip Conditions

/**
 * Lambda@Edge Compression Script
 * Event type: origin-response
 * Runtime: nodejs20.x
 * Generated by AbackTools - https://abacktools.com
 */

'use strict';

// Content types that benefit from compression
const COMPRESSIBLE_TYPES = [
  'text/html', 'text/css', 'text/plain', 'text/xml', 'text/javascript',
  'application/javascript', 'application/x-javascript', 'application/json',
  'application/ld+json', 'application/xml', 'application/rss+xml',
  'application/atom+xml', 'image/svg+xml', 'font/ttf', 'font/otf',
];

// Already-compressed formats - skip to avoid overhead
const SKIP_TYPES = [
  'image/jpeg', 'image/png', 'image/webp', 'image/avif', 'image/gif',
  'image/bmp', 'video/mp4', 'video/webm', 'audio/mpeg', 'audio/ogg',
  'application/zip', 'application/gzip', 'application/x-brotli',
  'font/woff2',
];

exports.handler = async (event) => {
  const { request, response } = event.Records[0].cf;

  // Get the Accept-Encoding header from the viewer request
  const acceptEncoding =
    (request.headers['accept-encoding'] || [{ value: '' }])[0].value.toLowerCase();

  // Get the Content-Type of the response
  const contentType =
    (response.headers['content-type'] || [{ value: '' }])[0].value.split(';')[0].trim().toLowerCase();

  // Skip if already compressed
  const alreadyEncoded = response.headers['content-encoding'];
  if (alreadyEncoded && alreadyEncoded[0]?.value) {
    return response;
  }

  // Skip already-compressed content types
  if (SKIP_TYPES.some(t => contentType.startsWith(t))) {
    return response;
  }

  // Only compress compressible content types
  const isCompressible = COMPRESSIBLE_TYPES.some(t => contentType.startsWith(t));
  if (!isCompressible) {
    return response;
  }

  // Skip small responses (compression overhead not worth it)
  const bodyLength = response.body ? Buffer.byteLength(response.body, 'utf8') : 0;
  if (bodyLength < 1024) {
    return response;
  }

  // Determine the best encoding to use
  let encoding = null;
  if (acceptEncoding.includes('br')) {
    encoding = 'br';
  } else if (acceptEncoding.includes('gzip')) {
    encoding = 'gzip';
  }

  if (!encoding) {
    return response;
  }

  // Compress the response body
  try {
    const zlib = require('zlib');
    const body = Buffer.from(
      response.body,
      response.bodyEncoding === 'base64' ? 'base64' : 'utf8'
    );

    let compressed;
    if (encoding === 'br') {
      compressed = zlib.brotliCompressSync(body, {
        params: { [zlib.constants.BROTLI_PARAM_QUALITY]: 6 },
      });
    } else {
      compressed = zlib.gzipSync(body, { level: 6 });
    }

    // Only use compressed version if it's actually smaller
    if (compressed.length < body.length) {
      response.body = compressed.toString('base64');
      response.bodyEncoding = 'base64';
      response.headers['content-encoding'] = [{ key: 'Content-Encoding', value: encoding }];
      response.headers['content-length'] = [{ key: 'Content-Length', value: String(compressed.length) }];
    }
  } catch (err) {
    console.error('Compression failed:', err);
    // Return uncompressed response on error
  }

  // Add Vary: Accept-Encoding so CloudFront caches separate variants
  const existingVary = (response.headers['vary'] || [{ value: '' }])[0].value;
  if (!existingVary.toLowerCase().includes('accept-encoding')) {
    response.headers['vary'] = [{
      key: 'Vary',
      value: existingVary ? `${existingVary}, Accept-Encoding` : 'Accept-Encoding',
    }];
  }

  // Set Cache-Control for compressed assets
  if (!response.headers['cache-control']) {
    response.headers['cache-control'] = [{
      key: 'Cache-Control',
      value: 'public, max-age=31536000, stale-while-revalidate=86400',
    }];
  }

  return response;
};

Lambda@Edge requirement: Functions must be deployed in us-east-1(N. Virginia) regardless of your CloudFront distribution's origin region. Lambda@Edge does not support environment variables or VPC access.

¿Por qué utilizar nuestro generador de scripts de compresión Lambda@Edge?

  • Script de compresión Lambda@Edge instantáneo: genere instantáneamente una función de compresión Lambda@Edge lista para producción, sin necesidad de profundizar en la documentación de AWS ni de investigar la API zlib de Node.js. Nuestro generador de scripts de compresión lambda@edge produce código de función, políticas de IAM y pasos de implementación con el formato correcto en segundos.
  • Generador de secuencias de comandos de compresión Lambda@Edge seguro en línea: sus opciones de configuración nunca abandonan su dispositivo cuando utiliza este generador de secuencias de comandos de compresión lambda@edge. Toda la generación de secuencias de comandos se ejecuta completamente en su navegador: sin solicitudes del servidor, sin retención de datos, 100% privado. Seguro para configurar distribuciones de producción de CloudFront.
  • Generador de scripts de compresión Lambda@Edge: sin instalación: genere scripts de compresión Lambda@Edge directamente en cualquier navegador moderno sin instalación de AWS CLI, configuración de Node.js y sin necesidad de cuenta. El generador de scripts de compresión lambda@edge funciona en Windows, macOS, Linux y dispositivos móviles.
  • Paquete completo: script, políticas de IAM y pasos de implementación: el generador de scripts de compresión lambda@edge produce todo lo que necesita: el código de función, la política de confianza de IAM, la política de ejecución de IAM y los comandos de implementación de AWS CLI paso a paso. Incluye advertencias en tiempo real sobre configuraciones erróneas comunes, como la falta de encabezados Vary.

Casos de uso comunes para el generador de scripts de compresión Lambda@Edge

  • Compresión de distribución de CloudFront: agregue compresión Brotli y GZIP a una distribución de CloudFront que proporcione contenido de un depósito S3 o de un origen personalizado que no admita la compresión. El generador de scripts de compresión lambda@edge produce una función de respuesta de origen que comprime las respuestas antes de que CloudFront las almacene en caché, por lo que la compresión se ejecuta una vez por error de caché, no en cada solicitud.
  • API Gateway + Compresión CloudFront: comprime las respuestas de API Gateway servidas a través de CloudFront. API Gateway admite GZIP pero no Brotli: el generador de scripts de compresión lambda@edge agrega compatibilidad con Brotli para navegadores modernos y, al mismo tiempo, recurre a GZIP para clientes heredados, lo que mejora los tamaños de transferencia de respuesta de API entre un 15 y un 25 % con respecto a GZIP solo.
  • Compresión de sitios estáticos de S3: agregue compresión dinámica a un sitio estático alojado en S3 y servido a través de CloudFront. S3 no comprime las respuestas: el generador de secuencias de comandos de compresión lambda@edge agrega una función de respuesta de origen que comprime HTML, CSS, JavaScript y JSON antes de que CloudFront almacene en caché la versión comprimida.
  • Optimización de CDN multiregión: reduzca los costos de ancho de banda en todas las ubicaciones de borde de CloudFront comprimiendo las respuestas en el origen. El generador de scripts de compresión lambda@edge produce una función que se ejecuta en us-east-1 pero se ejecuta en ubicaciones de borde de CloudFront en todo el mundo, lo que reduce los tamaños de transferencia entre un 60 % y un 80 % para el contenido basado en texto.
  • Actualización de compresión de origen heredado: agregue compresión Brotli a un servidor de origen heredado que solo admita GZIP o no admita compresión. El generador de scripts de compresión lambda@edge intercepta eventos de Origin Response y aplica compresión Brotli para navegadores modernos; no se requieren cambios en el servidor de origen.
  • Paquete de encabezados de seguridad + compresión: combine la compresión con encabezados de seguridad en una única función Lambda@Edge. El generador de scripts de compresión lambda@edge agrega opcionalmente encabezados X-Content-Type-Options, X-Frame-Options y X-XSS-Protection junto con la compresión, lo que reduce la cantidad de funciones Lambda@Edge necesarias por comportamiento de CloudFront.

¿Qué es la compresión Lambda@Edge?

Lambda@Edge es un servicio de AWS que ejecuta funciones de Node.js en ubicaciones de borde de CloudFront en todo el mundo. Una función de compresión Lambda@Edge intercepta las respuestas de CloudFront y aplica compresión GZIP o Brotli antes de que la respuesta se almacene en caché o se entregue al espectador. Esto es útil cuando su servidor de origen (S3, API Gateway, EC2 o un servidor personalizado) no admite la compresión: la función Lambda@Edge agrega compresión de forma transparente en la capa CDN. Nuestro generador de scripts de compresión lambda@edge produce una función Node.js completa utilizando el módulo zlib incorporado (sin dependencias externas) que maneja la negociación de aceptación de codificación, filtrado de tipo de contenido, administración de encabezados Vary y encabezados de control de caché.

Cómo funciona nuestro generador de scripts de compresión Lambda@Edge

  1. 1 Configure sus opciones: seleccione el tipo de evento de CloudFront (Respuesta de origen o Respuesta del espectador), el tiempo de ejecución de Node.js, el algoritmo de compresión (preferiblemente Brotli, solo GZIP o solo Brotli) y funciones opcionales como encabezados Vary, control de caché y encabezados de seguridad. El generador de scripts de compresión lambda@edge actualiza la salida en tiempo real.
  2. 2 Copie el script, las políticas de IAM y los pasos de implementación: el generador genera cuatro resultados: el código de función (index.js), la política de confianza de IAM, la política de ejecución de IAM y los comandos de implementación de la CLI de AWS. Toda la generación se ejecuta en su navegador: no se envían datos a ninguna parte.
  3. 3 Implementar en AWS y asociarla con CloudFront: cree la función Lambda en us-east-1, publique una versión y asóciela con su comportamiento de distribución de CloudFront. La pestaña de pasos de implementación proporciona los comandos exactos de AWS CLI con marcadores de posición para su ID de cuenta y su ID de distribución.

Respuesta del origen frente a respuesta del espectador

  • Respuesta de origen (recomendado): se ejecuta después de que CloudFront recibe la respuesta de su origen, antes de que se almacene en caché. La respuesta comprimida se almacena en la caché de CloudFront; las solicitudes posteriores para el mismo objeto se atienden desde la caché sin invocar la función Lambda. Este es el enfoque más rentable: la compresión se ejecuta una vez por cada fallo de caché.
  • Respuesta del espectador: se ejecuta antes de que CloudFront envíe la respuesta al espectador, después de la búsqueda de caché. Esto significa que la función Lambda se ejecuta en cada solicitud, incluidas las coincidencias de caché. Utilice Respuesta del espectador solo cuando necesite modificar respuestas que ya están almacenadas en caché o cuando necesite agregar encabezados por espectador que no se pueden almacenar en caché.
  • Límites de Lambda@Edge: las funciones deben implementarse en us-east-1. Tiempo máximo de ejecución: 5 segundos (Visor) o 30 segundos (Origen). Tamaño máximo del cuerpo de la respuesta: 1 MB (Visor) o 1 MB (Origen). Sin variables de entorno ni acceso a VPC. No hay paquetes npm externos: use solo las funciones integradas de Node.js.
  • Compresión de CloudFront frente a Lambda@Edge: CloudFront tiene una función de compresión incorporada (habilitada en la configuración de distribución) que admite GZIP y Brotli. Utilice la compresión integrada de CloudFront cuando sea posible: es gratuita y no tiene costo de invocación de Lambda. Utilice la compresión Lambda@Edge solo cuando necesite lógica personalizada (filtrado de tipo de contenido, encabezados de seguridad o compresión para orígenes que envían encabezados de tipo de contenido incorrectos).

Limitaciones importantes de Lambda@Edge

Las funciones Lambda@Edge tienen restricciones estrictas: deben implementarse en us-east-1 (N. Virginia) independientemente de su región de origen. No pueden usar variables de entorno, conexiones VPC o paquetes npm externos: el script generado usa solo el módulo zlib integrado de Node.js. El tamaño máximo del cuerpo de la respuesta es 1 MB; Lambda@Edge no puede modificar las respuestas mayores a 1 MB. Para respuestas grandes, considere usar CloudFront Functions (solo para manipulación de encabezados) o habilitar la compresión integrada de CloudFront. Lambda@Edge también tiene una latencia de inicio en frío de 100 a 500 ms en la primera invocación en cada ubicación de borde.

Preguntas frecuentes

Un generador de scripts de compresión lambda@edge produce una función Node.js lista para implementar para AWS Lambda@Edge que agrega compresión Brotli y GZIP a las respuestas de CloudFront. Nuestro generador de scripts de compresión lambda@edge gratuito en línea produce el código de función, la política de confianza de IAM, la política de ejecución de IAM y los pasos de implementación de la CLI de AWS.

Utilice la compresión Lambda@Edge cuando su origen envíe encabezados de tipo de contenido incorrectos, cuando necesite un filtrado de tipo de contenido personalizado, cuando desee combinar la compresión con encabezados de seguridad o cuando necesite compresión para orígenes que la compresión integrada de CloudFront no admite.

Utilice Origin Response: se ejecuta una vez por error de caché y almacena la respuesta comprimida en el caché de CloudFront. Viewer Response se ejecuta en cada solicitud, incluidas las visitas de caché, lo que es significativamente más costoso y agrega latencia a cada respuesta.

Sí. Toda la generación de scripts se ejecuta completamente en su navegador utilizando JavaScript. No se envían datos de configuración a ningún servidor, no se almacenan de forma remota ni se transmiten a través de la red.

Sí, 100% gratis, para siempre. Sin registro, sin cuenta, sin nivel premium y sin anuncios. Genere scripts de compresión Lambda@Edge ilimitados completamente gratis.

AWS requiere que todas las funciones Lambda@Edge se creen en la región us-east-1 (Norte de Virginia). AWS replica automáticamente la función en todas las ubicaciones de borde de CloudFront en todo el mundo cuando la asocia con una distribución.

El script generado utiliza solo el módulo zlib integrado de Node.js, no se necesitan paquetes externos. Esto mantiene el paquete de implementación por debajo de 1 KB. Lambda@Edge admite paquetes npm si implementa un ZIP con node_modules, pero se prefieren los módulos integrados por simplicidad.

Lambda@Edge solo puede modificar cuerpos de respuesta de hasta 1 MB de tamaño. Las respuestas de más de 1 MB se devuelven sin modificaciones. Para respuestas grandes, utilice la compresión integrada de CloudFront o comprima en el servidor de origen.

Pruebe con curl: "curl -H "Aceptar codificación: br, gzip" -I https://your-cloudfront-domain.com/". Busque Content-Encoding: br o Content-Encoding: gzip en los encabezados de respuesta. Consulte CloudWatch Logs en us-east-1 para ver los registros de ejecución de Lambda@Edge.