Pular para o conteúdo
Aback Tools Logo

Gerador de script de compactação Lambda@Edge

Gere uma função Lambda@Edge pronta para produção que adiciona compactação Brotli e GZIP às respostas do CloudFront – para origens que não oferecem suporte nativo à compactação. Configure o tipo de evento (resposta de origem ou resposta do visualizador), algoritmo de compactação e cabeçalhos opcionais. O gerador de script de compactação lambda@edge produz o código de função, a política de confiança do IAM, a política de execução do IAM e comandos passo a passo de implantação da AWS CLI. Toda a geração acontece no seu navegador sem necessidade de inscrição.

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 que usar nosso gerador de script de compactação Lambda@Edge?

  • Script de compactação Lambda@Edge instantâneo: gere instantaneamente uma função de compactação Lambda@Edge pronta para produção - sem mergulho na documentação da AWS, sem pesquisa de API zlib do Node.js. Nosso gerador de script de compactação lambda@edge produz código de função formatado corretamente, políticas IAM e etapas de implantação em segundos.
  • Gerador de script de compactação Lambda@Edge seguro on-line: suas opções de configuração nunca saem do seu dispositivo quando você usa este gerador de script de compactação lambda@edge. Toda a geração de scripts é executada inteiramente no seu navegador - sem solicitações de servidor, sem retenção de dados, 100% privada. Seguro para configurar distribuições de produção do CloudFront.
  • Gerador de script de compactação Lambda@Edge - sem instalação: gere scripts de compactação Lambda@Edge diretamente em qualquer navegador moderno, sem instalação da AWS CLI, sem configuração de Node.js e sem necessidade de conta. O gerador de script de compactação lambda@edge funciona em Windows, macOS, Linux e dispositivos móveis.
  • Pacote completo: script, políticas IAM e etapas de implantação: O gerador de script de compactação lambda@edge produz tudo o que você precisa: o código de função, a política de confiança do IAM, a política de execução do IAM e comandos passo a passo de implantação da AWS CLI. Inclui avisos em tempo real para configurações incorretas comuns, como falta de cabeçalhos Vary.

Casos de uso comuns para gerador de script de compactação Lambda@Edge

  • Compactação de distribuição do CloudFront: adicione compactação Brotli e GZIP a uma distribuição do CloudFront que fornece conteúdo de um bucket S3 ou origem personalizada que não oferece suporte à compactação. O gerador de script de compactação lambda@edge produz uma função Origin Response que compacta as respostas antes que o CloudFront as armazene em cache. Assim, a compactação é executada uma vez por falha de cache, e não em todas as solicitações.
  • API Gateway + CloudFront Compression: compacta respostas do API Gateway atendidas por meio do CloudFront. O API Gateway oferece suporte a GZIP, mas não a Brotli - o gerador de script de compactação lambda@edge adiciona suporte a Brotli para navegadores modernos, ao mesmo tempo em que recorre ao GZIP para clientes legados, melhorando os tamanhos de transferência de resposta da API em 15-25% em relação apenas ao GZIP.
  • Compactação de site estático S3: adicione compactação dinâmica a um site estático hospedado no S3 e servido por meio do CloudFront. O S3 não compacta respostas – o gerador de script de compactação lambda@edge adiciona uma função Origin Response que compacta HTML, CSS, JavaScript e JSON antes que o CloudFront armazene em cache a versão compactada.
  • Otimização de CDN multirregional: reduza os custos de largura de banda em todos os pontos de presença do CloudFront compactando as respostas na origem. O gerador de script de compactação lambda@edge produz uma função que é executada em us-east-1, mas é executada em pontos de presença do CloudFront em todo o mundo, reduzindo os tamanhos de transferência em 60 a 80% para conteúdo baseado em texto.
  • Atualização de compactação de origem herdada: adicione compactação Brotli a um servidor de origem herdado que suporta apenas GZIP ou nenhuma compactação. O gerador de script de compactação lambda@edge intercepta eventos de resposta de origem e aplica compactação Brotli para navegadores modernos - nenhuma alteração é necessária no servidor de origem.
  • Pacote de cabeçalhos de segurança + compactação: combine compactação com cabeçalhos de segurança em uma única função Lambda@Edge. O gerador de script de compactação lambda@edge adiciona opcionalmente cabeçalhos X-Content-Type-Options, X-Frame-Options e X-XSS-Protection junto com a compactação, reduzindo o número de funções Lambda@Edge necessárias por comportamento do CloudFront.

O que é compressão Lambda@Edge?

Lambda@Edge é um serviço da AWS que executa funções Node.js em pontos de presença do CloudFront em todo o mundo. Uma função de compactação Lambda@Edge intercepta respostas do CloudFront e aplica compactação GZIP ou Brotli antes que a resposta seja armazenada em cache ou entregue ao visualizador. Isso é útil quando o servidor de origem (S3, API Gateway, EC2 ou um servidor personalizado) não oferece suporte à compactação – a função Lambda@Edge adiciona compactação de forma transparente na camada CDN. Nosso gerador de script de compactação lambda@edge produz uma função Node.js completa usando o módulo zlib integrado (sem dependências externas) que lida com negociação Accept-Encoding, filtragem de tipo de conteúdo, gerenciamento de cabeçalho Vary e cabeçalhos Cache-Control.

