Принудительное распространение CloudFront / обновление файла

StackOverflow https://stackoverflow.com/questions/1268158

Вопрос

Я использую Amazon CloudFront для обслуживания статических файлов моих веб-приложений.

Нет ли способа сообщить дистрибутиву cloudfront, что ему необходимо обновить свой файл, или указать один файл, который следует обновить?

Amazon рекомендует вам использовать такие версии ваших файлов, как logo_1.gif, logo_2.gif и так далее, в качестве обходного пути для решения этой проблемы, но это кажется довольно глупым решением.Неужели нет абсолютно никакого другого способа?

Это было полезно?

Решение

Хорошие новости.Amazon наконец-то добавила функцию аннулирования. Смотрите ссылку на API.

Это пример запроса из ссылки на 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>

Другие советы

По состоянию на 19 марта Amazon теперь разрешает значение TTL кэша Cloudfront равным 0 секундам, таким образом, вы (теоретически) никогда не должны видеть устаревшие объекты.Итак, если у вас есть свои ресурсы в S3, вы можете просто перейти на веб-панель AWS => S3 => Редактировать свойства => Метаданные, затем установить значение "Cache-Control" равным "max-age = 0".

Это прямо из Документация API:

Чтобы контролировать, кэширует ли CloudFront объект и как долго, мы рекомендуем вам использовать заголовок Cache-Control с директивой max-age=.CloudFront кэширует объект в течение указанного количества секунд.(Минимальное значение равно 0 секундам.)

С помощью API недействительности он обновляется в течение нескольких минут.
Проверьте PHP - недействитель.

Автоматическая настройка обновления за 5 минут

Ладно, ребята.Наилучший возможный способ на данный момент выполнить автоматическое обновление CloudFront (аннулирование) - это создать лямбда-функцию, которая будет запускаться каждый раз, когда какой-либо файл загружается в корзину S3 (новый или перезаписанный).

Даже если вы никогда раньше не использовали лямбда-функции, это действительно просто - просто следуйте моим пошаговым инструкциям, и это займет всего 5 минут:

Шаг 1

Перейти к https://console.aws.amazon.com/lambda/home и нажмите Создайте лямбда-функцию

Шаг 2

Нажмите на Пустая функция (пользовательская)

Шаг 3

Нажмите на пустое (обведенное штрихом) поле и выберите S3 из комбо

Шаг 4

Выберите свой Ведро (то же, что и для дистрибутива CloudFront)

Шаг 5

Установить Тип события в раздел "Созданный объект (все)"

Шаг 6

Установить Префикс и Суффикс или оставьте его пустым, если вы не знаете, что это такое.

Шаг 7

Проверить Включить триггер установите флажок и нажмите Далее

Шаг 8

Назовите свою функцию (что-то вроде: Ваши имена пакетов 3 в фоновом режиме создают все)

Шаг 9

Выберите Python 2.7 (или позже) как Время выполнения

Шаг 10

Вставьте следующий код вместо кода 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())
            })

Шаг 11

Открыть https://console.aws.amazon.com/cloudfront/home перейдите на новую вкладку браузера и скопируйте свой идентификатор дистрибутива CloudFront для использования на следующем шаге.

Шаг 12

Вернитесь на вкладку lambda и вставьте свой идентификатор дистрибутива вместо _YOUR_DISTRIBUTION_ID_ в коде Python.Сохраняйте окружающие цитаты.

Шаг 13

Установить обработчик:лямбда-функция.лямбда-обработчик

Шаг 14

Нажмите на Роль поле со списком и выберите Создайте пользовательскую роль.Откроется новая вкладка в браузере.

Шаг 15

Щелчок просмотреть документ политики, щелчок Редактировать, щелчок ОК и замените определение роли следующим (как есть):

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
          "cloudfront:CreateInvalidation"
      ],
      "Resource": [
          "*"
      ]
    }
  ]
}

Шаг 16

Щелчок разрешить.Это вернет вас к лямбде.Дважды проверьте, что имя роли, которое вы только что создали, выбрано в Существующая роль выпадающий список.

Шаг 17

Установить Объем памяти (МБ) до 128 и Тайм - аут до 5 сек.

Шаг 18

Щелчок Далее, затем нажмите Создать функцию

Шаг 19

