У меня следующая конфигурация:
Cloudfront - ELB - AutoScalingGroup - EC2s
file-[hash].js
файлы (с chunkhash в их именах) из произвольного источника (ELB). file-[hash].js
файлы для Cloudfront плюс динамически генерируемые index.html
файл, который указывает на соответствующий .js
файл в Cloudfront.Все работает нормально, пока не будет запущено развертывание Cloudformation с измененным активом (скажем, из file-1.js
к file-2.js
) - при включении новой версии появляется короткое временное окно, когда браузер получает новую index.html
файл, указывающий на file-2.js
, но когда он пытается скачать file-2.js
он получает 404 от Cloudfront, показывая пользователю ошибку.
Я понимаю, что это связано с тем, как работает сине-зеленое развертывание - то есть бывает время, когда две версии приложения работают одновременно, и ELB может перенаправить один запрос на новую версию (запрос на index.html
из браузера), а второй - в старую версию (запрос file-2.js
из Cloudfront).
Документы Cloudfront говорят, что вы должны «размещать и обслуживать один и тот же контент на всех серверах», но как я могу добиться этого во время развертывания? Можно ли добиться, чтобы только одна версия приложения была доступна через ELB в любой момент времени, чтобы Cloudfront никогда не получал 404 для новых ресурсов?
Если нет, есть ли другие варианты решения этой проблемы, кроме перехода с пользовательского источника на S3? (хотелось бы избежать этого из-за сложности развертывания / обслуживания)
Обратите внимание: переключение с политики обновления AutoScalingRollingUpdate на AutoScalingReplacingUpdate не помогло:
asg: Type: AWS::AutoScaling::AutoScalingGroup CreationPolicy: ResourceSignal: Count: Ref: 2 Timeout: PT10M UpdatePolicy: AutoScalingReplacingUpdate: WillReplace: true
Я думаю, что решение этой проблемы - сохранить статические файлы .js в S3 и поддерживать предыдущие версии вместе с новыми во время публикации новых приложений.
CloudFront будет обслуживать статический контент из S3 и динамический контент из EC2.
Сначала опубликуйте статический контент на S3, затем начните переход.
В этом случае динамически создаваемая индексная страница будет ссылаться на одну корзину S3 в старой версии, а другую - на новую. Поскольку оба ресурса всегда разрешаются в S3, 404 не будет.