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?

¿Fue útil?

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!

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!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top