

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Sirva contenido estático en un bucket de Amazon S3 a través de una VPC mediante 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*

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

Cuando publicas contenido estático alojado en Amazon Web Services (AWS), el enfoque recomendado es utilizar un depósito de Amazon Simple Storage Service (S3) como origen y utilizar CloudFront Amazon para distribuir el contenido. Esta solución tiene dos ventajas principales: la comodidad de almacenar en caché el contenido estático en ubicaciones periféricas y la posibilidad de definir [listas de control de acceso web](https://docs.aws.amazon.com/waf/latest/developerguide/web-acl.html) (web ACLs) para la CloudFront distribución, lo que le ayuda a proteger las solicitudes de contenido con una configuración y una sobrecarga administrativa mínimas.

Sin embargo, el enfoque estándar recomendado tiene una limitación arquitectónica común. En algunos entornos, puede ser deseable que los dispositivos de firewall virtual se implementen en una nube privada virtual (VPC) para inspeccionar todo el contenido, incluido el contenido estático. El enfoque estándar no dirige el tráfico a través de la VPC para su inspección. Este patrón proporciona una solución arquitectónica alternativa. Se sigue utilizando una CloudFront distribución para ofrecer contenido estático en un bucket de S3, pero el tráfico se enruta a través de la VPC mediante un Application Load Balancer. A continuación, una función de AWS Lambda recupera y devuelve el contenido del bucket de S3.

## Requisitos previos y limitaciones
<a name="serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront-prereqs"></a>

**Requisitos previos**
+ Una cuenta de AWS activa.
+ Contenido estático del sitio web alojado en un bucket de S3.

**Limitaciones**
+ Los recursos de este patrón deben estar en una sola región de AWS, pero se pueden aprovisionar en diferentes cuentas de AWS.
+ Los límites se aplican al tamaño máximo de solicitud y respuesta que la función de Lambda puede, respectivamente, recibir y enviar. Para obtener más información, consulte *Límites* en [Funciones de Lambda como destinos](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html) (documentación de Elastic Load Balancing).
+ Al usar este enfoque, es importante encontrar un buen equilibrio entre el rendimiento, la escalabilidad, la seguridad y la rentabilidad. A pesar de la alta escalabilidad de Lambda, si el número de invocaciones simultáneas de Lambda supera la cuota máxima, algunas solicitudes se limitarán. Para más información, consulte las cuotas de Lambda (documentación de Lambda). También debe tener en cuenta los precios de uso de Lambda. Para minimizar las invocaciones a Lambda, asegúrese de definir correctamente la caché de la distribución. CloudFront Para obtener más información, consulte [Optimización del almacenamiento en caché y la disponibilidad (documentación)CloudFront .](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/ConfiguringCaching.html)

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

**Pila de tecnología de destino**
+ CloudFront
+ Amazon Virtual Private Cloud (Amazon VPC)
+ Equilibrador de carga de aplicación
+ Lambda
+ Amazon S3

**Arquitectura de destino**

La siguiente imagen muestra la arquitectura sugerida cuando es necesario utilizarla CloudFront para servir contenido estático desde un bucket de S3 a través de una VPC.

![El tráfico fluye a través de los equilibradores de carga de aplicación en la VPC hacia la función de Lambda.](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/e0dd6928-4fe0-47ab-954f-9de5563349d8/images/b42c7dd9-4a72-4998-bf88-195c8f90ed3e.png)


1. El cliente solicita la URL de CloudFront distribución para incluir un archivo de sitio web concreto en el bucket de S3.

1. CloudFront envía la solicitud a AWS WAF. AWS WAF filtra la solicitud mediante la web ACLs aplicada a la CloudFront distribución. Si se determina que la solicitud es válida, el flujo continúa. Si se determina que la solicitud no es válida, el cliente recibe un error 403.

1. CloudFront comprueba su caché interna. Si hay una clave válida que coincida con la solicitud entrante, el valor asociado se devuelve al cliente como respuesta. Si no es así, el flujo continúa.

1. CloudFront reenvía la solicitud a la URL del Application Load Balancer especificado.

1. El equilibrador de carga de aplicación tiene un oyente asociado a un grupo objetivo basado en una función de Lambda. El equilibrador de carga de aplicación invoca la función de Lambda.

1. La función de Lambda se conecta al bucket de S3, realiza una operación `GetObject` en él y devuelve el contenido como respuesta.

**Automatización y escala**

Para automatizar la implementación de contenido estático mediante este enfoque, cree CI/CD canalizaciones para actualizar los buckets de Amazon S3 que alojan sitios web.

La función de Lambda escala automáticamente para gestionar las solicitudes concurrentes, dentro de las cuotas y limitaciones del servicio. Para obtener más información, consulte [Escalado de función de Lambda](https://docs.aws.amazon.com/lambda/latest/dg/invocation-scaling.html) y [Cuotas de Lambda](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html) (documentación de Lambda). Para los demás servicios y características de AWS, como CloudFront el Application Load Balancer, AWS los escala automáticamente.

## Tools (Herramientas)
<a name="serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront-tools"></a>
+ [Amazon CloudFront](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Introduction.html) acelera la distribución de tu contenido web al distribuirlo a través de una red mundial de centros de datos, lo que reduce la latencia y mejora el rendimiento.
+ [Elastic Load Balancing (ELB)](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) distribuye el tráfico entrante de aplicaciones o redes entre varios destinos. En este patrón, se emplea un [equilibrador de carga de aplicación](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html), aprovisionado mediante Elastic Load Balancing, para dirigir el tráfico a la función de Lambda.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) es un servicio de computación que ayuda a ejecutar código sin necesidad de aprovisionar ni administrar servidores. Ejecuta el código solo cuando es necesario y amplía la capacidad de manera automática, por lo que solo pagará por el tiempo de procesamiento que utilice.
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) es un servicio de almacenamiento de objetos basado en la nube que le ayuda a almacenar, proteger y recuperar cualquier cantidad de datos.
+ [Amazon Virtual Private Cloud (Amazon VPC)](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) le permite lanzar recursos de AWS en una red virtual que haya definido. Esta red virtual es similar a la red tradicional que utiliza en su propio centro de datos, con los beneficios de usar la infraestructura escalable de AWS.

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

