DEV Community

Cover image for Lee esto antes de implementar S3 y CloudFront usando Terraform.
Augusto Valdivia for AWS Español

Posted on

Lee esto antes de implementar S3 y CloudFront usando Terraform.

En este artículo, imaginaremos que trabajas para una empresa que está a punto de lanzar una gran campaña de marketing para uno de sus productos más nuevos y esperan que miles de clientes visiten su sitio web. Tu gerente se puso en contacto contigo y compartió esta información, expresando que le gustaría que pensaras en cómo construir un diseño arquitectónico para este sitio web.

Hechos a considerar

  • La campaña de marketing es solo por unos días.
  • La empresa no sabe cuántos espectadores atraerá esta campaña a su sitio web, pero pronostican miles para los primeros días después del lanzamiento de la campaña.
  • Hay una gran preocupación por los ataques DoS/DDoS.
  • Debe estar dentro de su presupuesto.
  • Necesita ser accesible rápidamente desde cualquier lugar del mundo.
  • Para el propósito de este artículo, te enfocarás más en el diseño arquitectónico donde puedes alojar tu sitio web para cumplir con los requisitos asignados para esta tarea y no tanto en el desarrollo del sitio web en sí.

Tener un sitio web es un tema candente, ya que cada negocio necesita uno.

Podrías preguntarte, ¿dónde puedo alojar este sitio web?

Permíteme presentarte dos poderosos servicios de AWS que pueden ayudarte a comenzar este proyecto asegurando una distribución global del contenido del sitio web:

  • AWS CloudFront
  • AWS S3

Diagrama: CloudFront y S3.

Diagrama

¿Qué método utilizaremos para desplegar esta infraestructura?

Desplegaremos esta infraestructura como código (IaC) utilizando Terraform.

¿Qué es Terraform y por qué es tan útil?

"Terraform es una herramienta para construir, cambiar y versionar infraestructura de forma segura y eficiente. Terraform puede gestionar proveedores de servicios existentes y populares, así como soluciones personalizadas internas."

Terraform es una poderosa herramienta declarativa que nos ayuda a gestionar una gran mayoría de servicios en la nube, además de proporcionar consistencia y visibilidad de los cambios en la infraestructura que ocurren en diferentes espacios de trabajo y entornos. Esta funcionalidad no solo mejora la calidad de vida de nuestros proyectos, sino que también mantiene informados a los ingenieros de software y a otros miembros del equipo.

Ten en cuenta que podemos crear o configurar cualquier servidor de AWS a través de la consola de gestión de AWS, pero el problema es que lleva tiempo si haces lo mismo una y otra vez. Al usar Terraform, no necesitamos iniciar sesión en la consola de gestión de AWS y podemos terminar nuestro trabajo solo con la línea de comandos.

En este proyecto encontrarás dos módulos. Un módulo te ayudará a desplegar un bucket S3 para almacenar tus archivos web y también utilizará el punto final del sitio web del bucket S3 desde la función de alojamiento de sitios web estáticos, sirviendo como origen con CloudFront como CDN.

El segundo te ayudará a desplegar buckets S3 para almacenar tus archivos web, pero esta vez CloudFront servirá como CDN así como un origen. Recomiendo el segundo módulo, ya que no necesitarías habilitar el alojamiento de sitios web estáticos en tu bucket porque esta infraestructura utilizará un punto final de API REST del bucket en lugar del punto final del sitio web de la función de alojamiento de sitios web estáticos.

Plantillas de Terraform:

# --- s3_module main file

resource "random_string" "bucket_rs" {
  count   = var.s3_count
  length  = 4
  special = false
  upper   = false

}
resource "aws_s3_bucket" "exos_bucket" {
  count = var.s3_count
  bucket = join("-", ["exos-bucket", random_string.bucket_rs[count.index].result])
  acl    = "public-read-write"
}

resource "aws_cloudfront_distribution" "exos_distribution" {
  count = var.s3_count
  origin {

    custom_origin_config {
      http_port = "80"
      https_port = "443"
      origin_protocol_policy = "match-viewer"
      origin_ssl_protocols = ["TLSv1", "TLSv1.1", "TLSv1.2"]

    }

    domain_name = aws_s3_bucket.exos_bucket[count.index].bucket_regional_domain_name
    origin_id = "exos_distribution"

  }

  enabled = true
  default_root_object = "index.html"

  default_cache_behavior {
    viewer_protocol_policy = "redirect-to-https"
    compress = true
    allowed_methods = ["GET", "HEAD", "OPTIONS", "PUT", "POST", "PATCH", "DELETE"]
    cached_methods = ["GET", "HEAD"]
    target_origin_id = "exos_distribution"
    min_ttl                = 0
    default_ttl            = 86400
    max_ttl                = 31536000




    forwarded_values {
      query_string = false
      cookies {
        forward = "none"
      }
    }

  }

  price_class = "PriceClass_All"

  restrictions {
    geo_restriction {
      restriction_type = "whitelist"
      locations        = ["US", "CA", "GB", "DE"]
    }

  }

  viewer_certificate {
    cloudfront_default_certificate = true
  }
}
Enter fullscreen mode Exit fullscreen mode

