distribución de la fuerza CloudFront actualización / archivo
-
13-09-2019 - |
Pregunta
Estoy usando CloudFront de Amazon para servir archivos estáticos de mis aplicaciones web.
¿No hay manera de contar una distribución CloudFront que necesita para actualizar su archivo o señalar un único archivo que debe ser renovada?
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 eso parece una solución bastante estúpido. ¿Hay absolutamente ninguna otra manera?
Solución
Buenas noticias. Amazon finalmente se añade una característica de invalidación. Ver la API de referencia.
Esta es una solicitud de muestra de la Referencia 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>
Otros consejos
A partir del 19 de marzo de Amazon ahora permite TTL caché de Cloudfront a ser 0 segundos, por lo que (en teoría) no debería ver objetos obsoletos. Así que si usted tiene sus activos en S3, simplemente podría ir a Panel Web AWS => S3 => Editar propiedades => Metadatos, a continuación, establezca el valor de "Cache-Control" a "max-age = 0".
Esto es directamente de la documentación de la API :
Para controlar si CloudFront almacena en caché un objeto y por cuánto tiempo, se recomienda que utilice el encabezado Cache-Control con el max-age = Directiva. CloudFront almacena en caché el objeto para el número especificado de segundos. (El valor mínimo es de 0 segundos.)
Con la API de invalidación, que se vuelve a actualizar en unos pocos minutos.
Echa un vistazo a PHP invalidador .
configuración de actualización automática en 5 minutos
OK, chicos. La mejor manera posible por el momento para llevar a cabo la actualización automática CloudFront (invalidación) es crear la función lambda que se activará cada vez que cualquier archivo subido a S3 cubeta (una nueva o reescrito).
Incluso si nunca has usado las funciones lambda antes, es muy fácil - sólo tienes que seguir mis instrucciones paso a paso y que le llevará a sólo 5 minutos:
Paso 1
https://console.aws.amazon.com/lambda/home y haga clic en Crea una función lambda
Paso 2
Haga clic en Función blanco (personalizado)
Paso 3
Haga clic en la caja vacía (acariciado) y seleccione S3 desde combinado
Paso 4
Seleccione su Cubo (igual que para la distribución CloudFront)
Paso 5
Establecer un Tipo de evento a "objeto creado (Todos)"
Paso 6
Set prefijo y sufijo o dejar en blanco si no sabe lo que es.
Paso 7
Comprobar Habilitar desencadenante casilla de verificación y Siguiente
Paso 8
El nombre de su función (algo como: YourBucketNameS3ToCloudFrontOnCreateAll )
Paso 9
Seleccione Python 2.7 (o posterior) como Tiempo de ejecución
Paso 10
Pegar siguiente código en lugar de código Python por defecto:
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
https://console.aws.amazon.com/cloudfront/home en una nueva pestaña del navegador y copiar su ID de distribución CloudFront para su uso en el siguiente paso.
Paso 12
Vuelta a la pestaña lambda y pegar su identificador de distribución en lugar de _YOUR_DISTRIBUTION_ID_ en el código Python. Mantenga rodea comillas.
Paso 13
Set controlador : lambda_function.lambda_handler
Paso 14
Haga clic en la función cuadro combinado y seleccione Crea una función personalizada . se abrirá una nueva pestaña en el navegador.
Paso 15
Haga clic en vista del documento de política , editar , Aceptar y reemplazar la definición de funciones con el siguiente (tal cual):
{
"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 lo regresará a un lambda. Asegúrate de que el nombre de la función que acaba de crear se selecciona en el papel existente cuadro combinado.
Paso 17
Set Memoria (MB) a 128 y Tiempo de espera: a 5 seg.
Paso 18
Haga clic en Siguiente y, a continuación, haga clic en función Crear
Paso 19
son buenos para ir! Ahora en adelante, cada vez que se va a cargar / reupload cualquier archivo a S3, que será evaluado en todas las ubicaciones de los bordes CloudFront.
PS - Cuando se está probando, asegúrese de que su navegador está cargando imágenes de CloudFront, no de la caché local
.PSS - Tenga en cuenta que sólo el primero de 1000 archivos de invalidación por mes son gratis, cada una invalidación por encima del límite costó $ 0,005 USD. También podrán aplicar cargos adicionales para la función lambda, pero es extremadamente barato.
Cubo Explorador tiene una interfaz de usuario que hace que este muy fácil ahora. He aquí cómo:
Haga clic derecho en su cubo. Seleccione "Administrar Distribuciones."
Haga clic derecho en su distribución. Seleccione "Obtener la lista de invalidación Cloudfront"
A continuación, seleccione "Crear" para crear una nueva lista de invalidación.
Seleccione los archivos de invalidar, y haga clic en "Invalidar". Espere 5-15 minutos.
Si usted tiene boto instalado (que no es sólo para Python, pero también instala un manojo de comando útil utilidades de línea), que ofrece una línea de comandos uTIL llama específicamente cfadmin
o 'nube frente admin' que ofrece la funcionalidad siguiente:
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
invaliate cosas ejecutando:
$sam# cfadmin invalidate <distribution> <path>
Sólo la publicación para informar a cualquier persona que visite esta página (primer resultado en 'Actualizar Cloudfront Archivo') que no es una herramienta fácil de usar + acceso disponible en swook.net
Esta nueva invalidador es:
- totalmente en línea (sin instalación)
- 24x7 Disponible (organizada por Google) y no requiere de cualquier pertenencia.
- Existe un apoyo de la historia, y la ruta de comprobación para que pueda invalidar sus archivos con facilidad. (A menudo, con sólo unos pocos clics después de invalidar por primera vez!)
- También es muy seguro, ya que se dará cuenta al leer su posterior liberación .
La revelación completa: Hice esto. Divertirse!
una manera muy fácil de hacerlo es CARPETA de versiones.
Así que si sus archivos estáticos son cientos por ejemplo, en pocas palabras todas ellas en una carpeta llamada por año + control de versiones.
Por ejemplo, yo utilizo una carpeta llamada 2014_v1 en cuyo interior tengo todos mis archivos estáticos ...
Así que dentro de mi HTML Siempre pongo la referencia a la carpeta. (Por supuesto que tengo un PHP incluirá, en su yo he puesto el nombre de la carpeta.) Por lo tanto, cambiando en 1 archivo en realidad cambie en todos mis archivos PHP ..
Si quiero una actualización completa, simplemente cambiar el nombre de la carpeta a 2014_v2 en mi fuente y modificarlo en el interior del php incluyen a 2014_v2
todo el HTML cambia automáticamente y pedir al nuevo camino, caché CloudFront Miss y solicitar a la fuente.
Ejemplo: SOURCE.mydomain.com es mi fuente, cloudfront.mydomain.com es CNAME a la distribución CloudFront.
Así que el PHP llama 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 el PHP incluye estableciendo la carpeta de "2014_v2".
Al igual que este no hay ningún retraso para la invalidación y sin costo!
Este es mi primer post en stackoverflow, espero que lo hice bien!
Establecer TTL = 1 hora y reemplace
http://developer.amazonwebservices.com/connect/ann.jspa ? annID = 655
En el rubí, el uso de la gema 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 invalidación, todavía tarda 5-10 minutos para la invalidación para procesar y actualizar en todos los servidores de borde de Amazon
invalidación actual soporte AWS CLI en el modo de vista previa. Ejecutar el siguiente en la consola una vez:
aws configure set preview.cloudfront true
despliego mi proyecto web mediante la NGP. Tengo las siguientes secuencias de comandos en mi 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"
}
Tener las secuencias de comandos anterior en su lugar puede implementar su sitio con:
npm run deploy
Si está utilizando AWS, es probable que también utiliza su herramienta oficial CLI (antes o después). AWS CLI versión 1.9.12 o superior apoya invalidar una lista de nombres de archivo.
La revelación completa: Hice esto. Divertirse!