<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rodolfo Sáenz</title>
    <description>The latest articles on DEV Community by Rodolfo Sáenz (@rodossaenz).</description>
    <link>https://dev.to/rodossaenz</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F381156%2F4d03d45c-f444-4663-8550-3bd3b5da3adf.png</url>
      <title>DEV Community: Rodolfo Sáenz</title>
      <link>https://dev.to/rodossaenz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rodossaenz"/>
    <language>en</language>
    <item>
      <title>Amazon CloudFront Failover 🛟 con grupo de orígenes - Parte 2</title>
      <dc:creator>Rodolfo Sáenz</dc:creator>
      <pubDate>Tue, 16 Apr 2024 04:39:27 +0000</pubDate>
      <link>https://dev.to/rodossaenz/amazon-cloudfront-failover-con-grupo-de-origenes-parte-2-2apc</link>
      <guid>https://dev.to/rodossaenz/amazon-cloudfront-failover-con-grupo-de-origenes-parte-2-2apc</guid>
      <description>&lt;p&gt;Hola todos 👋, continuando con el artículo &lt;a href="https://dev.to/rodossaenz/aws-cloudfront-con-grupos-de-orignes-como-failover-37ba"&gt;Amazon CloudFront Failover 🛟 con grupo de orígenes - Parte 1&lt;/a&gt; donde mostraba una breve y práctica solución de implementar un failover en una distribución de contenido usando Amazon CloudFront, aquí veremos como configurarla en la consola de AWS. Vamos a ello..&lt;/p&gt;

&lt;h2&gt;
  
  
  Buckets en Amazon S3
&lt;/h2&gt;

&lt;p&gt;Creamos los orígenes. En este caso son buckets de S3. Al crearlos nos aseguramos que estén en regiones distintas. En la imagen vemos que creo uno en &lt;em&gt;US East (N. Virginia) us-east-1&lt;/em&gt;. Así mismo crearé otro en &lt;em&gt;US West (N. California) us-west-1&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0bo0talf2ln8fyqufpny.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0bo0talf2ln8fyqufpny.png" alt="Creación de bucket S3" width="800" height="492"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mantendremos las configuraciones por &lt;em&gt;default&lt;/em&gt; al crearlos. Entre ellas están:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Object Ownership: Bucket owner enforced&lt;/li&gt;
&lt;li&gt;Block Public Access settings for this bucket: Block all public access&lt;/li&gt;
&lt;li&gt;Bucket Versioning: Disabled&lt;/li&gt;
&lt;li&gt;Default encryption: Server-side encryption with Amazon S3 managed keys (SSE-S3)&lt;/li&gt;
&lt;li&gt;Object Lock: Dissbled&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estas opciones te pueden salir así en inglés o español, depende de la configuración de tu cuenta de AWS o del navegador que estés usando.&lt;/p&gt;

&lt;p&gt;Más adelante añadiremos algunas políticas para que solo sea accedido desde Cloudfront, pero más adelante, calma.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcvysqdzubs2mbwhn85am.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcvysqdzubs2mbwhn85am.png" alt="Dos buckets creados en distintas regiones" width="800" height="107"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;De esta manera ya tenemos nuestros dos bucket. Vayamos al siguiente paso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contenido en buckets
&lt;/h2&gt;

&lt;p&gt;Para que vayamos preparados y listos a configurar nuestra distribución de CloudFront, nuestros buckets deben tener algún contenido no?&lt;/p&gt;

&lt;p&gt;Lo que he hecho es crear dos archivos HTML sencillos que muestren un texto en grande diciendo en qué región están. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozs6yy9c26e03q5j4usp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozs6yy9c26e03q5j4usp.png" alt="VS Code mostrando ambos archivos index.html" width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Los he nombrado index.html y los he subido a cada bucket.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd0835i8pjvau34h22rge.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd0835i8pjvau34h22rge.png" alt="Origen 1 con index.html" width="800" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwj7tdz1sl34jz7zmu7j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwj7tdz1sl34jz7zmu7j.png" alt="Origen 2 con index.html" width="800" height="613"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Listo nuestro contenido. Nota, he subido un html sencillo, pero esto bien puede ser una aplicación completa en angular, react, vue, un pack de imágenes, videos o lo que fuese.&lt;/p&gt;

&lt;h2&gt;
  
  
  Origin Access Control
&lt;/h2&gt;