¿Qué es CloudFront?

"CloudFront es un servicio de Red de Entrega de Contenido (CDN) rápido. CloudFront proporcionará a nuestro proyecto una red distribuida global que servirá como caché de contenido, como imágenes, videos y archivos estáticos desde centros de datos distribuidos llamados ubicaciones de borde."

Mientras CloudFront mejora la experiencia del usuario al entregar contenido estático, también puede ser utilizado para gestionar múltiples solicitudes de usuarios mientras entrega excelentes servicios a los clientes. Pero las características de CloudFront no terminan aquí. Tiene increíbles características de seguridad integradas, como la mitigación de ataques DoS/DDoS, la Identidad de Acceso de Origen (OAI), que utilizaremos para controlar sin problemas el acceso a nuestros buckets S3. También podemos usar la función de geolocalización en la distribución de CloudFront, que puede ayudarnos a servir nuestro contenido dentro de ciertas regiones o países. Hay más características que esto, pero para el propósito de este artículo mencionaré solo algunas.

Un punto interesante a mencionar es que entregar contenido a través de CloudFront será más rentable cuando el número de solicitudes crezca en comparación con S3, así como cuando los datos transferidos entre los servicios de AWS y CloudFront no estén sujetos al costo de transferencia de datos.

¿Qué es S3?

"Amazon Simple Storage Service (Amazon S3) es un servicio de almacenamiento de objetos que ofrece escalabilidad, disponibilidad de datos, seguridad y rendimiento líderes en la industria."

Además de ser un servicio de almacenamiento de objetos, S3 también puede alojar sitios web estáticos con técnicas del lado del cliente, como HTML, CSS y JavaScript, que no requieren scripts del lado del servidor, como PHP o ASP.NET.

El aspecto más fácil de tener S3 como un bucket de alojamiento de sitios web es que no necesitaremos solicitar un formulario para alojar nuestro sitio web estático ni pagar ningún costo inicial. Una vez que el sitio web estático de S3 esté configurado, se generará automáticamente un punto final de sitio web de Amazon S3 para el bucket. Utilizaremos el punto final del sitio web para probar la velocidad y el rendimiento.

Otro punto importante de ahorro de costos es que, en lugar de ejecutar servidores web como Nginx o Apache en instancias EC2, que pueden ser costosos, podemos alojar los archivos estáticos en S3.

Enlace al calculador mensual simple de S3 aquí

Velocidad de entrega de DNS de contenido utilizando el punto final del sitio web de CloudFront frente al punto final del sitio web de S3.

Usando AWS CloudFront name.cloudfront.net frente a bucketname-x23x.s3.amazonaws.com puntuación de rendimiento.

Alt Text

El mapa de solicitudes muestra cada una de las ubicaciones desde las cuales se perfiló el sitio web.

Alt Text

Alt Text

Puntuaciones de rendimiento promedio proporcionan una visión básica del tiempo de ida y vuelta de cualquier ubicación.

Alt Text

Conclusión

Ambos servicios, AWS CloudFront y AWS S3, se complementan entre sí y pueden ofrecerte un espacio poderoso para alojar tu sitio web y vale la pena intentarlo.

Beneficios de usar S3 y CloudFront:

Velocidad CDN más rápida con CloudFront.
Bajo costo de almacenamiento con S3 y transferencia de datos gratuita a CloudFront. Fuerte seguridad para ambos.

Es importante señalar que esta infraestructura puede ser más robusta al agregar otros servidores como AWS WAF, AWS Shield o Route53, que probablemente agregaré en un artículo posterior 😊.

Tener Terraform en la mezcla facilita la creación, destrucción de recursos, pruebas y depuración de tus proyectos.

Este proyecto de Terraform está diseñado dinámicamente para desplegar uno o más buckets S3 según tus requisitos. También crea una asociación de CDN de CloudFront para cada bucket.

Encuentra el repositorio de Terraform y las direcciones para este proyecto aquí

¿Listo para optimizar tus implementaciones de AWS?

Comienza a usar Terraform para gestionar tu infraestructura como código. Experimenta con el código proporcionado y comparte tus experiencias en los comentarios. Si te gustó este artículo, sígueme para más contenido sobre AWS y Terraform.

Tu participación es valiosa, y me encantaría saber de tus comentarios.

Top comments (0)