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

Amazon EFS как репозиторий кода для автоматических масштабируемых EC2

tl; dr: мне нужно настроить быструю автоматическую синхронизацию из EFS на несколько EC2

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

Это для веб-сайта Magento. Первоначально я рассматривал возможность хранения всего веб-контента в EFS (эластичной файловой системе) и монтирования его при загрузке моих EC2, так что была просто одна централизованная база кода, к которой у каждого из них был доступ. Я быстро обнаружил, что это была очень плохая идея - обслуживание веб-контента сайта размером с Magento через общий сетевой ресурс в основном неработоспособно, а с задержкой на EFS это даже хуже, чем у среднего общего ресурса NFS.

Сейчас я пытаюсь добиться централизованной базы кода в EFS с синхронизацией оттуда в «локальный» (EBS) каталог в каждом экземпляре в режиме, близком к реальному времени.

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

Я попытался find, аналогичный результат.

Я экспериментировал с файловый конвейерс symlink_or_copy транспортер, но это все еще кажется медленным - возможно, потому, что по той или иной причине он не может использовать inotify чтобы обнаружить изменения и возвращается к опросу.

В конечном итоге цель состоит в том, чтобы позволить разработчику развертывать новые и измененные файлы в одном месте, а эти файлы быстро и автоматически реплицировать во всех запущенных экземплярах. Разработчику не нужно знать или заботиться о том, сколько запущенных экземпляров - это, вероятно, будет меняться каждый час.

Этот ответ на аналогичный вопрос довольно хорош, и это тот подход, который я использую в настоящее время - обновляется один защищенный экземпляр EC2, создается новый AMI, остальные экземпляры уничтожаются и замены загружаются на основе нового образа. EFS в основном становится избыточным.

Но ручное вмешательство действительно намного сложнее и больше подвержено человеческим ошибкам, чем я могу придерживаться в долгосрочной перспективе. Я не хочу создавать новый AMI и конфигурацию запуска и обновлять группу автоматического масштабирования для использования этого нового LC каждый раз, когда я выполняю развертывание.

Итак ... как мне быстро и автоматически синхронизировать EFS с несколькими EC2?

Если я получу fileconveyor, работающий в тандеме с inotify, решит ли это проблему? Или это охота на диких гусей, кто-нибудь знает?

Вот что бы я сделал:

  • Создайте «золотой образ» AMI, в котором на данный момент все на своем месте. В идеале это можно было бы настроить с помощью комбинации CloudFormation и Opsworks.
  • Настроить AWS Code Commit для хранения исходного кода
  • Настроить Развертывание кода AWS для развертывания обновленного исходного кода в ваших экземплярах. Это означает, что вам не нужно перестраивать AMI для каждого изменения исходного кода, это простое развертывание. Используя золотой образ вместо того, чтобы строить с нуля, вы получаете преимущество быстрого создания нового экземпляра с небольшой задержкой для обновления кода. Это довольно тривиальное обновление, поэтому его, вероятно, можно сделать с помощью Данные пользователя EC2 если вы хотите сделать это быстро.
  • Если вы хотите автоматизировать создание тестовых / предварительных сред, тестирование и производственные развертывания (с дополнительным утверждением вручную), вы можете посмотреть Конвейер кода AWS.
  • Вы можете выполнять сине-зеленое (постепенное) развертывание с помощью Route53 / Nginx / HAProxy или красное / черное (переходное) развертывание с использованием различных методов.

Это не ракетостроение, чтобы заставить работать, но может занять некоторое время, если вы не знакомы с ним. Как только вы это сделаете, автоматизация может сэкономить много времени на тестирование и развертывание.

AWS CodeDeploy может быть вариантом для этого. Вы можете создать артефакт из одного экземпляра EC2, отправить его на S3 и развернуть его. используя CodeDeploy. Цитата:

Наконец, агент AWS CodeDeploy на каждом экземпляре извлекает целевую ревизию из указанной корзины Amazon S3 или репозитория GitHub и, используя инструкции в файле AppSpec, развертывает содержимое в экземпляре.

CodeDeploy поддерживает развертывания Blue / Green и позволяет вносить изменения и откаты, что может быть полезно в вашем случае.