

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Ofereça conteúdo estático em um bucket do Amazon S3 por meio de uma VPC usando a Amazon CloudFront
<a name="serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront"></a>

*Angel Emmanuel Hernandez Cebrian, Amazon Web Services*

## Resumo
<a name="serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront-summary"></a>

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 a Amazon CloudFront para distribuir o conteúdo. Essa solução tem dois benefícios principais: a conveniência de armazenar em cache conteúdo estático em locais periféricos e a capacidade de definir [listas de controle de acesso à web](https://docs.aws.amazon.com/waf/latest/developerguide/web-acl.html) (web ACLs) para a CloudFront distribuição, o que ajuda a proteger as solicitações de conteúdo com o mínimo de configuração e sobrecarga administrativa.

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 CloudFront distribuição para veicular 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
<a name="serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront-prereqs"></a>

**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](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html) (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. CloudFront Para obter mais informações, consulte [Otimizando o armazenamento em cache e a disponibilidade](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/ConfiguringCaching.html) (CloudFront documentação).

## Arquitetura
<a name="serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront-architecture"></a>

**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 usá-la 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.\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/images/pattern-img/e0dd6928-4fe0-47ab-954f-9de5563349d8/images/b42c7dd9-4a72-4998-bf88-195c8f90ed3e.png)


1. O cliente solicita o URL de CloudFront distribuição para obter um arquivo de site específico no bucket do S3.

1. CloudFront envia a solicitação para o AWS WAF. O AWS WAF filtra a solicitação usando a web ACLs aplicada à CloudFront distribuição. 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.

1. 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.

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

1. 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.

1. 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 CI/CD pipelines 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](https://docs.aws.amazon.com/lambda/latest/dg/invocation-scaling.html) e [Cotas do Lambda](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html) (documentação do Lambda). Para os outros serviços e recursos da AWS, como CloudFront o Application Load Balancer, a AWS os escala automaticamente.

## Ferramentas
<a name="serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront-tools"></a>
+ [A Amazon CloudFront](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Introduction.html) acelera a distribuição do seu conteúdo da web entregando-o por meio de uma rede mundial de data centers, o que reduz a latência e melhora o desempenho.
+ O [Elastic Load Balancing (ELB)](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) distribui o tráfego de entrada de aplicativos ou de rede em vários destinos. Nesse padrão, você usa um [Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html) provisionado por meio do Elastic Load Balancing para direcionar o tráfego para a função do Lambda.
+ O [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) é 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)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) é 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)](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) 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
<a name="serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront-epics"></a>

### Use CloudFront para servir conteúdo estático do Amazon S3 por meio de uma VPC
<a name="use-cloudfront-to-serve-static-content-from-amazon-s3-through-a-vpc"></a>


| Tarefa | Description | Habilidades 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](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-vpcs.html#Create-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 à CloudFront distribuição. Para obter instruções, consulte [Criação de uma ACL da web](https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-creating.html) (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](#serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront-additional) 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.<pre>aws lambda update-function-code \<br />--function-name  \ <br />--zip-file fileb://lambda-alb-s3-website.zip</pre> | 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](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html#register-lambda-function) (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 CloudFront distribuição. | Crie uma CloudFront distribuição que aponte para o Application Load Balancer que você criou.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront.html) | Arquiteto de nuvem | 

## Recursos relacionados
<a name="serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront-resources"></a>

**Documentação da AWS**
+ [Otimizando o armazenamento em cache e a disponibilidade (documentação](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/ConfiguringCaching.html)) CloudFront 
+ [Funções do Lambda como destino](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html) (documentação do Elastic Load Balancing)
+ [Cotas Lambda](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html) (documentação Lambda)

**Sites de serviços da AWS**
+ [Application Load Balancer](https://aws.amazon.com/es/elasticloadbalancing/application-load-balancer/)
+ [Lambda](https://aws.amazon.com/en/lambda/)
+ [CloudFront](https://aws.amazon.com/en/cloudfront/)
+ [Amazon S3](https://aws.amazon.com/en/s3/)
+ [AWS WAF](https://aws.amazon.com/en/waf/)
+ [Amazon VPC](https://aws.amazon.com/en/vpc/)

## Mais informações
<a name="serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront-additional"></a>

**Código **

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);
        }
    );
};
```