Назад | Перейти на главную страницу

Сине-зеленое развертывание - AWS Cloudfront с ELB в качестве настраиваемого источника

У меня следующая конфигурация:

Cloudfront - ELB - AutoScalingGroup - EC2s

Все работает нормально, пока не будет запущено развертывание 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 не будет.