Правильный путь аннулирования для объекта CloudFront

Я пытаюсь выяснить правильный путь для аннулирования объекта в раздаче CloudFront.

В CloudFront настроено альтернативное доменное имя *.example.com.

Сложность заключается в том, что я установил собственный источник на EC2, который использует HAProxy для перезаписи пути.

Так что просьба к

mysubdomain.example.com/icon.png

переписывается на

s3.amazonaws.com/examplebucket/somedirectory/mysubdomain/icon.png

и результат затем возвращается в CloudFront. (Итак, и Путь, и Хост переписываются)

Теперь у меня возникли проблемы с определением правильного пути для этого объекта при отправке запроса на аннулирование. (Я не хочу использовать управление версиями, потому что мне нужно, чтобы имя файла оставалось прежним)

Я пробовал со следующей конфигурацией, но, похоже, она не работает. Аннулирование создается и обрабатывается, но безрезультатно.

const invalidationParams = {
  DistributionId: 'MY_DISTRIBUTION_ID',
  InvalidationBatch: {
    CallerReference: 'SOME_RANDOM_STRING',
    Paths: {
      Quantity: 1,
      Items: [
        '/somedirectory/mysubdomain/icon.png'
      ]
    }
  }
}

Поскольку указан только PATH, который относится к дистрибутиву, и нет возможности указать полный URL-адрес в конфигурации аннулирования, делает ли это невозможным аннулирование объекта в этой конфигурации?


person levon    schedule 25.06.2016    source источник
comment
Просто используйте этот путь /somedirectory/mysubdomain/, он будет работать   -  person error2007s    schedule 25.06.2016


Ответы (1)


Аннулирование CloudFront рассматривает каждый объект, соответствующий спецификации пути в соответствии с запросом браузера. Чтобы сделать http://example.com/cat.jpg недействительным, вы указываете одно из следующего:

cat.jpg
/cat.jpg

Начальная косая черта необязательна, но подразумевается, если отсутствует.

Пути — это единственные значения, принимаемые для запросов на аннулирование.

Для каждого пограничного местоположения каждая копия объекта, соответствующего этому пути, независимо от альтернативного доменного имени или других связанных с ним атрибутов, будет удалена.

Обратите внимание, что «каждая копия объекта, соответствующая этому пути» может кого-то сбить с толку, поскольку можно предположить, что только одна копия будет соответствовать заданному пути, но это неверно. CloudFront кэширует разные копии «одного и того же» объекта в зависимости от того, какие параметры запроса пересылаются в источник. Если строка запроса, файл cookie, заголовки из белого списка и т. д. пересылаются, то многие копии «одного и того же» объекта будут кэшироваться, поскольку кэширование требует, чтобы кеш предполагал, что ответ будет меняться, если таковой имеется, если параметры пересылаемого запроса изменяются. Вот почему так мало пересылается по умолчанию — это помогает повысить процент попаданий, поскольку снижает вероятность того, что любой заданный запрос покажется «уникальным» для логики кэша.

person Michael - sqlbot    schedule 25.06.2016
comment
Спасибо за подробный ответ, но он все еще не работает. Я попытался использовать путь '/mysubdomain/icon.png', но после завершения инвалидации старый файл все еще загружается в браузере (я очистил кеш браузера). - person levon; 25.06.2016
comment
Я попытался сделать эту часть понятной, используя фразу спецификация пути, запрашиваемая браузером. Используйте путь запроса из внешнего интерфейса, а не переписанный (предварительно добавленный) внутренний путь. Просто укажите /icon.png, если браузер получает объект с помощью GET /icon.png HTTP/1.1. - person Michael - sqlbot; 25.06.2016
comment
Но в этом случае это сделало бы недействительными все файлы icon.png в дистрибутиве, а не тот, который находится по нужному мне пути, не так ли? Значит, нет способа аннулировать только тот, который мне нужен, если он находится под внутренним путем? - person levon; 25.06.2016
comment
Это сделает недействительным все, что называется icon.png в корне любого из сайтов, когда несколько сайтов проходят через один и тот же дистрибутив. Нет проблем, однако, как только какие-либо другие файлы (те, которые вы не хотели удалять) будут запрошены снова, они будут просто повторно загружены. В конце концов, CloudFront — это кеш, поэтому его содержимое эфемерно по определению и в любом случае может быть спонтанно удалено в любое время. Кроме того, объект либо не кэшируется, либо не кэшируется в любой момент времени: каждое из 50+ граничных местоположений имеет независимый кеш, содержащий только объекты, запрошенные через это конкретное граничное пространство. - person Michael - sqlbot; 25.06.2016
comment
И нет, нет способа сделать более конкретное выселение, чем шаблоны пути запроса. - person Michael - sqlbot; 25.06.2016
comment
Не большая проблема, конечно, но если все файлы с таким именем будут инвалидированы, это может стать проблемой, когда у меня есть сотни или более сайтов в моем дистрибутиве, так как только 1000 инвалидаций пути бесплатны в месяц. Кажется, единственным другим решением для меня было бы использовать уникальные имена файлов для каждого веб-сайта. - person levon; 25.06.2016
comment
или на самом деле это не имеет значения, потому что это 1000 путей в месяц, а не 1000 объектов, верно? Так что в любом случае это не имеет значения. - person levon; 25.06.2016
comment
Верно. Каждый путь засчитывается в 1000 бесплатных аннулирований, разрешенных в месяц, независимо от того, скольким объектам действительно соответствует этот путь. Таким образом, images/cat.jpg, images/*.jpg, images/* или даже * (чтобы аннулировать все во всем дистрибутиве) просто считаются 1 путем аннулирования. (Также помните, что ограничение в 1000 бесплатных путей аннулирования распространяется на все ваши базы раздачи CloudFront в учетной записи, а не на каждую раздачу.) - person Michael - sqlbot; 25.06.2016