Estoy usando Amazon CloudFront para servir archivos estáticos de mis aplicaciones web.
¿No hay forma de decirle a una distribución en la nube que necesita actualizar su archivo o señalar un solo archivo que debería actualizarse?
Amazon recomienda que versione sus archivos como logo_1.gif, logo_2.gif y así sucesivamente como una solución para este problema, pero eso parece una solución bastante estúpida. ¿No hay absolutamente otra manera?
Respuestas:
Buenas noticias. Amazon finalmente agregó una función de invalidación. Ver la referencia de la API .
Esta es una solicitud de muestra de la Referencia de API:
fuente
createInvalidation
solicitud de API , sigo viendo que la actualización tarda entre 5 y 10 minutos en invalidarse. Observe que escribo este comentario 4 años después del suyo.A partir del 19 de marzo, Amazon ahora permite que el TTL de caché de Cloudfront sea de 0 segundos, por lo que (en teoría) nunca debería ver objetos obsoletos. Entonces, si tiene sus activos en S3, simplemente puede ir a AWS Web Panel => S3 => Editar propiedades => Metadatos, luego configure su valor "Cache-Control" en "max-age = 0".
Esto es directamente de la documentación de la API :
fuente
Con la API de invalidación, se actualiza en unos minutos.
Echa un vistazo a PHP Invalidator .
fuente
Configuración de actualización automatizada en 5 minutos
Ok muchachos. La mejor manera posible por ahora de realizar una actualización automática de CloudFront (invalidación) es crear la función Lambda que se activará cada vez que se cargue cualquier archivo en el depósito S3 (uno nuevo o reescrito).
Incluso si nunca antes usó las funciones lambda, es realmente fácil: solo siga mis instrucciones paso a paso y tomará solo 5 minutos:
Paso 1
Vaya a https://console.aws.amazon.com/lambda/home y haga clic en Crear una función lambda
Paso 2
Haga clic en Función en blanco (personalizada)
Paso 3
Haga clic en el cuadro vacío (con trazos) y seleccione S3 del combo
Paso 4
Seleccione su Bucket (igual que para la distribución CloudFront)
Paso 5
Establezca un Tipo de evento en "Objeto creado (todo)"
Paso 6
Establezca Prefijo y Sufijo o déjelo vacío si no sabe qué es.
Paso 7
Marque la casilla de verificación Activar activador y haga clic en Siguiente
Paso 8
Asigne un nombre a su función (algo así como: YourBucketNameS3ToCloudFrontOnCreateAll )
Paso 9
Seleccione Python 2.7 (o posterior) como tiempo de ejecución
Paso 10
Pegue el siguiente código en lugar del código predeterminado de Python:
Paso 11
Abra https://console.aws.amazon.com/cloudfront/home en una nueva pestaña del navegador y copie su ID de distribución de CloudFront para usar en el siguiente paso.
Paso 12
Regrese a la pestaña lambda y pegue su identificación de distribución en lugar de _YOUR_DISTRIBUTION_ID_ en el código de Python. Mantenga las citas circundantes.
Paso 13
Establecer controlador : lambda_function.lambda_handler
Paso 14
Haga clic en el cuadro combinado de roles y seleccione Crear un rol personalizado . Se abrirá una nueva pestaña en el navegador.
Paso 15
Haga clic en ver documento de política , haga clic en editar , haga clic en Aceptar y reemplace la definición de rol con lo siguiente (como está):
Paso 16
Haga clic en permitir . Esto te devolverá a una lambda. Verifique que el nombre del rol que acaba de crear esté seleccionado en el cuadro combinado de roles existentes .
Paso 17
Establezca Memoria (MB) en 128 y Tiempo de espera en 5 segundos.
Paso 18
Haga clic en Siguiente , luego haga clic en Crear función
Paso 19
tú eres bueno para irte. Ahora, cada vez que cargue / vuelva a cargar cualquier archivo en S3, se evaluará en todas las ubicaciones de CloudFront Edge.
PD: cuando esté probando, asegúrese de que su navegador esté cargando imágenes desde CloudFront, no desde la memoria caché local.
PSS: tenga en cuenta que solo los primeros 1000 archivos de invalidación por mes son gratuitos, cada invalidación por encima del límite cuesta $ 0.005 USD. También se pueden aplicar cargos adicionales por la función Lambda, pero es extremadamente barato.
fuente
Bucket Explorer tiene una interfaz de usuario que hace que esto sea bastante fácil ahora. Así es cómo:
Haz clic derecho en tu cubo. Seleccione "Administrar distribuciones".
Haga clic derecho en su distribución. Seleccione "Obtener lista de invalidación de Cloudfront" Luego seleccione "Crear" para crear una nueva lista de invalidación. Seleccione los archivos para invalidar y haga clic en "Invalidar". Espera de 5 a 15 minutos.
fuente
Si tiene instalado boto (que no es solo para Python, sino que también instala un montón de útiles utilidades de línea de comando), ofrece una utilidad de línea de comando específicamente llamada
cfadmin
o 'administrador frontal de nube' que ofrece la siguiente funcionalidad:Usted invalia las cosas ejecutando:
fuente
Simplemente publique para informar a cualquiera que visite esta página (primer resultado en 'Actualización de archivo de Cloudfront') que hay un acceso + fácil de usar invalidante en línea disponible en swook.net
Este nuevo invalidador es:
Divulgación completa: hice esto. ¡Que te diviertas!
fuente
Una forma muy fácil de hacerlo es el versionado de CARPETA.
Entonces, si sus archivos estáticos son cientos, por ejemplo, simplemente colóquelos en una carpeta llamada por año + versiones.
por ejemplo, uso una carpeta llamada 2014_v1 donde dentro tengo todos mis archivos estáticos ...
Entonces, dentro de mi HTML, siempre pongo la referencia a la carpeta. (por supuesto, tengo un PHP incluido donde configuré el nombre de la carpeta). Entonces, al cambiar en 1 archivo, en realidad cambia en todos mis archivos PHP ...
Si quiero una actualización completa, simplemente cambio el nombre de la carpeta a 2014_v2 en mi fuente y cambio dentro de php include a 2014_v2
todos los HTML cambian automáticamente y solicitan la nueva ruta, el caché MISS frente a la nube y lo solicitan a la fuente.
Ejemplo: SOURCE.mydomain.com es mi fuente, cloudfront.mydomain.com es CNAME para la distribución de cloudfront.
Entonces, PHP llamó a este archivo cloudfront.mydomain.com/2014_v1/javascript.js y cuando quiero una actualización completa, simplemente cambio el nombre de la carpeta a la fuente a "2014_v2" y cambio la inclusión de PHP configurando la carpeta a "2014_v2" .
¡Así no hay demora por invalidación y SIN COSTO!
Esta es mi primera publicación en stackoverflow, ¡espero que lo haya hecho bien!
fuente
Establecer TTL = 1 hora y reemplazar
http://developer.amazonwebservices.com/connect/ann.jspa?annID=655
fuente
En rubí, usando la gema de niebla
incluso en caso de invalidación, la invalidación demora entre 5 y 10 minutos en procesarse y actualizarse en todos los servidores amazon edge
fuente
Invalidación de soporte de AWS CLI actual en modo de vista previa. Ejecute lo siguiente en su consola una vez:
Implemento mi proyecto web usando npm. Tengo los siguientes scripts en mi
package.json
:Con las secuencias de comandos anteriores, puede implementar su sitio con:
fuente
--paths /
a--paths /*
. el mío también era como el tuyo y no invalidaba la distribución ...Si está utilizando AWS, probablemente también use su herramienta oficial de CLI (tarde o temprano). AWS CLI versión 1.9.12 o superior admite la invalidación de una lista de nombres de archivo.
Divulgación completa: hice esto. ¡Que te diviertas!
fuente
Ve a CloudFront.
Haga clic en su ID / Distribuciones.
Haga clic en invalidaciones.
Haga clic en crear invalidación.
En el cuadro de ejemplo gigante, escriba * y haga clic en invalidar
Hecho
fuente