Servir conteúdo estático em um bucket do Amazon S3 por meio de uma VPC usando o Amazon CloudFront - Recomendações da AWS

Servir conteúdo estático em um bucket do Amazon S3 por meio de uma VPC usando o Amazon CloudFront

Angel Emmanuel Hernandez Cebrian, Amazon Web Services

Resumo

Quando você veicula conteúdo estático hospedado na Amazon Web Services (AWS), a abordagem recomendada é usar um bucket do Amazon Simple Storage Service (S3) como origem e usar o Amazon CloudFront para distribuir o conteúdo. Esta solução apresenta dois benefícios principais: a conveniência do armazenamento em cache para conteúdo estático nos locais da borda e a possibilidade de definição de listas de controle de acesso da web (ACLs da web) para a distribuição do CloudFront, o que ajuda a proteger as solicitações ao conteúdo com configuração e sobrecarga administrativa mínimas.

No entanto, há uma limitação arquitetônica comum à abordagem padrão recomendada. Em alguns ambientes, você deseja que dispositivos de firewall virtual sejam implantados em uma nuvem privada virtual (VPC) para inspecionar todo o conteúdo, inclusive conteúdo estático. A abordagem padrão não direciona o tráfego pela VPC para inspeção. Esse padrão fornece uma solução arquitetônica alternativa. Você ainda usa uma distribuição do CloudFront para servir conteúdo estático em um bucket do S3, mas o tráfego é roteado pela VPC usando um Application Load Balancer. Em seguida, uma função do AWS Lambda recupera e retorna o conteúdo do bucket do S3.

Pré-requisitos e limitações

Pré-requisitos

  • Uma conta AWS ativa

  • Conteúdo estático do site hospedado em um bucket S3.

Limitações

  • Os recursos nesse padrão devem estar em uma única região da AWS, mas podem ser provisionados em diferentes contas da AWS.

  • Os limites se aplicam ao tamanho máximo de solicitação e resposta que a função do Lambda pode receber e enviar, respectivamente. Para obter mais informações, consulte Limites em Funções do Lambda como destino (documentação do Elastic Load Balancing).

  • É importante encontrar um bom equilíbrio entre desempenho, escalabilidade, segurança e economia ao usar essa abordagem. Apesar da alta escalabilidade do Lambda, se o número de invocações simultâneas do Lambda exceder a cota máxima, algumas solicitações serão limitadas. Para obter mais informações, consulte cotas do Lambda (documentação do Lambda). Você também precisa considerar os preços ao usar o Lambda. Para minimizar as invocações do Lambda, certifique-se de definir adequadamente o cache para a distribuição do CloudFront. Para obter mais informações, consulte Otimização do armazenamento em cache e disponibilidade (documentação do CloudFront).

Arquitetura

Pilha de tecnologias de destino  

  • CloudFront

  • Amazon Virtual Private Cloud (Amazon VPC)

  • Application Load Balancer

  • Lambda

  • Amazon S3

Arquitetura de destino

A imagem a seguir mostra a arquitetura sugerida quando você precisa usar o CloudFront para servir conteúdo estático de um bucket do S3 por meio de uma VPC.

O tráfego flui por meio de Application Load Balancers na VPC para a função do Lambda.
  1. O cliente solicita o URL da distribuição do CloudFront para obter um arquivo de site específico no bucket do S3.

  2. O CloudFront envia a solicitação para o AWS WAF. O AWS WAF filtra a solicitação usando as ACLs da web aplicadas à distribuição do CloudFront. Se a solicitação for determinada como válida, o fluxo continuará. Se a solicitação for determinada como inválida, o cliente receberá um erro 403.

  3. O CloudFront verifica seu cache interno. Se houver uma chave válida correspondente à solicitação recebida, o valor associado será enviado de volta ao cliente como resposta. Caso contrário, o fluxo continua.

  4. O CloudFront encaminha a solicitação para o URL do Application Load Balancer especificado.

  5. O Application Load Balancer tem um receptor associado a um grupo de destino baseado em uma função do Lambda. O Application Load Balancer invoca a função do Lambda.

  6. A função do Lambda se conecta ao bucket do S3, executa uma operação GetObject nele e retorna o conteúdo como resposta.

Automação e escala

Para automatizar a implantação de conteúdo estático usando essa abordagem, crie pipelines de CI/CD para atualizar os buckets do Amazon S3 que hospedam sites.

A função do Lambda é escalada automaticamente para lidar com as solicitações simultâneas, dentro das cotas e limitações do serviço. Para obter mais informações, consulte Dimensionamento da função do Lambda e Cotas do Lambda (documentação do Lambda). Outros serviços e atributos da AWS, como o CloudFront e o Application Load Balancer, são escalados automaticamente pela AWS.

