Распространение/обновление Force CloudFront

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

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

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

Ответ 1

Хорошие новости. 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>

Ответ 2

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

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

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

Ответ 3

С API-интерфейсом Invalidation он обновляется через несколько минут.
Проверьте PHP Invalidator.

Ответ 4

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

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

Ответ 5

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

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

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

Шаг 1

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

Шаг 2

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

Шаг 3

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

Шаг 4

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

Шаг 5

Установите Тип события на "Объект, созданный (все)"

Шаг 6

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

Шаг 7

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

Шаг 8

Назовите свою функцию (что-то вроде: YourBucketNameS3ToCloudFrontOnCreateAll)

Шаг 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

Вернитесь на вкладку лямбда и вставьте свой идентификатор распространения вместо _YOUR_DISTRIBUTION_ID_ в код Python. Храните окружающие кавычки.

Шаг 13

Установите обработчик: lambda_function.lambda_handler

Шаг 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 Edge.

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

PSS - Обратите внимание, что только первые 1000 недействительных файлов в месяц бесплатны, каждая недействительность превышает предел стоимостью $0.005 USD. Также могут взиматься дополнительные сборы за функцию лямбда, но это очень дешево.

Ответ 6

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

Этот новый invalidator:

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

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

Ответ 7

Если у вас установлен boto (это не только для 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>

Ответ 8

один очень простой способ сделать это - версия FOLDER.

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

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

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

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

все HTML автоматически изменяются и запрашивают новый путь, тайник MISS облачного режима и запрашивают его у источника.

Пример: SOURCE.mydomain.com - мой источник, cloudfront.mydomain.com - это CNAME для облачного распределения.

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

Таким образом, нет никакой задержки для аннулирования и НЕТ СТОИМОСТИ!

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

Ответ 10

В рубине, используя жуткий туман

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

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

Ответ 11

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

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

Ответ 12

текущий AWS CLI поддерживает недействительность в режиме предварительного просмотра. Выполните одно из следующих действий в консоли:

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