Я пытаюсь развернуть приложение .NET на ElasticBeanstalk с помощью инструментов AWS-cli.
Сначала загрузите, затем создайте версию, используя:
aws elasticbeanstalk create-application-version
--application-name "MyApp - DEV"
--version-label "0.1.165"
--source-bundle S3Bucket="xxx",S3Key="MyApp.0.1.165.zip"
--process
Это работает, поэтому следующий шаг:
aws elasticbeanstalk update-environment
--environment-name "myapp-dev-env"
--version-label "0.1.165"
--application-name "MyApp - DEV"
Иногда это заканчивается с кодом 255 и выводит:
Ошибка клиента (InvalidParameterValue) произошла при вызове операции UpdateEnvironment: версия приложения непригодна для использования и не может использоваться со средой
Расстраивает то, что эти точные шаги (выполняемые моим сервером непрерывной интеграции) иногда работают, и если я разверну эту версию с помощью консоли AWS, она также сработает. Загружаемый zip-архив ничем не отличается, и на самом деле, если я перестрою из той же исходной ревизии (с использованием сборки, которая ранее была успешно развернута, что дает ей новый номер версии), кажется, что (обычно) запускается в эту проблему.
Я не могу найти никаких подробностей о том, что означает эта ошибка, так где еще я могу посмотреть, что происходит?
Проблема была вызвана невыполнением ожидания "обработки" новой версии.
В create-application-version
команда вернула:
[Exec] {
[Exec] "ApplicationVersion": {
[Exec] "ApplicationName": "MyApp - DEV",
[Exec] "Status": "PROCESSING",
[Exec] "VersionLabel": "0.1.165",
[Exec] "DateCreated": "2016-04-19T19:27:35.948Z",
[Exec] "DateUpdated": "2016-04-19T19:27:35.948Z",
[Exec] "SourceBundle": {
[Exec] "S3Bucket": "xxx",
[Exec] "S3Key": "MyApp.0.1.165.zip"
[Exec] }
[Exec] }
[Exec] }
Я сделал 3-секундную задержку, затем побежал describe-application-versions
, и получил
[Exec] "Status": "PROCESSED",
(интересно, что DateUpdated
не менял)
После этого update-environment
команда работает нормально, и я без проблем развернул несколько версий.
Правильным решением было бы продолжить работу describe-application-versions
до состояния! = «Обработка», а затем обработать все случаи сбоя (статус, отличный от «Обработка» или «Обработано», или навсегда останется «Обработка»).
В моем случае я вызываю это из msbuild (где цикл и ожидание очень сложны), поэтому я достаточно доволен обходным путем произвольной задержки и позволяю update-environment
команда не сработает, если что-то пойдет не так. Потому что производство остается нетронутым до update-environment
, и фактическое время, затраченное на развертывание (до выполнения этой команды), не имеет значения, мне просто не нужно прилагать столько усилий.