Ferramentas

  • O Amazon CloudFront acelera a distribuição do seu conteúdo web ao entregá-lo por meio de uma rede mundial de datacenters, o que reduz a latência e melhora o desempenho.

  • O Elastic Load Balancing (ELB) distribui o tráfego de entrada de aplicativos ou de rede em vários destinos. Nesse padrão, você usa um Application Load Balancer provisionado por meio do Elastic Load Balancing para direcionar o tráfego para a função do Lambda.

  • O AWS Lambda é um serviço de computação que ajuda você a executar código sem exigir provisionamento ou gerenciamento de servidores. Ele executa o código somente quando necessário e dimensiona automaticamente, assim, você paga apenas pelo tempo de computação usado.

  • O Amazon Simple Storage Service (Amazon S3) é um serviço de armazenamento de objetos baseado na nuvem que ajuda você a armazenar, proteger e recuperar qualquer quantidade de dados.

  • A Amazon Virtual Private Cloud (Amazon VPC) ajuda a iniciar recursos da AWS em uma rede virtual definida por você. Essa rede virtual é semelhante a uma rede tradicional que você operaria no próprio datacenter, com os benefícios de usar a infraestrutura escalável da AWS.

Épicos

TarefaDescriçãoHabilidades necessárias

Crie uma VPC.

Crie uma VPC para hospedar os recursos implantados nesse padrão, como o Application Load Balancer e a função do Lambda.  Para obter instruções, consulte Criar uma VPC (documentação da Amazon VPC).

Arquiteto de nuvem

Crie uma ACL web do AWS WAF.

Crie uma ACL web do AWS WAF. Posteriormente nesse padrão, você aplica essa ACL da web à distribuição do CloudFront. Para obter instruções, consulte Criação de uma ACL da web (documentação do AWS WAF).

Arquiteto de nuvem

Criar a função do Lambda.

Crie a função do Lambda que serve o conteúdo estático hospedado no bucket do S3 como um site. Use o código fornecido na seção Informações adicionais desse padrão. Personalize o código para identificar o bucket do S3 de destino.

AWS geral

Upload a função do Lambda.

Insira o comando a seguir para carregar o código da função do Lambda em um arquivo de arquivo .zip no Lambda.

aws lambda update-function-code \ --function-name \ --zip-file fileb://lambda-alb-s3-website.zip
AWS geral

Criar um Application Load Balancer.

Crie um Application Load Balancer voltado para a Internet que aponte para a função do Lambda. Para obter instruções, consulte Criar um grupo de destino para a função do Lambda (documentação do Elastic Load Balancing). Para criar uma configuração de alta disponibilidade, crie o Application Load Balancer e conecte-o a sub-redes privadas em diferentes zonas de disponibilidade.

Arquiteto de nuvem

Crie uma distribuição na do CloudFront.

Crie uma distribuição do CloudFront que aponte para o Application Load Balancer que você criou.

  1. Faça login no Console de Gerenciamento da AWS e abra o console do CloudFront em https://console.aws.amazon.com/cloudfront/v3/home.

  2. Escolha Criar distribuição.

  3. Na primeira página do assistente Criar distribuição, na seção Web, escolha Começar a usar.

  4. Especifique as configurações para sua distribuição. Para obter mais informações, consulte Valores especificados ao criar ou atualizar uma distribuição. Observe o seguinte:

    1. Defina o Application Load Balancer como origem.

    2. Em Configurações de distribuição, selecione as ACLs da web existentes que você deseja aplicar por meio do AWS WAF. Para obter mais informações, consulte AWS WAF web ACL.

  5. Salve as alterações.

  6. Depois que o CloudFront criar a sua distribuição, o valor da coluna Status altera InProgress (Em andamento) para Deployed (Implantado). Se você optar por permitir a distribuição, ela estará pronta para processar solicitações depois que o status mudar para Implantado.

Arquiteto de nuvem

Recursos relacionados

Documentação da AWS

Sites de serviços da AWS

Mais informações

Código da

O exemplo de função do Lambda a seguir foi escrito em Node.js. Essa função do Lambda atua como um servidor web que executa uma operação GetObject em um bucket do S3 que contém os recursos do site.

/** * This is an AWS Lambda function created for demonstration purposes. * It retrieves static assets from a defined Amazon S3 bucket. * To make the content available through a URL, use an Application Load Balancer with a Lambda integration. * * Set the S3_BUCKET environment variable in the Lambda function definition. */ var AWS = require('aws-sdk'); exports.handler = function(event, context, callback) { var bucket = process.env.S3_BUCKET; var key = event.path.replace('/', ''); if (key == '') { key = 'index.html'; } // Fetch from S3 var s3 = new AWS.S3(); return s3.getObject({Bucket: bucket, Key: key}, function(err, data) { if (err) { return err; } var isBase64Encoded = false; var encoding = 'utf8'; if (data.ContentType.indexOf('image/') > -1) { isBase64Encoded = true; encoding = 'base64' } var resp = { statusCode: 200, headers: { 'Content-Type': data.ContentType, }, body: new Buffer(data.Body).toString(encoding), isBase64Encoded: isBase64Encoded }; callback(null, resp); } ); };