Como funciona nosso gerador de script de compactação Lambda@Edge

  1. 1 Configure suas opções: selecione o tipo de evento do CloudFront (Origin Response ou Viewer Response), tempo de execução Node.js, algoritmo de compactação (preferencialmente Brotli, somente GZIP ou somente Brotli) e recursos opcionais como cabeçalhos Vary, Cache-Control e cabeçalhos de segurança. O gerador de script de compactação lambda@edge atualiza a saída em tempo real.
  2. 2 Copie o script, as políticas do IAM e as etapas de implantação: o gerador produz quatro saídas: o código de função (index.js), a política de confiança do IAM, a política de execução do IAM e os comandos de implantação da AWS CLI. Toda a geração é executada no seu navegador - nenhum dado é enviado para lugar nenhum.
  3. 3 Implante na AWS e associe-se ao CloudFront: crie a função Lambda em us-east-1, publique uma versão e associe-a ao comportamento de distribuição do CloudFront. A guia etapas de implantação fornece os comandos exatos da AWS CLI com espaços reservados para o ID da sua conta e o ID de distribuição.

Resposta de origem versus resposta do visualizador

  • Resposta de origem (recomendado): é executado depois que o CloudFront recebe a resposta de sua origem, antes de ser armazenada em cache. A resposta compactada é armazenada no cache do CloudFront – solicitações subsequentes para o mesmo objeto são atendidas no cache sem invocar a função Lambda. Esta é a abordagem mais econômica: a compactação é executada uma vez por falha de cache.
  • Resposta do visualizador: é executado antes do CloudFront enviar a resposta ao visualizador, após a pesquisa no cache. Isso significa que a função Lambda é executada em todas as solicitações, incluindo ocorrências de cache. Use a Resposta do visualizador somente quando precisar modificar respostas que já estão armazenadas em cache ou quando precisar adicionar cabeçalhos por visualizador que não podem ser armazenados em cache.
  • Limites do Lambda@Edge: as funções devem ser implantadas em us-east-1. Tempo máximo de execução: 5 segundos (Viewer) ou 30 segundos (Origin). Tamanho máximo do corpo da resposta: 1 MB (Visualizador) ou 1 MB (Origem). Nenhuma variável de ambiente ou acesso VPC. Nenhum pacote npm externo - use apenas recursos integrados do Node.js.
  • Compactação do CloudFront versus Lambda@Edge: o CloudFront possui um recurso de compactação integrado (habilitado nas configurações de distribuição) que oferece suporte a GZIP e Brotli. Use a compactação integrada do CloudFront sempre que possível: ela é gratuita e não tem custo de invocação do Lambda. Use a compactação do Lambda@Edge somente quando precisar de lógica personalizada (filtragem de tipo de conteúdo, cabeçalhos de segurança ou compactação para origens que enviam cabeçalhos de tipo de conteúdo incorretos).

Limitações importantes do Lambda@Edge

As funções do Lambda@Edge têm restrições estritas: elas devem ser implantadas em us-east-1 (Norte da Virgínia), independentemente da sua região de origem. Eles não podem usar variáveis ​​de ambiente, conexões VPC ou pacotes npm externos - o script gerado usa apenas o módulo zlib integrado do Node.js. O tamanho máximo do corpo da resposta é 1 MB – respostas maiores que 1 MB não podem ser modificadas pelo Lambda@Edge. Para respostas grandes, considere usar o CloudFront Functions (somente para manipulação de cabeçalho) ou ativar a compactação integrada do CloudFront. O Lambda@Edge também tem uma latência de inicialização a frio de 100 a 500 ms na primeira invocação em cada ponto de presença.

Perguntas frequentes

Um gerador de script de compactação lambda@edge produz uma função Node.js pronta para implantação para AWS Lambda@Edge que adiciona compactação Brotli e GZIP às respostas do CloudFront. Nosso gerador on-line gratuito de script de compactação lambda@edge produz o código de função, a política de confiança do IAM, a política de execução do IAM e as etapas de implantação da AWS CLI.

Use a compactação Lambda@Edge quando sua origem enviar cabeçalhos Content-Type incorretos, quando você precisar de filtragem de tipo de conteúdo personalizada, quando quiser combinar compactação com cabeçalhos de segurança ou quando precisar de compactação para origens que a compactação integrada do CloudFront não suporta.

Use Origin Response - ele é executado uma vez por perda de cache e armazena a resposta compactada no cache do CloudFront. A resposta do visualizador é executada em todas as solicitações, incluindo ocorrências de cache, o que é significativamente mais caro e adiciona latência a cada resposta.

Sim. Toda a geração de scripts é executada inteiramente no seu navegador usando JavaScript. Nenhum dado de configuração é enviado a nenhum servidor, armazenado remotamente ou transmitido pela rede.

Sim - 100% grátis, para sempre. Sem inscrição, sem conta, sem nível premium e sem anúncios. Gere scripts de compactação Lambda@Edge ilimitados e totalmente gratuitos.

A AWS exige que todas as funções do Lambda@Edge sejam criadas na região us-east-1 (Norte da Virgínia). A AWS replica automaticamente a função para todos os pontos de presença do CloudFront em todo o mundo quando você a associa a uma distribuição.

O script gerado usa apenas o módulo zlib integrado do Node.js - nenhum pacote externo é necessário. Isso mantém o pacote de implantação abaixo de 1 KB. O Lambda@Edge oferece suporte a pacotes npm se você implantar um ZIP com node_modules, mas módulos integrados são preferidos pela simplicidade.

O Lambda@Edge só pode modificar corpos de resposta com tamanho de até 1 MB. Respostas maiores que 1 MB são retornadas sem modificações. Para respostas grandes, use a compactação integrada do CloudFront ou a compactação no servidor de origem.

Teste com curl: "curl -H "Accept-Encoding: br, gzip" -I https://your-cloudfront-domain.com/". Procure Content-Encoding: br ou Content-Encoding: gzip nos cabeçalhos de resposta. Verifique o CloudWatch Logs em us-east-1 para logs de execução do Lambda@Edge.