<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 "aws_cloudfront_distribution" "exemplo" {
origin {
domain_name = "meusite.com.br"
origin_id = "minhaOrigemPrincipal"
}
enabled = true
default_root_object = "index.html"
default_cache_behavior {
allowed_methods = ["GET", "HEAD"]
cached_methods = ["GET", "HEAD"]
target_origin_id = "minhaOrigemPrincipal"
forwarded_values {
query_string = false
cookies {
forward = "none"
}
}
viewer_protocol_policy = "redirect-to-https"
min_ttl = 0
default_ttl = 3600
max_ttl = 86400
}
restrictions {
geo_restriction {
restriction_type = "none"
}
}
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 "aws_cloudfront_distribution" "avancada" {
origin {
domain_name = "api.meusite.com"
origin_id = "api"
}
origin {
domain_name = "cdn.meusite.com"
origin_id = "assets"
}
enabled = true
Behavior 1: Requisições API - sem cache
ordered_cache_behavior {
path_pattern = "/api/*"
allowed_methods = ["GET", "HEAD", "OPTIONS", "PUT", "POST", "PATCH", "DELETE"]
cached_methods = ["GET", "HEAD"]
target_origin_id = "api"
cache_policy_id = "4135ea3d-c35d-46eb-81d7-reintje9aafd" # Managed-CachingDisabled
viewer_protocol_policy = "https-only"
}
Behavior 2: Imagens - cache agressivo
ordered_cache_behavior {
path_pattern = "/images/*"
allowed_methods = ["GET", "HEAD"]
cached_methods = ["GET", "HEAD"]
target_origin_id = "assets"
cache_policy_id = "658327ea-f89d-4fab-a63d-7e88639e58f6" # Managed-CachingOptimized
viewer_protocol_policy = "https-only"
}
Behavior padrão - fallback
default_cache_behavior {
allowed_methods = ["GET", "HEAD"]
cached_methods = ["GET", "HEAD"]
target_origin_id = "api"
cache_policy_id = "658327ea-f89d-4fab-a63d-7e88639e58f6"
viewer_protocol_policy = "redirect-to-https"
}
restrictions {
geo_restriction {
restriction_type = "none"
}
}
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 "aws_cloudfront_cache_policy" "api_policy" {
name = "api-cache-policy"
comment = "Política para APIs com cache seletivo"
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 = "whitelist"
headers {
items = ["Authorization", "CloudFront-Viewer-Country"]
}
}
query_strings_config {
query_string_behavior = "whitelist"
query_strings {
items = ["version", "format"]
}
}
cookies_config {
cookie_behavior = "whitelist"
cookies {
items = ["session-id"]
}
}
}
}
Usando a política
resource "aws_cloudfront_distribution" "api_dist" {
... configurações anteriores ...
default_cache_behavior {
allowed_methods = ["GET", "HEAD"]
cached_methods = ["GET", "HEAD"]
target_origin_id = "minha_origem"
cache_policy_id = aws_cloudfront_cache_policy.api_policy.id
viewer_protocol_policy = "https-only"
}
}</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('aws-lambda');
exports.handler = async (event, context) => {
const request = event.Records[0].cf.request;
const headers = request.headers;
// Viewer Request: Validar token
if (request.uri === '/admin' && !headers['authorization']) {
return {
status: '401',
statusDescription: 'Unauthorized',
body: 'Token obrigatório'
};
}
// Origin Response: Adicionar headers de segurança
if (event.Records[0].cf.config.distributionDomainName) {
const response = event.Records[0].cf.response;
response.headers['strict-transport-security'] = [{
key: 'Strict-Transport-Security',
value: 'max-age=31536000; includeSubdomains'
}];
response.headers['x-content-type-options'] = [{
key: 'X-Content-Type-Options',
value: 'nosniff'
}];
return response;
}
// Rewrite de URL para versão mobile
const userAgent = headers['cloudfront-is-mobile-viewer'];
if (userAgent && userAgent[0].value === 'true') {
request.uri = '/mobile' + 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 "aws_lambda_function" "edge" {
filename = "lambda_edge.zip"
function_name = "cloudfront-security"
role = aws_iam_role.lambda_edge_role.arn
handler = "index.handler"
runtime = "nodejs18.x"
publish = true
}
resource "aws_cloudfront_distribution" "com_lambda_edge" {
... configurações anteriores ...
default_cache_behavior {
allowed_methods = ["GET", "HEAD"]
cached_methods = ["GET", "HEAD"]
target_origin_id = "minha_origem"
cache_policy_id = "658327ea-f89d-4fab-a63d-7e88639e58f6"
lambda_function_association {
event_type = "viewer-request"
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>