Cloud & Infraestrutura

CloudFront: CDN, Behaviors, Cache Policies e Lambda@Edge: Do Básico ao Avançado

10 min de leitura

CloudFront: CDN, Behaviors, Cache Policies e Lambda@Edge: Do Básico ao Avançado

CloudFront: Fundamentos da CDN CloudFront é o serviço de Content Delivery Network (CDN) da AWS que distribui seu conteúdo para usuários finais com baixa latência, independentemente de sua localização geográfica. Ele funciona através de uma rede global de edge locations que armazenam cópias em cache do seu conteúdo, reduzindo a necessidade de requisições ao servidor de origem. A arquitetura do CloudFront é composta por edge locations (pontos de presença distribuídos globalmente), regional caches e servidores de origem. Quando um usuário solicita um recurso, o CloudFront verifica se ele está em cache na edge location mais próxima. Se estiver, entrega instantaneamente. Caso contrário, busca do cache regional ou do servidor de origem, armazena em cache e entrega ao usuário. Isso reduz significativamente a latência e diminui a carga no seu servidor de origem. Behaviors: Roteamento Inteligente de Requisições Behaviors (comportamentos) permitem aplicar diferentes estratégias de cache e processamento para diferentes padrões de URL. Você pode ter múltiplos behaviors em uma única

<h2>CloudFront: Fundamentos da CDN</h2>

<p>CloudFront é o serviço de Content Delivery Network (CDN) da AWS que distribui seu conteúdo para usuários finais com baixa latência, independentemente de sua localização geográfica. Ele funciona através de uma rede global de edge locations que armazenam cópias em cache do seu conteúdo, reduzindo a necessidade de requisições ao servidor de origem.</p>

<p>A arquitetura do CloudFront é composta por edge locations (pontos de presença distribuídos globalmente), regional caches e servidores de origem. Quando um usuário solicita um recurso, o CloudFront verifica se ele está em cache na edge location mais próxima. Se estiver, entrega instantaneamente. Caso contrário, busca do cache regional ou do servidor de origem, armazena em cache e entrega ao usuário. Isso reduz significativamente a latência e diminui a carga no seu servidor de origem.</p>

<pre><code class="language-javascript">// Exemplo: Criando uma distribuição CloudFront com Terraform

resource &quot;aws_cloudfront_distribution&quot; &quot;exemplo&quot; {

origin {

domain_name = &quot;meusite.com.br&quot;

origin_id = &quot;minhaOrigemPrincipal&quot;

}

enabled = true

default_root_object = &quot;index.html&quot;

default_cache_behavior {

allowed_methods = [&quot;GET&quot;, &quot;HEAD&quot;]

cached_methods = [&quot;GET&quot;, &quot;HEAD&quot;]

target_origin_id = &quot;minhaOrigemPrincipal&quot;

forwarded_values {

query_string = false

cookies {

forward = &quot;none&quot;

}

}

viewer_protocol_policy = &quot;redirect-to-https&quot;

min_ttl = 0

default_ttl = 3600

max_ttl = 86400

}

restrictions {

geo_restriction {

restriction_type = &quot;none&quot;

}

}

viewer_certificate {

cloudfront_default_certificate = true

}

}</code></pre>

<h2>Behaviors: Roteamento Inteligente de Requisições</h2>

<p>Behaviors (comportamentos) permitem aplicar diferentes estratégias de cache e processamento para diferentes padrões de URL. Você pode ter múltiplos behaviors em uma única distribuição, cada um com suas próprias políticas de cache, métodos HTTP permitidos e configurações de origem.</p>

<p>Um behavior é definido por um path pattern (por exemplo, <code>/api/<em></code>, <code>/images/</em></code>). O CloudFront processa behaviors em ordem: o primeiro match aplica suas regras. Isso permite cenários avançados como servir HTML dinâmico diferentemente de assets estáticos, ou rotear requisições a diferentes origens baseado na URL.</p>

<pre><code class="language-javascript">// Exemplo: Múltiplos Behaviors em uma distribuição