Ты молодец, что можешь идти!Отныне каждый раз, когда вы будете загружать / повторно загружать какой-либо файл на S3, он будет оцениваться во всех периферийных местоположениях CloudFront.

PS - При тестировании убедитесь, что ваш браузер загружает изображения из CloudFront, а не из локального кэша.

PSS - Пожалуйста, обратите внимание, что только аннулирование первых 1000 файлов в месяц бесплатно, каждое аннулирование сверх лимита стоит 0,005 доллара США.Также может взиматься дополнительная плата за функцию Lambda, но это чрезвычайно дешево.

Проводник Ведра имеет пользовательский интерфейс, который теперь делает это довольно простым.Вот как это делается:

Щелкните правой кнопкой мыши свое ведро.Выберите "Управление дистрибутивами".
Щелкните правой кнопкой мыши ваш дистрибутив.Выберите "Получить список недействительности Cloudfront" Затем выберите "Создать", чтобы создать новый список недействительности.Выберите файлы, которые необходимо аннулировать, и нажмите "Аннулировать". Подождите 5-15 минут.

Если у вас есть бото установленный (который предназначен не только для python, но также устанавливает множество полезных утилит командной строки), он предлагает утилиту командной строки, специально называемую cfadmin или "администратор облачного интерфейса", который предлагает следующие функциональные возможности:

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

Вы делаете что-то недействительным, запустив:

$sam# cfadmin invalidate <distribution> <path>

Просто публикую, чтобы проинформировать всех, кто посещает эту страницу (первый результат по "Обновлению файла Cloudfront") что существует простой в использовании + access онлайн-регистратор недействительности доступен по адресу swook.net

Этот новый недействитель является:

  • Полностью онлайн (без установки)
  • Доступно 24x7 (размещено Google) и не требует никакого членства.
  • Существует поддержка истории и проверки путей, что позволяет вам с легкостью аннулировать ваши файлы.(Часто всего несколькими щелчками мыши после аннулирования в первый раз!)
  • Это также очень безопасно, как вы узнаете, прочитав его сообщение о выпуске.

Полное раскрытие:Я сделал это.Получайте удовольствие!

один из очень простых способов сделать это - управление версиями ПАПОК.

Так что, например, если ваших статических файлов сотни, просто поместите их все в папку с именем year + versioning .

например, я использую папку с именем 2014_v1, внутри которой у меня есть все мои статические файлы...

Поэтому внутри моего HTML-кода я всегда помещаю ссылку на папку.(конечно, у меня есть PHP include, где я установил имя папки.) Итак, изменив в 1 файле, это фактически изменится во всех моих PHP-файлах..

Если я хочу полное обновление, я просто переименовываю папку в 2014_v2 в свой исходный код и изменяю внутри php include на 2014_v2

весь HTML автоматически изменяется и запрашивает новый путь, cloudfront пропускает кэш и запрашивает его у источника.

Пример:SOURCE.mydomain.com это мой исходный код, cloudfront.mydomain.com это CNAME для дистрибутива cloudfront.

Итак, PHP вызвал этот файл cloudfront.mydomain.com/2014_v1/javascript.js и когда я хочу полное обновление, просто переименовываю папку в исходном коде в "2014_v2" и меняю PHP include, устанавливая для папки значение "2014_v2".

Таким образом , нет никаких задержек для признания недействительным и НИКАКИХ ЗАТРАТ !

Это мой первый пост в stackoverflow, надеюсь, я сделал это хорошо!

Установите TTL = 1 часу и замените

http://developer.amazonwebservices.com/connect/ann.jspa?annID=655

В ruby, используя туманный драгоценный камень

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

даже при признании недействительным процесс обработки и обновления подтверждения недействительности на всех пограничных серверах Amazon по-прежнему занимает 5-10 минут

текущий интерфейс командной строки AWS поддерживает аннулирование в режиме предварительного просмотра.Запустите следующее в вашей консоли один раз:

aws configure set preview.cloudfront true

Я развертываю свой веб-проект с помощью npm.У меня есть следующие сценарии в моем 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"
}

Имея описанные выше сценарии на месте, вы можете развернуть свой сайт с:

npm run deploy

Если вы используете AWS, вы, вероятно, также используете его официальный инструмент CLI (рано или поздно). AWS CLI версия 1.9.12 или выше поддерживает аннулирование списка имен файлов.

Полное раскрытие:Я сделал это.Получайте удовольствие!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top