### Se utiliza CloudFront para ofrecer contenido estático de Amazon S3 a través de una VPC
<a name="use-cloudfront-to-serve-static-content-from-amazon-s3-through-a-vpc"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree una VPC. | Cree una VPC para alojar los recursos implementados en este patrón, como el equilibrador de carga de aplicación y la función de Lambda.  Para obtener instrucciones, consulte [Crear una VPC](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-vpcs.html#Create-VPC) (documentación de Amazon VPC). | Arquitecto de la nube | 
| Cree una ACL web de AWS WAF. | Cree una ACL web de AWS WAF. Más adelante en este patrón, se aplica esta ACL web a la CloudFront distribución. Para obtener instrucciones, consulte [Crear una ACL web](https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-creating.html) (documentación de AWS WAF). | Arquitecto de la nube | 
| Crear la función de Lambda. | Cree la función de Lambda que sirva el contenido estático alojado en el bucket de S3 como sitio web. Use el código que se proporciona en la sección de [Información adicional](#serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront-additional) de este patrón. Personalice el código para identificar su bucket de S3 de destino. | AWS general | 
| Cargar la función de Lambda. | Introduzca el siguiente comando para cargar el código de la función de Lambda en un archivo .zip en Lambda.<pre>aws lambda update-function-code \<br />--function-name  \ <br />--zip-file fileb://lambda-alb-s3-website.zip</pre> | AWS general | 
| Cree un Equilibrador de carga de aplicación. | Cree un equilibrador de carga de aplicación con acceso a Internet que apunte a la función de Lambda. Para obtener instrucciones, consulte [Crear un grupo de destino para la función de Lambda](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html#register-lambda-function) (documentación de Elastic Load Balancing). Para una configuración de alta disponibilidad, cree el equilibrador de carga de aplicación y adjúntelo a subredes privadas en distintas zonas de disponibilidad. | Arquitecto de la nube | 
| Cree una CloudFront distribución. | Cree una CloudFront distribución que apunte al Application Load Balancer que creó.[See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront.html) | Arquitecto de la nube | 

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

**Documentación de AWS**
+ [Optimización del almacenamiento en caché y la disponibilidad](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/ConfiguringCaching.html) (CloudFront documentación)
+ [Funciones de Lambda como destinos](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html) (documentación de Elastic Load Balancing)
+ [Cuotas de Lambda](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html) (documentación de Lambda)

**Sitios web de servicios de AWS**
+ [Equilibrador de carga de aplicación](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/)

## Información adicional
<a name="serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront-additional"></a>

**Código**

El siguiente ejemplo de función de Lambda está escrito en Node.js. Esta función de Lambda actúa como un servidor web que realiza una operación `GetObject` en un bucket de S3 que contiene los recursos del sitio web. 

```
/**

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