amazon-web-services - funciona - cloudfront s3
Force CloudFront distribuciĆ³n/actualizaciĆ³n de archivos (12)
Estoy usando CloudFront de Amazon 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 único archivo que debe actualizarse?
Amazon recomienda que la versión de sus archivos como logo_1.gif, logo_2.gif y así sucesivamente como una solución para este problema, pero que parece una solución bastante estúpida. ¿No hay absolutamente otra manera?
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, puede simplemente ir a AWS Web Panel => S3 => Editar propiedades => Metadatos, luego configure su valor de "Cache-Control" a "max-age = 0".
Esto es directamente de la documentación API :
Para controlar si CloudFront almacena en caché un objeto y por cuánto tiempo, le recomendamos que use el encabezado Cache-Control con la directiva max-age =. CloudFront almacena en caché el objeto durante el número de segundos especificado. (El valor mínimo es 0 segundos)
Buenas noticias. Amazon finalmente agregó una Característica de Invalidación. Ver la referencia de API .
Esta es una solicitud de muestra de la Referencia de la API:
POST /2010-08-01/distribution/[distribution ID]/invalidation HTTP/1.0
Host: cloudfront.amazonaws.com
Authorization: [AWS authentication string]
Content-Type: text/xml
<InvalidationBatch>
<Path>/image1.jpg</Path>
<Path>/image2.jpg</Path>
<Path>/videos/movie.flv</Path>
<CallerReference>my-batch</CallerReference>
</InvalidationBatch>
Con la API de invalidación, se actualiza en unos minutos.
Echa un vistazo a PHP Invalidator .
En rubí, usando la gema de niebla
AWS_ACCESS_KEY = ENV[''AWS_ACCESS_KEY_ID'']
AWS_SECRET_KEY = ENV[''AWS_SECRET_ACCESS_KEY'']
AWS_DISTRIBUTION_ID = ENV[''AWS_DISTRIBUTION_ID'']
conn = Fog::CDN.new(
:provider => ''AWS'',
:aws_access_key_id => AWS_ACCESS_KEY,
:aws_secret_access_key => AWS_SECRET_KEY
)
images = [''/path/to/image1.jpg'', ''/path/to/another/image2.jpg'']
conn.post_invalidation AWS_DISTRIBUTION_ID, images
incluso en caso de invalidación, la invalidación tarda de 5 a 10 minutos en procesarse y actualizarse en todos los servidores de Amazon Edge.
Establecer TTL = 1 hora y reemplazar
http://developer.amazonwebservices.com/connect/ann.jspa?annID=655
Si está utilizando AWS, probablemente también utilice su herramienta CLI oficial (tarde o temprano). AWS CLI versión 1.9.12 o superior admite la invalidación de una lista de nombres de archivos.
Divulgación completa: hice esto. ¡Que te diviertas!
Si tiene boto instalado (que no es solo para python, sino que también instala cfadmin
utilidades útiles de línea de comandos), ofrece una línea de comando cfadmin
llamada cfadmin
o ''administrador frontal de nube'' que ofrece la siguiente funcionalidad:
Usage: cfadmin [command]
cmd - Print help message, optionally about a specific function
help - Print help message, optionally about a specific function
invalidate - Create a cloudfront invalidation request
ls - List all distributions and streaming distributions
Usted invalida las cosas ejecutando:
$sam# cfadmin invalidate <distribution> <path>
Solo publicando para informar a cualquier persona que visite esta página (primer resultado en ''Actualización de archivos en la nube'') que hay un invalidante en línea de acceso + fácil de usar disponible en swook.net
Este nuevo invalidator es:
- Completamente en línea (sin instalación)
- Disponible 24x7 (alojado por Google) y no requiere membresías.
- Hay soporte de historial y control de rutas para permitirle invalidar sus archivos con facilidad. (¡A menudo con solo unos pocos clics después de invalidar por primera vez!)
- También es muy seguro, como descubrirá al leer su publicación de lanzamiento .
Divulgación completa: hice esto. ¡Que te diviertas!
Una manera muy fácil de hacerlo es el control de versiones de FOLDER.
Entonces, si sus archivos estáticos son cientos, por ejemplo, simplemente colóquelos todos en una carpeta llamada por year + versioning.
por ejemplo, uso una carpeta llamada 2014_v1 donde tengo todos mis archivos estáticos ...
Entonces, dentro de mi HTML, siempre coloco la referencia a la carpeta. (por supuesto, tengo un PHP incluido donde he puesto el nombre de la carpeta.) Así que cambiando en 1 archivo realmente 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
todo el código HTML cambia automáticamente y solicita la nueva ruta, el caché MISS en la nube y lo solicita a la fuente.
Ejemplo: SOURCE.mydomain.com es mi fuente, cloudfront.mydomain.com es una distribución de CNAME a la nube.
Así que el 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 en la fuente a "2014_v2" y cambio la inclusión de PHP configurando la carpeta como "2014_v2" .
De esta manera, no hay demora para la invalidación y ¡SIN COSTO!
Esta es mi primera publicación en , ¡espero que lo haya hecho bien!
la CLI de AWS actual admite la invalidación en el modo de vista previa. Ejecute lo siguiente en su consola una vez:
aws configure set preview.cloudfront true
Implemento mi proyecto web usando npm. Tengo los siguientes scripts en mi package.json
. package.json
:
{
"build.prod": "ng build --prod --aot",
"aws.deploy": "aws s3 sync dist/ s3://www.mywebsite.com --delete --region us-east-1",
"aws.invalidate": "aws cloudfront create-invalidation --distribution-id [MY_DISTRIBUTION_ID] --paths /",
"deploy": "npm run build.prod && npm run aws.deploy && npm run aws.invalidate"
}
Al tener los scripts arriba en su lugar, puede implementar su sitio con:
npm run deploy
Bucket Explorer tiene una interfaz de usuario que hace que esto sea bastante fácil ahora. Así es cómo:
Haga clic derecho en su 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". Espere de 5 a 15 minutos.
Configuración automatizada de la actualización en 5 minutos
Ok muchachos. La mejor manera posible de realizar ahora la actualización automática de CloudFront (invalidación) es crear la función Lambda que se activará cada vez que se cargue un archivo en el depósito S3 (uno nuevo o reescrito).
Incluso si nunca antes utilizó las funciones lambda, es realmente fácil, simplemente siga mis instrucciones paso a paso y le 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 la función en blanco (personalizada)
Paso 3
Haga clic en el cuadro vacío (acarició) y seleccione S3 del combo
Etapa 4
Seleccione su Cubo (lo mismo que para la distribución CloudFront)
Paso 5
Establecer un tipo de evento como "Objeto creado (todos)"
Paso 6
Establezca Prefijo y Sufijo o déjelo vacío si no sabe de qué se trata.
Paso 7
Marca la casilla de verificación Habilitar activador y haz clic en Siguiente.
Paso 8
Denomine su función (algo como: YourBucketNameS3ToCloudFrontOnCreateAll )
Paso 9
Seleccione Python 2.7 (o posterior) como Runtime
Paso 10
Pegue el código siguiente en lugar del código predeterminado de python:
from __future__ import print_function
import boto3
import time
def lambda_handler(event, context):
for items in event["Records"]:
path = "/" + items["s3"]["object"]["key"]
print(path)
client = boto3.client(''cloudfront'')
invalidation = client.create_invalidation(DistributionId=''_YOUR_DISTRIBUTION_ID_'',
InvalidationBatch={
''Paths'': {
''Quantity'': 1,
''Items'': [path]
},
''CallerReference'': str(time.time())
})
Paso 11
Abra https://console.aws.amazon.com/cloudfront/home en una nueva pestaña del navegador y copie su ID de distribución CloudFront para usar en el próximo paso.
Paso 12
Regrese a la pestaña lambda y pegue su ID de distribución en lugar de _YOUR_DISTRIBUTION_ID_ en el código de Python. Mantenga las cotizaciones circundantes.
Paso 13
Set handler : 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 la función por la siguiente (como está):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Effect": "Allow",
"Action": [
"cloudfront:CreateInvalidation"
],
"Resource": [
"*"
]
}
]
}
Paso 16
Haga clic en permitir . Esto te devolverá a una lambda. Verifique que el nombre de la función que acaba de crear esté seleccionado en el cuadro combinado de la función Existente .
Paso 17
Establezca la memoria (MB) en 128 y el 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 realiza la prueba, asegúrese de que su navegador esté cargando imágenes desde CloudFront, no desde la memoria caché local.
PSS: tenga en cuenta que solo la invalidación de los primeros 1000 archivos por mes es gratis, cada invalidación por un límite de costo de $ 0.005 USD. También se pueden aplicar cargos adicionales por la función de Lambda, pero es extremadamente económico.