AWS Cloudfront con S3
AWS Cloudfront con S3
Glosario
EC2
Elastic Container Versión 2, pc cloud de AWS
S3
Simple Storage Service, servicio para almacenamiento de archivos, más comúnmente utilizado para el almacenamiento tipo estático (similar a los estáticos de un frontend)
IAM Usuarios de Amazon para autenticarse, a partir de los usuarios se concede acceso a los diferentes servicios de AWS bajo Políticas de acceso
Resumen
En AWS se dispone del servicio de Cloudfront este permite utilizar un S3 de manera “segura”, en esta guía se ilustra al detalle de cómo configurar un Cloudfront con un S3 un dominio personalizado con CDN externo para el uso de un Cloudfront con assets dinámicos.
Configurar un Cloudfront en AWS requiere de los servicios S3, IAM y Certificate Manager de AWS, el caso ejemplo muestra el uso del CDN de Cloudflare para la gestión del dominio. Se asume que el servicio de S3 y la IAM requerida para inyectar información están en operación con un Backend o algún servicio que alimente el contenido del S3.
Se recomienda revisar la documentación oficial de amazon de los diferentes servicios implicados para así tener mayor claridad del efecto de la configuración sugerida, por otro lado para la configuración avanzada se recomienda una investigación ya que la configuración sugerida podría variar según el caso particular.
S3
Los servicios de almacenamiento de AWS con S3 en inlaze son utilizados para almacenamiento de dumps de bases de datos (backups), almacenamiento de archivos de lectura poco frecuente como documentos, cartas, fotos, entre otros.
Assets dinamicos
Los S3 poseen múltiples configuraciones de cifrado, acceso, tipos de almacenamiento los cuales dependiendo del uso de los archivos y el caso de uso será la configuración óptima, en este caso se dará enfoque para el uso de assets dinámicos.
Tipo de almacenamiento
Los assets en un sistema de frontend son de acceso frecuente por lo que el almacenamiento default del s3 (standard) es el que será utilizado. Los assets son gestionados por un sistema de backend por lo que este tiene la posibilidad de configurar diferentes almacenamientos.
Crear S3
Para crear un S3 de manera simple con assets dinámicos en una cuenta logeada de AWS acceder al servicio de S3.
En el dashboard del servicio de S3, dar click en Create bucket
Una vez en el menú de Creación del S3 la configuración a colocar será para un Bucket de assets dinámicos, el nombre es solo algo descriptivo pero por convención para distinguir estos buckets se les coloca assets.$dominio, por ejemplo si el dominio es example.com el nombre de acuerdo a la convención es assets.example.com
La región idóneamente debe de ser la misma donde se encuentren los servicios o máquinas, ya que la transferencia de archivos de servicios entre regiones implica un costo adicional además de la latencia. La opción Copy settings from existing bucket no se aplicará en este caso. El Object Ownership configurarlo con ACLs disabled esto permite que se pueda configurar la seguridad y el acceso mediante políticas de acceso únicamente, ya que así es como se va operar el Cloudfront accede en modo lectura al S3.
Como se va a leer el S3 mediante un cloudfront el acceso público al bucket no es requerido, para ello dejar activo Block Public Access settings for this bucket, las otras opciones relacionadas al acceso público quedarán activas.
El Bucket Versioning es utilizado en el caso que se tengan páginas estáticas (frontend completo en el S3 para cloudfront), para el caso de assets dinámicos estáticos esto no es óptimo.
El Default encryption con el Encryption type que tiene por defecto Server-side encryption with Amazon S3 managed keys (SSE-KMNS) es adecuado para el uso de assets dinámicos y el Bucket key activo para “reducir” costos.
Para otras configuraciones, valores deberá de revisar la documentación de AWS. Finalmente click en Create bucket.
Agregar políticas de S3 para uso mediante cloudfront
Para que el S3 permita su uso de otros servicios de AWS es necesario configurar la política del S3 para que este permita su acceso, primero se debe contar con el ARN del Cloudfront en caso de no tenerlo revisar Obtener el ARN del cloudfront. Luego acceder al S3 específico a configurar, una vez allí dar click a la pestaña Permissions
Allí bajar hasta Bucket policy y luego dar click en Edit
En este caso este bucket ya tiene varios policies, la idea es conservar las policies que ya tiene y agregar la policy necesaria para que el Cloudfront pueda acceder a este S3, en este caso el Cloudfront con ARN arn:aws:cloudfront::159624475316:distribution/E18V90CR6IP7A2 será configurado, lo que se deberá de agregar quedaría con el siguiente valor.
{ "Sid": "AllowCloudFrontServiceInlazeDomiBetTest", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::inlajobs.assets.dev/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::159624475316:distribution/E18V90CR6IP7A2" } } }
El Sid debe ser diferente a los que ya están allí y debe seguir la sintaxis de un JSON, luego de tener la configuración correspondiente dar clic en Save changes
IAM
Los IAM son usuarios que permiten autenticación de usuarios definidos por la cuenta de AWS, estos usuarios pueden tener una serie de reglas que conceden acceso a los diferentes servicios de AWS, para el caso del S3 con assets dinámicos mediante cloudfront este IAM será el que permita al servicio de backend Escribir los datos dentro del Bucket.
IAM Crear User
Con una cuenta logeada de AWS acceder al Servicio de IAM
En el dashboard de IAM acceder a los Users
En el apartado de Users dar click en Create user
En el proceso de creación solicita el nombre del usuario que es descriptivo, la convención que se utiliza actualmente para diferenciar usuarios de servicios específicos es el siguiente
$servicio-$project_name.$usage-$scope
Para este caso de assets dinámico con el nombre de proyecto example para master resultará como.
S3-example.assets-master
El siguiente paso solicitará indicar las políticas de la cuenta, seleccionar la correspondiente que permita el acceso de escritura, lectura al S3, se partirá del hecho de que la política ya existe en caso de que no esté seguir los pasos de Crear políticas para IAM, luego para elegir la política dar click en Attach policies directly. Allí buscar la política que corresponda a la que da el acceso del S3 correspondiente y seleccionarlo, para el caso ejemplo será S3-Inlajobs.assets.dev-full.
Luego click en next
Finalmente se mostrará el resumen antes de crear al usuario y dar click a Create user
Con esto existirá el usuario, para utilizarlo en los servicios de EC2 (Como se usan actualmente) se debe crear un tipo de acceso (seguir a xxx)
Crear políticas para IAM
Para crear una nueva política personalizada dar click en Create policy
Luego en Specify permissions dar click en JSON
Una vez en el editor de políticas en modo JSON colocar la configuración que se considere, en este caso la política requerida para acceder al servicio de S3 con permiso de leer, escribir, actualizar al ARN ejemplo arn:aws:s3:::betenlacetest (Para obtener el ARN seguir los pasos de Obtener ARN de S3), sería el siguiente:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:*", "s3-object-lambda:*" ], "Resource": [ "arn:aws:s3:::betenlacetest", "arn:aws:s3:::betenlacetest/*" ] } ] }
Luego click en Next
Finalmente colocar nombre descriptivo a la policy, la convención utilizada actualmente es
$Servicio-$project_name.$usage-$scope
Para este caso ejemplo es
S3-example.assets-full
Obtener ARN de S3 (Opcional)
Las políticas a colocar para que se pueda escribir sobre el S3 debe tener el ARN del S3 que tendrá acceso, para obtener el ARN del S3 en el Dashboard S3 dar click en el S3 a ajustar
Click a la pestaña Properties
Allí se encontrará el ARN en este caso ejemplo es arn:aws:s3:::betenlacetest con este se podrá crear la política.
Obtener y/o crear Credenciales de Acceso de un IAM
Una vez se tiene el usuario para obtener el acceso necesario para utilizarlo en scripts se debe de acceder a los IAM users dar click al usuario que se desea obtener acceso, para el caso ejemplo será S3-inlajobs.assets-dev
Una vez en el usuario específico acceder a la pestaña Security credentials
Allí en Security bajar hasta Access keys dar click a Create access key
Seleccionar el tipo de uso que tendrá la llave, seleccionar Application running on an AWS compute service, la opción Command Line Interface (CLI), también sirve.
Luego click en I understand the above recommendation… Y luego en Next
Finalmente se indica para describir el access key se puede dejar vacío y luego Create access key
En el momento que es creado la clave de acceso que es como una contraseña solo se podrá obtener en ese momento, si la llave secreta se pierde se deberá crear otra.
Para este paso ya estará creado la llave de acceso, copiar la información y luego click en Done
Si surge una alerta dar click en Continue, la idea es que con esta información se ajuste el servicio que va a gestionar los archivos del s3
Certificate Manager
Para utilizar dominios en AWS se requiere el manejo de certificados sea interno o externo, en este caso se enfocará para el uso de certificados externos en Cloudflare
Crear certificado
En una cuenta logeada de AWS acceder al Servicio de Certificate Manager
Luego para crear un nuevo certificado dar click a Request certificate
Después en el menú Request certificate seleccionar la opción Request a public certificate y luego en Next
Ahora se debe indicar los nombres del certificado, se puede indicar certificados de subdominio específico, en este caso será utilizado el dominio ejemplo domi.bet y se configurará para cualquier subdominio para ello en el campo de Fully qualified domain name tendria la siguiente configuración
*.domi.bet
Así permite cualquier subdominio de domi.bet
El Validation method será la forma en que se tendrá el certificado para intermediarlo en las peticiones, en este caso indicar la opción DNS validation
El key algorithm seleccionar RSA 2048, es de los más comunes y cloudflare es compatible con este.
Finalmente click en Request
Esto encola la solicitud del certificado mostrando la lista de certificados, en el proceso de solicitud se generará los valores que se deben colocar en el CDN en este caso de cloudflare para que se procese el certificado. En la lista de certificados dar click al recién creado, en este caso ejemplo *.domi.bet
En caso de que no salga en la lista dar clic en el botón de actualizar
Configurar el certificado en el CDN
Cuando es creado el certificado en el detalle de este tendrá los valores requeridos de CNAME que deberá colocarse en el CDN, copiarlos y luego ir a configurarlos.
En el CDN de cloudflare ir a la configuración de DNS del dominio y agregar los valores con proxy status en DNS only y luego Save, el valor en Comment es opcional colocar algo descriptivo.
Hecho esto se deberá de esperar unos minutos a que el Certificado sea validado, para verificar si está validado ir a la lista de certificados al certificado específico y ver el valor que tiene en status
El certificado deberá estar en estado validado para poder ser utilizado, si no en el proceso de creación del cloudfront no se podrá relacionar. Una vez esté el certificado validado dará el estado Success o Issued.
Cloudfront
El servicio de cloudfront permite tener un frontend completo o parcial para acceder al S3 de solo lectura, en esta guía se enfocará para el uso de assets dinámicos. Para crear el cloudfront se debe de contar con el S3 ya creado, en caso de que falte seguir los pasos de Crear S3. Adicionalmente se deberá de contar con un certificado validado en el Certifcate Manager, si no se ha creado seguir los pasos de Crear certificado.
Crear Cloudfront
Con una cuenta de AWS logeada acceder al servicio de Cloudfront
Allí se listarán los cloudfront que hay configurados, para crear el cloudfront dar click en Create distribution.
Luego se deberá seleccionar el servicio del cual el cloudfront va a montar, para el caso ejemplo se utilizará el s3 de inlajobs.assets.dev.
Tras dar click saldrá la opción Origin access en este dar click a Origin access control settings, luego dar click en Create control setting De la ventana que sale Create control setting en name colocar el mismo dominio (Solo es descriptivo no tiene efecto) en el caso ejemplo será assets-example.domi.bet, Signing behavior colocar Sign request y en Origin type poner S3, luego clic en Create
Tras crearlo quedará asignado, luego en la parte inferior sale la configuración de policy a agregar en el S3 relacionado copiarla y guardarla para usarla en un proceso posterior. La policy en este caso resulta siendo la siguiente
{ "Version": "2008-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Sid": "AllowCloudFrontServicePrincipal", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::inlajobs.assets.dev/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::159624475316:distribution/E18V90CR6IP7A2" } } } ] }
Esta es la policy completa, sin embargo el S3 puede ya tener otras políticas, el proceso de configurar las políticas está descrito en Agregar politicas de S3 para uso mediante cloudfront. Las otras configuraciones dejarlas default
En la sección default cache behavior indicar Path pattern dejar su valor Default (*), Compress objects automatically Yes, Viewer protocol policy en HTTPS only, Allowed HTTP methods con GET, HEAD y restrict viewer access en No
En Cache key and origin request colocar Cache policy and origin request policy, en Cache policy CachingOptimized (La configuración de cloudflare al parecer no genera cache en cloudflare, por ende deberá gestionarlo AWS), los campos Origin request policy, Response headers policy dejarlos vacíos. Additional settings no modificar nada dejarlo default
Function associations dejarlo en su valor default
Web application Firewall dar en la opción Do not enable security protections
En el Settings colocar para Price class el valor Use only North America and Europe en teoría cómo tendrá proxy por Cloudflare dará un mejor acceso, sin embargo, el Use all edge locations (best performance) solo aumentará unos centavos dependiendo del tráfico.
En Alternate domain name (CNAME) dar click en Add item y en la casilla que sale colocar el dominio que se utilizará, en este caso será assets-example.domi.bet.
En Custom SSL certificate seleccionar el certificado del dominio que se utilizará para este cloudfront, en este caso ejemplo *.domi.bet
Tras seleccionarlo se desplegará otra configuración, el Legacy client support dejarlo DESACTIVADO y el Security policy seleccionar el por defecto TLSv1.2_2021
En Supported HTTP versions marcar HTTP/2 y HTTP/3, en standard login dejarlo Off y IPv6 en On
Finalmente click en Create distribution
Con eso el cloudfront estará creado y entrará en proceso de “Deploying” mientras eso se podrá configurar en el CDN de cloudflare el subdominio
Obtener el ARN del cloudfront
EL ARN es necesario para identificar el servicio en particular en este caso del cloudfront es necesario para la politica del S3, para obtenerlo en la lista de Distributions del cloudfront dar click a la distribución correspondiente.
En el detalle de la distribución en la pestaña General se podrá encontrar el valor de ARN
Configurar el sub-dominio en cloudflare
Una vez esté configurado el cloudfront esta tendrá su url para operar, en el detalle del cloudfront en particular en la pestaña general se encuentra el url del cloudfront, copiarlo para utilizarlo en el CDN.
En este caso ejemplo el url es https://dmd17es9xx1v8.cloudfront.net en el CDN en la sección de DNS del dominio ejemplo domi.bet configurar un cname con content dmd17es9xx1v8.cloudfront.net sin el HTTPS y el value el que se configuró en el CNAME del cloudfront en este caso assets-example Si todo está correcto debería funcionar acceder a algún archivo que tenga el S3.
Verificar si está funcionando
Para validar que el dominio configurado está correcto ir al S3 y agregar un archivo en la raiz, en este caso el S3 configurado tiene el archivo themeLight.svg en la raiz
Por ende el url para acceder a ese archivo es https://assets-example.domi.bet/themeLight.svg
Cache del cloudfront
Para borrar cache en el cloudfront se debe de acceder al cloudfront en específico, luego ir a la pestaña Invalidations
Una vez allí dar clic en Create invalidation
Para borrar “cache” de todo ese dominio de AWS colocar el valor /* y luego Create invalidation
Con eso será creado y ejecutado la invaldiación, tardará unos minutos.
Una vez completado el Status de In progress pasará a Completed
Consideración de cloudflare
Para que funcione con cloudflare y el proxy activo debe asegurarse que el dominio en particular redireccionen siempre a HTTPS por parte de cloudflare sea general o especifico, para configurarlo general en cloudflare en la sección SSL/TLS -> Edge Certificates está la opción Always Use HTTPS
Es probable que una regla específica de redireccionar también funcione (eso en caso de requerir que el CDN no force todo a HTTPS)
Last updated