&lt;p&gt;Antes de crear la distribución pasemos por el departamento de seguridad. &lt;em&gt;Origin Access Control&lt;/em&gt; (OAC, control de acceso de origen) es una característica de Amazon CloudFront que ayuda a los clientes a proteger fácilmente sus orígenes de S3, ya que solo permite que las distribuciones de CloudFront designadas tengan acceso a sus buckets de S3. Y es lo que vamos hacer.&lt;/p&gt;

&lt;p&gt;Estando en la página del servicio de CloudFront, vamos al menú izquierdo y buscamos &lt;em&gt;Security - Origin access&lt;/em&gt;. Creamos uno nuevo&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2dw1mk5anf8dibqvlop3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2dw1mk5anf8dibqvlop3.png" alt="Creación OAC" width="800" height="796"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y así hemos creado nuestro OAC. Recordemos que utilizaremos esto como nuestra forma de autenticación que usará CloudFront para poder acceder al contenido del bucket (bucket no es público, así que nadie puede acceder)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffwm2dvrel814gxgxvo16.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffwm2dvrel814gxgxvo16.png" alt="OAC creado" width="800" height="174"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Distribución CloudFront
&lt;/h2&gt;

&lt;p&gt;Ahora sí, a crear nuestra red de distribución de contenido.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr0c86e7n9uto0lpdjlya.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr0c86e7n9uto0lpdjlya.png" alt="Creación de distribución" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En &lt;em&gt;Origin domain&lt;/em&gt; nos aparece los buckets que tenemos disponibles. Seleccionamos el que creamos al inicio, el de origen 1. El &lt;em&gt;Origin path&lt;/em&gt; lo dejo vacío, con tal que cuando accedamos a la ruta / (slash) sea este origen quien responda. Y en &lt;em&gt;Name&lt;/em&gt;, dejo lo que me sugiere AWS.&lt;/p&gt;

&lt;p&gt;Luego seleccionamos el origin access que creamos&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk8x0ziczhn32ubb05qtd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk8x0ziczhn32ubb05qtd.png" alt="Seleccionamos el OAC" width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aquí nos advierte que luego de crear la distribución hay una política de acceso que debemos configurar en los buckets de S3. Le dejamos todas las opciones por default y damos a crear a la distribución.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fswg7xfx5daxotp7ilnok.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fswg7xfx5daxotp7ilnok.png" alt="Distribución creada" width="800" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tenemos un mensaje en verde que dice que se ha creado la distribución. Y un mensaje en amarillo indicándonos que copiemos la política y la pongamos en los buckets (aunque debería configurarla el mismo si ya sabe la política y el bucket, pero bueno). Vamos a ello.&lt;/p&gt;

&lt;h2&gt;
  
  
  Política de acceso al bucket
&lt;/h2&gt;

