Amazon EFS как хранилище кода для автоматически масштабируемых EC2
tl;dr: мне нужно настроить быструю автоматическую синхронизацию от EFS до нескольких EC2
Я создал группу автоматического масштабирования EC2 в AWS, и я ищу лучший способ управления развертыванием кода в моих экземплярах с минимально возможным прерыванием обслуживания (желательно без) и с минимальным количеством возможных ошибок персонала. (желательно нет, хахаха)...
Это для сайта Magento. Сначала я рассматривал хранение всего веб-контента в EFS (Elastic File System) и подключение моих EC2 к нему при загрузке, поэтому была просто одна централизованная кодовая база, к которой у каждого из них был бы доступ. Я быстро обнаружил, что это была очень плохая идея - обслуживание веб-контента сайта размером с Magento по общему сетевому ресурсу практически невозможно, а с задержкой в EFS это даже хуже, чем в среднем по NFS.
То, что я сейчас пытаюсь достичь, - это иметь централизованную кодовую базу в EFS, с синхронизацией почти в реальном времени оттуда в "локальный" (EBS) каталог в каждом экземпляре.
Я старался rsync
используя подход "тянуть", имея каждый экземпляр rsync файлы из EFS для себя. Сначала он выглядел неплохо, но, похоже, постепенно с каждым сканированием он становился все медленнее (после последней проверки прошло более часа).
Я старался find
, аналогичный результат.
Я экспериментировал с файловым конвейеромsymlink_or_copy
транспортер, но это все еще кажется медленным - возможно, потому что по той или иной причине он не в состоянии использовать inotify
чтобы обнаружить изменения и возвращается к опросу.
В конечном итоге цель состоит в том, чтобы позволить разработчику развернуть новые и измененные файлы в одном месте и обеспечить быструю и автоматическую репликацию этих файлов во всех запущенных экземплярах. Разработчик не должен знать или заботиться о том, сколько экземпляров запущено - он может меняться ежечасно.
Этот ответ на аналогичный вопрос довольно хорош, и это подход, который я сейчас использую: один защищенный экземпляр EC2 обновляется, создается новый AMI, остальные экземпляры уничтожаются, а замены загружаются на основе нового образа. EFS в основном становится избыточным.
Но ручное вмешательство требует гораздо больше хлопот и более подвержено человеческим ошибкам, чем я могу придерживаться в долгосрочной перспективе. Я не хочу создавать новый AMI и запускать конфигурацию, а также обновлять группу автоматического масштабирования, чтобы использовать этот новый LC каждый раз, когда я выполняю развертывание.
Итак... как мне быстро и автоматически синхронизировать EFS с несколькими EC2?
Если я получу файловый конвейер, работающий в тандеме с inotify, это решит это? Или это погоня за диким гусем, кто-нибудь знает?
2 ответа
Вот что я бы сделал:
- Создайте "золотой образ" AMI, который имеет все место на данный момент. В идеале это можно настроить с помощью комбинации CloudFormation и Opsworks.
- Настройте AWS Code Commit для хранения вашего исходного кода
- Настройте AWS Code Deploy для развертывания обновленного исходного кода в ваших экземплярах. Это означает, что вам не нужно перестраивать AMI для каждого изменения исходного кода, это простое развертывание. Используя "золотое" изображение вместо создания с нуля, вы получаете преимущество нового экземпляра, который создается быстро с небольшой задержкой для обновления кода. Это довольно тривиальное обновление, поэтому, возможно, его можно будет сделать с пользовательскими данными EC2, если вы хотите сделать это быстро.
- Если вы хотите автоматизировать создание тестовых / предварительных сред, тестирование и производственное развертывание (с дополнительным одобрением вручную), вы можете обратиться к AWS Code Pipeline.
- Вы можете сделать синий / зеленый (постепенный), используя Route53 / Nginx / HAProxy или красный / черный (обрезанный) развертывания, используя различные методы.
Этот материал не является ракетостроением, но может занять немного времени, если вы не знакомы с ним. После этого автоматизация может сэкономить значительное количество времени на тестирование и развертывание.
AWS CodeDeploy может быть вариантом для этого. Вы можете создать артефакт из одного экземпляра EC2, перенести его на S3 и развернуть с помощью CodeDeploy. Цитата:
Наконец, агент AWS CodeDeploy в каждом экземпляре извлекает целевую версию из указанного хранилища Amazon S3 или репозитория GitHub и, используя инструкции в файле AppSpec, развертывает содержимое в экземпляре.
CodeDeploy поддерживает развертывание Blue/Green и позволяет пересматривать и выполнять откат, что может быть полезно для вашего случая.