Сбой AWS CodeDeploy: сбой развертывания, поскольку указанный файл уже существует в этом месте
Я пытаюсь настроить развертывание кода AWS с помощью Github для автоматизации моего развертывания. проблема у меня в том, что экземпляр ec2 уже активен и имеет код веб-приложения. проблема заключается в том, что в экземпляре есть другой контент, который я не хочу контролировать из-под исходного кода. Развертывание кода завершается с ошибкой:
The deployment failed because a specified file already exists at this location
это потому, что исходный код находится на экземпляре и не был добавлен в качестве ревизии.
Итак, у меня вопрос, есть ли способ заставить код развертывания распознавать текущие файлы в экземпляре как начальную ревизию?
6 ответов
Это возможно! Это вариант во время развертывания: "Параметры содержимого: выберите действие, которое AWS CodeDeploy будет выполнять во время развертывания, если файл в целевом экземпляре имеет то же имя, что и файл в редакции приложения, для того же целевого расположения".
Вы можете выбрать сбой, перезаписать и сохранить. Retain, вероятно, лучший выбор в вашем случае.
Вы можете найти больше информации
docs.aws.amazon.com (странно под "откатом")
cli docs.aws.amazon.com (см. --file-Существующее поведение (строка))
Это мой пример apppec.yml
version: 0.0
os: linux
files:
- source: /
destination: /var/www/wordpress/
overwrite: true
file_exists_behavior: OVERWRITE
А это обновленное руководство пользователя AWS для раздела «файлы» AppSpec (только для EC2/локальных развертываний) . Там вы найдете три варианта: DISALLOW, OVERWRITE и RETAIN.
Вы можете просто удалить все содержимое вашего веб-корня и позволить CodeDeploy обновить его. Любой тип развертывания заменит все содержимое.
Если вы не уверены, скопируйте webroot в другую папку, и в очень маловероятном случае сбоя вы можете скопировать все обратно.
Развертывания часто заканчиваются неудачей, когда файл был изменен на диске, я предполагаю, что CodeDeploy проверяет время изменения файла.
Если вы просто хотите, чтобы ошибка исчезла, вы можете использовать один из более ранних сценариев Lifecycle Hook (возможно, BeforeInstall), чтобы удалить эту папку, прежде чем источник будет снова добавлен в более поздний Hook. Если источник не будет повторно добавлен в более поздний Hook, добавьте его самостоятельно.
Я получал эту ошибку даже на новых экземплярах, поэтому CodeDeploy должен как-то кэшировать эту папку, а потом расстраиваться из-за этого.
Проблема заключается в том, что CodeDeploy поддерживает файл очистки, который он обновляет после каждого развертывания. Это файлы, которые будут удалены перед установкой новых. Конечно, вы могли бы создать это сами, но это сложно. Смысл CodeDeploy в том, чтобы упростить задачу. Это то, что я сделал (Примечание: в моем приложении много файлов, и я собирался найти что-то кроме CodeDeploy, которое фактически облегчало бы переход к нему вместо болезненного и глупого, а затем я сформулировал этот подход; если у вас есть небольшой количество файлов, может быть проще создать сценарий BeforeInstall или удалить их вручную):
создать бесплатный экземпляр EC2 (t2.micro). Если ваше приложение гигантское, вам может потребоваться больше места на диске, поэтому настройте его по мере необходимости. Это не будет работать ваше приложение!
Создайте новую группу развертывания, указывающую на этот новый экземпляр.
Создайте новый YAML, который на самом деле не выполняет никаких задач BeforeInstall или AfterInstall. Вы не пытаетесь запустить свое приложение. Вы буквально перемещаете файлы. Это так, что вы можете получить этот файл очистки.
После развертывания выполните ssh в экземпляре ec2 (не забудьте разрешить SSH в группе безопасности!) И перейдите в /opt/codedeploy-agent/deploy-root/deploy-инструкция / /
Вы увидите {deploy-group-identifier}-cleanup. Примените это к экземпляру ec2, на котором вы действительно хотите запустить свое приложение. Или FileZilla на ваш основной компьютер, а затем на основной экземпляр ec2. Это был самый простой выбор для меня, потому что на моей локальной машине уже были все нужные ключи.
SSH в основной экземпляр ec2 и переместите файл очистки в /opt/codedeploy-agent/deploy-root/deploy-инструкции /, если его там еще нет. Обратите внимание на сбойный {идентификатор-группы-развертывания} и замените {файл-группы-идентификатора файла очистки} на сбойный идентификатор.
Перезапустите развертывание.
8???.
- Прибыль.
Я предоставлю более подробные инструкции для каждого из этих шагов (за исключением 8 и 9... которые уйдут), когда у меня будет время.
У меня была такая же проблема при работе в CodeDeploy с инстансами EC2.
- Я удалил экземпляры EC2 из группы развертывания AWS CodeDeploy. Я добавил новые экземпляры EC2 в группу развертывания.
- В противном случае замените новую группу развертывания существующей группой развертывания.