&lt;p&gt;Vamos a ir a cada uno de los buckets, al tab de permisos y editamos la política. Añadimos lo que copiamos al crear la distribución&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2turfvhdtiv3ut5bqven.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2turfvhdtiv3ut5bqven.png" alt="S3 Bucket Policy" width="800" height="727"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Notemos que el Resource dice &lt;code&gt;"Resource": "arn:aws:s3:::cloudfront-origen-1/*"&lt;/code&gt; ya que es del origen 1. Pero al colocarlo en el bucket del origen 2, hay que cambiarlo con el nombre del bucket. En mi caso sería &lt;code&gt;"Resource": "arn:aws:s3:::cloudfront-origen-2/*"&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  1ra prueba - un sólo origen
&lt;/h2&gt;

&lt;p&gt;Luego de haber configurado la política en el bucket, hagamos una prueba accediendo a la URL que nos ha proporcionado la distribución&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcxj2sidjhxg9rt3tnqp2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcxj2sidjhxg9rt3tnqp2.png" alt="Prueba uno, origen 1 o primario" width="800" height="186"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nota: si obtienes un no querido AccessDenied, verifica que en la distribución esté configurado el &lt;em&gt;Default root object&lt;/em&gt; con &lt;em&gt;index.html&lt;/em&gt; (me pasó y pasé mucho tiempo buscando esta respuesta). También puedes fijarte que el OAC firme todas las peticiones. Mira también que las políticas en S3 estén bien escritas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Grupo de orígenes
&lt;/h2&gt;

&lt;p&gt;Luego de haber probado que nuestra distribución funciona, usando el contenido de nuestro origen 1, un bucket en N. Virginia, ahora agreguemos nuestro segundo origen, un bucket en N. California&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8o6xxgc0ortiofin3pco.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8o6xxgc0ortiofin3pco.png" alt="Creación de segundo origen" width="800" height="759"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Elegimos el segundo bucket que creamos y también usamos el OAC creado. Ya no tenemos que hacer el paso de añadirle la política al bucket, ya lo hicimos en pasos anteriores. Le damos a crear el origen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7zvvjzsbj859m8wlhy45.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7zvvjzsbj859m8wlhy45.png" alt="Dos orígenes creados" width="800" height="167"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Procedemos a crear un grupo de orígenes&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu9kc05xm8h78y9x90zmw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu9kc05xm8h78y9x90zmw.png" alt="Creación de grupo de orígenes" width="800" height="612"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En el listado nos mostrará los dos orígenes que ya tenemos. Seleccionamos el origen 1 primero (porque éste será el primario, el predeterminado) y le damos a añadir. Luego añadimos el origen 2, para que sea el secundario.&lt;/p&gt;

&lt;p&gt;De esta manera ahora vemos que a lado de los orígenes hay unas flechas. Con éstas podemos cambiar quién será el primario y quién será el secundario, a demanda, a nuestro criterio.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz58cj1twu0z7g2lg5vnl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz58cj1twu0z7g2lg5vnl.png" alt="Orígenes añadidos al grupo" width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Le damos un nombre al grupo y seleccionamos todos los códigos HTTP que deseamos que cuando se detecte, haga el failover. Le damos crear.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi8x60i57oztqfd6935fz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi8x60i57oztqfd6935fz.png" alt="Nombre de grupo y códigos de failover" width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9agmj96fhmoxjq8moz7s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9agmj96fhmoxjq8moz7s.png" alt="Grupo de origen creado" width="800" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hasta aquí solo hemos creado el grupo y añadido ambos orígenes a él. Ahora necesitamos que cuando se acceda al URL, la petición vaya al grupo y no al origen 1. Vamos a ello.&lt;/p&gt;

&lt;p&gt;Vamos al tab Behaviour y damos a editar a Default(*), el único path pattern que tenemos configurado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp5lw7brmbv6qzjnjm549.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp5lw7brmbv6qzjnjm549.png" alt="Edición de behaviour" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nos muestra los orígenes individuales y el nuevo grupo. Elegimos el grupo y guardamos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5p8vvtqk4fqfvzxw0usy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5p8vvtqk4fqfvzxw0usy.png" alt="Behaviour actualizado a usar el grupo" width="800" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2da prueba - con grupo de orígenes
&lt;/h2&gt;

&lt;p&gt;Accedemos otra vez al URL. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr37ivpzj9pvovhko16io.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr37ivpzj9pvovhko16io.png" alt="Prueba con grupo" width="800" height="149"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vemos que nos sigue mostrando el origen 1. Por detrás ahora está usando el grupo de orígenes y como el origen 1 es el primario éste es el que muestra.&lt;/p&gt;

&lt;p&gt;Simulemos ahora un error. Renombremos el index.html del bucket origen 1 a index-failover.html.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd6ohbyg1xzli127i3oej.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd6ohbyg1xzli127i3oej.png" alt="Objeto renombrado" width="800" height="509"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3ra prueba - Failover por error
&lt;/h2&gt;

&lt;p&gt;En vista que hemos renombrado el archivo/objeto, el origen va a responder con un error &lt;em&gt;404&lt;/em&gt; que significa &lt;em&gt;Not Found&lt;/em&gt;, no encuentra el index.html, así que debería ir al origen 2 como contingencia. Probemos el URL a ver que pasa.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fomf18y9j86lrf84y6l2z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fomf18y9j86lrf84y6l2z.png" alt="Mismo url monstrando el origen 2" width="800" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;¿Qué pasó? Es lo que esperábamos ¿verdad?. Ahora estamos viendo el contenido del &lt;em&gt;index.html&lt;/em&gt; del origen 2 que es un bucket en la región de N. California. &lt;em&gt;¿Cool ah?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Renombremos otra vez el objeto en el origen 1 a su original. Y probemos nuevamente el URL.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3361ajmmm2s5dh7ld39f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3361ajmmm2s5dh7ld39f.png" alt="Nuevamente contenido origen 1" width="800" height="182"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Volvimos a tener el contenido del origen 1 en línea.&lt;/p&gt;

&lt;h2&gt;
  
  
  4ta prueba - Failover a demanda
&lt;/h2&gt;

&lt;p&gt;Ahora si queremos podemos poner el origen 2 como primario usando las flechitas que habiamos visto. Hagamos eso, subamos el orden para que origen 2 quede arriba, convirtiéndolo en primario.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv16mm3nget3mo11s5msi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv16mm3nget3mo11s5msi.png" alt="Origen 2 como primario" width="800" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Salvemos y probemos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy296hhx799mc383aqd4h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy296hhx799mc383aqd4h.png" alt="Origen 2 contenido primario" width="800" height="186"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tal cual como lo queremos. Y si hacemos el mismo ejercicio de renombrar el index.html del origen 2, entonces se mostrará el contenido del index.html de origen 1.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitantes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Por ahora CloudFront solo permite tener en un grupo dos orígenes.&lt;/li&gt;
&lt;li&gt;Si mantienes activo el caché y falla un origen quizá no te des cuenta hasta que el caché se invalide. Tal vez no sea una limitación pero es bueno tenerlo en cuenta.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusiones
&lt;/h2&gt;

&lt;p&gt;No solo se puede usar con bucket de S3, también con otros servicios como funciones Lambda e incluso con servicios de streaming. Aumentas la disponibilidad del contenido, de sitios web, videos, y mucho más.&lt;/p&gt;

&lt;h2&gt;
  
  
  Próximos pasos 👣
&lt;/h2&gt;

&lt;p&gt;LLevemos esto un poco más allá con infraestructura como código en la parte 3:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/rodossaenz/aws-cloudfront-con-grupos-de-orignes-como-failover-37ba"&gt;Amazon CloudFront Failover 🛟 con grupo de orígenes - Parte 1&lt;/a&gt;: solución conceptual&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/rodossaenz/amazon-cloudfront-failover-con-grupo-de-origenes-parte-2-2apc"&gt;Amazon CloudFront Failover 🛟 con grupo de orígenes - Parte 2&lt;/a&gt;: creación en la consola de AWS [este artículo]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Amazon CloudFront Failover 🛟 con grupo de orígenes - Parte 3: automatización usando CloudFormation&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Algunas referencias 🔗
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/es/about-aws/whats-new/2022/08/amazon-cloudfront-origin-access-control/"&gt;Amazon CloudFront lanza el control de acceso de origen (OAC)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html"&gt;Restricting access to an Amazon Simple Storage Service origin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/high_availability_origin_failover.html"&gt;Optimizing high availability with CloudFront origin failover&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloudfront</category>
      <category>failover</category>
      <category>español</category>
    </item>
    <item>
      <title>Amazon CloudFront Failover 🛟 con grupo de orígenes - Parte 1</title>
      <dc:creator>Rodolfo Sáenz</dc:creator>
      <pubDate>Wed, 27 Mar 2024 05:01:28 +0000</pubDate>
      <link>https://dev.to/rodossaenz/aws-cloudfront-con-grupos-de-orignes-como-failover-37ba</link>
      <guid>https://dev.to/rodossaenz/aws-cloudfront-con-grupos-de-orignes-como-failover-37ba</guid>
      <description>&lt;p&gt;Hola todos 👋 quiero dejarles este artículo breve y práctico para que sea de guía básica si necesitas implementar una distribución de contenido usando Amazon CloudFront, pero (y he aquí la razón de este articulo) asegurando que el contenido servido sea altamente disponible. &lt;/p&gt;

&lt;p&gt;Empecemos definiendo algunas cosas a modo simple...&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es Amazon CloudFront? 🕸️
&lt;/h2&gt;

&lt;p&gt;Es un servicio web que acelera la distribución de contenido web estático y dinámico, como archivos .html, .css, .js e imágenes, a los usuarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Cómo funciona Amazon CloudFront? ⛅
&lt;/h2&gt;

&lt;p&gt;CloudFront distribuye contenido a través de una red global de centros de datos llamados ubicaciones de borde (Edge Locations). Al solicitar contenido que se está sirviendo con CloudFront, la petición del usuario es dirigido a la ubicación de borde con la latencia más baja (retardo de tiempo) para que el contenido se entregue con el mejor rendimiento posible.&lt;/p&gt;

&lt;p&gt;Si el contenido ya se encuentra en la ubicación de borde con la latencia más baja, como un cache del contenido, CloudFront lo entregará de inmediato.&lt;/p&gt;

&lt;p&gt;Si el contenido no se encuentra en esta ubicación de borde, ya sea porque el cache venció o fue invalidado, CloudFront lo recupera desde un origen definido, como un bucket S3 o una instancia EC2 que sirve de servidor web.&lt;/p&gt;

&lt;p&gt;Hasta aquí parece que se entiende como funciona (a quince mil pies de altura como diría un amigo).&lt;/p&gt;

&lt;p&gt;Este comportamiento se vería algo como esto:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy7kkfdfm4cfxdvt4v96i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy7kkfdfm4cfxdvt4v96i.png" alt="Funcionamiento básico de la red global de distribución cloudfront" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Cómo implementar Amazon CloudFront Failover? ⚒️
&lt;/h2&gt;

&lt;p&gt;Ahora, ¿qué pasaría si el origen del contenido sufre una falla? Ya sea que un archivo no se encuentra en el bucket, resultando en un 404. O que la aplicación en sí misma retorne un error 500. O simplemente porque el contenido ha o fue actualizado con otras versiones de archivos, ejemplo un despliegue de una nueva versión del software. Pudiese ser muchas razones. Lo cierto es que AWS siempre nos insta a diseñar soluciones pensando que cualquier cosa (o todo) puede fallar. Incluso una región de AWS puede quedar inaccesible (y ha sucedido ya).&lt;/p&gt;

&lt;p&gt;Lo que nos puede salvar temporalmente es que una de las características del servicio de CloudFront es que mantiene en caché una versión del contenido en la ubicación de borde sin tener que ir al origen a buscar los archivos.&lt;/p&gt;

&lt;p&gt;Pero una vez ese caché venza o se invalide, CloudFront va al origen a buscar el contenido nuevo para servirlo al usuario final.&lt;/p&gt;

&lt;p&gt;Lo que haremos es hacer uso de varios orígenes de contenido. En este caso vamos a tener dos buckets de Amazon S3. Importante, que estén ubicados en dos regiones distintas. De esta manera garantizamos la alta disponibilidad y reducimos riesgos.&lt;/p&gt;

&lt;p&gt;Este comportamiento de recuperación de desastres (Disaster Recovery) se vería algo como esto:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx1buhfgqm5y56bw3bnkt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx1buhfgqm5y56bw3bnkt.png" alt="Funcionamiento con failover de la red global de distribución cloudfront con un grupo de origenes" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La lógica aquí sería, &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;El usuario accede a una URL (puede ser una personalizada en Route53 o la que proporciona CloudFront para la distribución)&lt;/li&gt;
&lt;li&gt;Suponiendo que es la primera vez que se accede (no hay caché en la ubicación de borde de menos latencia), entonces CloudFront evalúa el path de la URL y determina el comportamiento (Behaiviour) para saber donde buscar el contenido.&lt;/li&gt;
&lt;li&gt;Mediante la configuración que hemos hecho, CloudFront ve que debe buscarlo en un grupo de orígenes y entonces lo busca en el origen primario. En el caso de la ilustración, es el bucket S3 primario en la región 1.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Aquí quiero hacer una anotación relevante. El tener dos orígenes no significa que hará un "balanceo" entre los buckets. Siempre se servirá el contenido del origen primario que configuramos.&lt;/p&gt;

&lt;p&gt;En caso que el origen primario no esté disponible, por algún evento, un error en la aplicación (esto también lo configuramos si se recibe un código HTTP 5XX ó 4XX), entonces CloudFront buscará el contenido en el origen secundario, en este caso el bucket S3 secundario en la región 2.&lt;/p&gt;

&lt;h2&gt;
  
  
  Próximos pasos 👣
&lt;/h2&gt;

&lt;p&gt;La idea es poder entonces llevar esta solución a la consola de AWS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/rodossaenz/aws-cloudfront-con-grupos-de-orignes-como-failover-37ba"&gt;Amazon CloudFront Failover 🛟 con grupo de orígenes - Parte 1&lt;/a&gt;: éste artículo&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/rodossaenz/amazon-cloudfront-failover-con-grupo-de-origenes-parte-2-2apc"&gt;Amazon CloudFront Failover 🛟 con grupo de orígenes - Parte 2&lt;/a&gt;: creación en la consola de AWS&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Amazon CloudFront Failover 🛟 con grupo de orígenes - Parte 3: automatización usando CloudFormation&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Algunas referencias 🔗
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/es/cloudfront/"&gt;Amazon CloudFront&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/es/about-aws/whats-new/2018/11/amazon-cloudfront-announces-support-for-origin-failover/"&gt;Amazon CloudFront announces support for origin failover&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/high_availability_origin_failover.html"&gt;High Availability Origin Failover&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/disaster-recovery-resiliency.html"&gt;Disaster Recovery Resiliency&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Gracias por leer, nos vemos en la nube . . .&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloudfront</category>
      <category>failover</category>
      <category>español</category>
    </item>
  </channel>
</rss>