resource &quot;aws_cloudfront_distribution&quot; &quot;avancada&quot; {

origin {

domain_name = &quot;api.meusite.com&quot;

origin_id = &quot;api&quot;

}

origin {

domain_name = &quot;cdn.meusite.com&quot;

origin_id = &quot;assets&quot;

}

enabled = true

Behavior 1: Requisições API - sem cache

ordered_cache_behavior {

path_pattern = &quot;/api/*&quot;

allowed_methods = [&quot;GET&quot;, &quot;HEAD&quot;, &quot;OPTIONS&quot;, &quot;PUT&quot;, &quot;POST&quot;, &quot;PATCH&quot;, &quot;DELETE&quot;]

cached_methods = [&quot;GET&quot;, &quot;HEAD&quot;]

target_origin_id = &quot;api&quot;

cache_policy_id = &quot;4135ea3d-c35d-46eb-81d7-reintje9aafd&quot; # Managed-CachingDisabled

viewer_protocol_policy = &quot;https-only&quot;

}

Behavior 2: Imagens - cache agressivo

ordered_cache_behavior {

path_pattern = &quot;/images/*&quot;

allowed_methods = [&quot;GET&quot;, &quot;HEAD&quot;]

cached_methods = [&quot;GET&quot;, &quot;HEAD&quot;]

target_origin_id = &quot;assets&quot;

cache_policy_id = &quot;658327ea-f89d-4fab-a63d-7e88639e58f6&quot; # Managed-CachingOptimized

viewer_protocol_policy = &quot;https-only&quot;

}

Behavior padrão - fallback

default_cache_behavior {

allowed_methods = [&quot;GET&quot;, &quot;HEAD&quot;]

cached_methods = [&quot;GET&quot;, &quot;HEAD&quot;]

target_origin_id = &quot;api&quot;

cache_policy_id = &quot;658327ea-f89d-4fab-a63d-7e88639e58f6&quot;

viewer_protocol_policy = &quot;redirect-to-https&quot;

}

restrictions {

geo_restriction {

restriction_type = &quot;none&quot;

}

}

viewer_certificate {

cloudfront_default_certificate = true

}

}</code></pre>

<h2>Cache Policies: Controle Granular de Armazenamento</h2>

<p>Cache Policies são conjuntos de configurações que determinam o tempo de vida (TTL) do cache, quais headers devem ser considerados para variar a resposta em cache e como o CloudFront deve se comportar. Você pode usar políticas gerenciadas pela AWS ou criar personalizadas.</p>

<p>As políticas gerenciadas mais importantes são: Caching Optimized (máximo de cache, sem headers customizados), CachingDisabled (sem cache para APIs dinâmicas) e Custom policies para casos específicos. A política define TTL mínimo, máximo e padrão. É crucial entender que se sua origem envia cache-control headers, o CloudFront respeita o valor mais restritivo entre a política e o header da origem.</p>

<pre><code class="language-javascript">// Exemplo: Cache Policy personalizada para REST API com validação

resource &quot;aws_cloudfront_cache_policy&quot; &quot;api_policy&quot; {

name = &quot;api-cache-policy&quot;

comment = &quot;Política para APIs com cache seletivo&quot;

default_ttl = 300

max_ttl = 600

min_ttl = 0

parameters_in_cache_key_and_forwarded_to_origin {

enable_accept_encoding_gzip = true

enable_accept_encoding_brotli = true

headers_config {

header_behavior = &quot;whitelist&quot;

headers {

items = [&quot;Authorization&quot;, &quot;CloudFront-Viewer-Country&quot;]

}

}

query_strings_config {

query_string_behavior = &quot;whitelist&quot;

query_strings {

items = [&quot;version&quot;, &quot;format&quot;]

}

}

cookies_config {

cookie_behavior = &quot;whitelist&quot;

cookies {

items = [&quot;session-id&quot;]

}

}

}

}

Usando a política

resource &quot;aws_cloudfront_distribution&quot; &quot;api_dist&quot; {

... configurações anteriores ...

default_cache_behavior {

allowed_methods = [&quot;GET&quot;, &quot;HEAD&quot;]

cached_methods = [&quot;GET&quot;, &quot;HEAD&quot;]

target_origin_id = &quot;minha_origem&quot;

cache_policy_id = aws_cloudfront_cache_policy.api_policy.id

viewer_protocol_policy = &quot;https-only&quot;

}

}</code></pre>

<h2>Lambda@Edge: Processamento Dinâmico na Borda</h2>

<p>Lambda@Edge permite executar código Lambda nos edge locations do CloudFront, antes ou depois do cache hit/miss. Isso habilita transformações dinâmicas, autenticação, redirects e customizações sem latência do round-trip ao servidor de origem.</p>

<p>Existem quatro pontos de execução: viewer request (antes de verificar cache), origin request (se não estiver em cache), origin response (após receber da origem) e viewer response (antes de enviar ao cliente). Cada função Lambda deve estar na região <code>us-east-1</code> e precisa assumir a role <code>lambda.amazonaws.com</code> com permissão <code>edgelambda.amazonaws.com</code>.</p>

<pre><code class="language-javascript">// Exemplo: Lambda@Edge para adicionar headers de segurança e rewrite URL

const lambda = require(&#039;aws-lambda&#039;);

exports.handler = async (event, context) =&gt; {

const request = event.Records[0].cf.request;

const headers = request.headers;

// Viewer Request: Validar token

if (request.uri === &#039;/admin&#039; &amp;&amp; !headers[&#039;authorization&#039;]) {

return {

status: &#039;401&#039;,

statusDescription: &#039;Unauthorized&#039;,

body: &#039;Token obrigatório&#039;

};

}

// Origin Response: Adicionar headers de segurança

if (event.Records[0].cf.config.distributionDomainName) {

const response = event.Records[0].cf.response;

response.headers[&#039;strict-transport-security&#039;] = [{

key: &#039;Strict-Transport-Security&#039;,

value: &#039;max-age=31536000; includeSubdomains&#039;

}];

response.headers[&#039;x-content-type-options&#039;] = [{

key: &#039;X-Content-Type-Options&#039;,

value: &#039;nosniff&#039;

}];

return response;

}

// Rewrite de URL para versão mobile

const userAgent = headers[&#039;cloudfront-is-mobile-viewer&#039;];

if (userAgent &amp;&amp; userAgent[0].value === &#039;true&#039;) {

request.uri = &#039;/mobile&#039; + request.uri;

}

return request;

};</code></pre>

<p>Para associar a função Lambda@Edge a um behavior, você precisa publicar uma versão (não pode usar $LATEST) e associá-la via Terraform ou Console:</p>

<pre><code class="language-javascript">resource &quot;aws_lambda_function&quot; &quot;edge&quot; {

filename = &quot;lambda_edge.zip&quot;

function_name = &quot;cloudfront-security&quot;

role = aws_iam_role.lambda_edge_role.arn

handler = &quot;index.handler&quot;

runtime = &quot;nodejs18.x&quot;

publish = true

}

resource &quot;aws_cloudfront_distribution&quot; &quot;com_lambda_edge&quot; {

... configurações anteriores ...

default_cache_behavior {

allowed_methods = [&quot;GET&quot;, &quot;HEAD&quot;]

cached_methods = [&quot;GET&quot;, &quot;HEAD&quot;]

target_origin_id = &quot;minha_origem&quot;

cache_policy_id = &quot;658327ea-f89d-4fab-a63d-7e88639e58f6&quot;

lambda_function_association {

event_type = &quot;viewer-request&quot;

lambda_arn = aws_lambda_function.edge.qualified_arn

include_body = false

}

}

}</code></pre>

<h2>Conclusão</h2>

<p>Dominando CloudFront, você consegue entregar conteúdo com latência mínima globalmente. Os três pilares são: <strong>Behaviors</strong> para direcionar requisições inteligentemente, <strong>Cache Policies</strong> para controlar TTL e headers de variação, e <strong>Lambda@Edge</strong> para processamento dinâmico na borda sem perda de performance. Comece com políticas gerenciadas, evolua para policies customizadas e use Lambda@Edge apenas quando necessário, pois adiciona complexidade e custo.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://docs.aws.amazon.com/cloudfront/" target="_blank" rel="noopener noreferrer">AWS CloudFront Documentation</a></li>

<li><a href="https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-the-cache-key.html" target="_blank" rel="noopener noreferrer">CloudFront Cache Policies Official Guide</a></li>

<li><a href="https://docs.aws.amazon.com/lambda/latest/dg/lambda-edge.html" target="_blank" rel="noopener noreferrer">Lambda@Edge Developer Guide</a></li>

<li><a href="https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/best-practices.html" target="_blank" rel="noopener noreferrer">AWS CloudFront Best Practices</a></li>

<li><a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudfront_distribution" target="_blank" rel="noopener noreferrer">Terraform AWS CloudFront Resource</a></li>

</ul>

Comentários

Mais em Cloud & Infraestrutura

O que Todo Dev Deve Saber sobre CloudShell e AWS CDK: Infraestrutura como Código Nativa da AWS
O que Todo Dev Deve Saber sobre CloudShell e AWS CDK: Infraestrutura como Código Nativa da AWS

CloudShell e AWS CDK: A Fundação da Infraestrutura como Código A infraestrutu...

Dominando Redshift e Athena: Data Warehouse e Query Serverless em S3 em Projetos Reais
Dominando Redshift e Athena: Data Warehouse e Query Serverless em S3 em Projetos Reais

Entendendo Redshift e Athena: Duas Abordagens para Data Warehouse Redshift e...

Guia Completo de Migração para AWS: Estratégias 6R, MGN e Database Migration Service
Guia Completo de Migração para AWS: Estratégias 6R, MGN e Database Migration Service

As Estratégias 6R: Entendendo o Framework As estratégias 6R (Rehost, Replatfo...