Шаблон Cloudformation для создания сервиса ECS застрял в CREATE_IN_PROGRESS

Я создаю сервис AWS ECS с помощью Cloudformation.

Кажется, что все выполнено успешно, я вижу, что экземпляр подключен к балансировщику нагрузки, балансировщик нагрузки объявляет экземпляр как работоспособный, и если я нажимаю на балансировщик нагрузки, я успешно попадаю в мой работающий контейнер.

Глядя на панель управления ECS, я вижу, что работа службы стабилизировалась и все в порядке. Я также вижу, что контейнер стабилен и не завершается / не создается повторно.

Однако шаблон Cloudformation никогда не завершается, он застревает в CREATE_IN_PROGRESS примерно до 30-60 минут спустя, когда он откатывается, утверждая, что работа службы не стабилизировалась. Глядя на CloudTrail, я вижу несколько RegisterInstancesWithLoadBalancer экземпляров, созданных ecs-service-scheduler, все с одинаковыми параметрами, то есть с одним и тем же идентификатором экземпляра и балансировщиком нагрузки. Я использую стандартные роли и разрешения IAM для ECS, поэтому это не должно быть проблемой с разрешениями.

У кого-нибудь была подобная проблема?


person Anvar    schedule 22.09.2015    source источник
comment
что не удается в формировании облака? есть ли у вас неудачные мероприятия? Можете ли вы скопировать и вставить журнал событий формирования облаков?   -  person Mircea    schedule 23.09.2015
comment
обычно это означает, что ваши экземпляры / задачи не подошли должным образом.   -  person tedder42    schedule 23.09.2015
comment
@Mircea При создании службы ECS появляется сообщение о том, что служба не стабилизировалась. Однако при просмотре панели управления ECS появляется противоречивое сообщение о том, что работа службы стабилизировалась.   -  person Anvar    schedule 23.09.2015
comment
@ tedder42 Это то, о чем я подозреваю, однако, если я отключу откат стека, я смогу успешно получить доступ к своей службе / контейнеру / задаче, так что кажется, что она может появиться. Что касается экземпляров, кластер и экземпляры уже запущены, поскольку они созданы в другом шаблоне. Я также смог убедиться, что они работают, как ожидалось.   -  person Anvar    schedule 23.09.2015
comment
Похоже, что с такой же проблемой сталкиваются и другие люди: forum.aws.amazon.com /thread.jspa?threadID=190250   -  person Anvar    schedule 23.09.2015
comment
@Anvar Тебе когда-нибудь удавалось решить эту проблему?   -  person user2123288    schedule 15.11.2015
comment
@ user2123288 Нет, в конце концов я прибег к написанию скрипта, который будет вызывать CLI, и отказался от этого конкретного шаблона Cloudformation   -  person Anvar    schedule 19.11.2015


Ответы (8)


Ваш AWS::ECS::Service должен зарегистрировать полный ARN для TaskDefinition (Источник: См. Ответ ChrisB @ AWS на форумы AWS). Главное - установить в TaskDefinition полный ARN, включая ревизию. Если вы пропустите ревизию (:123 в приведенном ниже примере), будет использоваться последняя ревизия, но CloudFormation по-прежнему выходит на обед с «CREATE_IN_PROGRESS» примерно на час, прежде чем потерпит неудачу. Вот один из способов сделать это:

"MyService": {
    "Type": "AWS::ECS::Service",
    "Properties": {
        "Cluster": { "Ref": "ECSClusterArn" },
        "DesiredCount": 1,
        "LoadBalancers": [
            {
                "ContainerName": "myContainer",
                "ContainerPort": "80",
                "LoadBalancerName": "MyELBName"
            }
        ],
        "Role": { "Ref": "EcsElbServiceRoleArn" },
        "TaskDefinition": {
            "Fn::Join": ["", ["arn:aws:ecs:", { "Ref": "AWS::Region" },
            ":", { "Ref": "AWS::AccountId" },
            ":task-definition/my-task-definition-name:123"]]}
        }
    }
}

Вот отличный способ получить последнюю версию MyTaskDefinition с помощью aws cli и jq:

aws ecs list-task-definitions --family-prefix MyTaskDefinition | jq --raw-output .taskDefinitionArns[0][-1:]
person Pete    schedule 18.02.2016
comment
моя команда для получения последней версии: aws ecs list-task-definitions --family-prefix dev-device-settings --sort DESC | jq --raw-output .taskDefinitionArns[0] | tr ':' '\n' | tail -1 - person Jeremie; 04.09.2018
comment
Гораздо проще было бы использовать функцию !Ref для возврата ARN вашего AWS::ECS::TaskDefinition. Создание такого ARN очень сложно. Посмотрите на возвращаемые значения на этой странице: docs .aws.amazon.com / AWSCloudFormation / latest / UserGuide / - person domdambrogia; 18.02.2019

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

ПРИМЕЧАНИЕ: все приведенные ниже фрагменты YAML находятся в одном шаблоне CloudFormation.

Итак, в качестве примера я создал это Repository:

MyRepository:
    Type: AWS::ECR::Repository

А потом я создал это Cluster:

MyCluster:
    Type: AWS::ECS::Cluster

А это TaskDefinition (в сокращении):

MyECSTaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
        # ...
        ContainerDefinitions:
            # ...
              Image: !Join ["", [!Ref "AWS::AccountId", ".dkr.ecr.", !Ref "AWS::Region", ".amazonaws.com/", !Ref MyRepository, ":1"]]
            # ...

Определив их, я создал Service вот так:

MyECSServiceDefinition:
    Type: AWS::ECS::Service
    Properties:
        Cluster: !Ref MyCluster
        DesiredCount: 2
        PlacementStrategies:
            - Type: spread
              Field: attribute:ecs.availability-zone
        TaskDefinition: !Ref MyECSTaskDefinition

Все это казалось мне разумным, но оказалось, что в этом написании / развертывании есть две проблемы, из-за которых он завис.

  1. Для DesiredCount установлено значение 2, что означает, что он фактически попытается развернуть службу и запустить ее, а не просто определить ее. Если я установлю DesiredCount на 0, это будет работать нормально.
  2. Image, определенный в MyECSTaskDefinition, еще не существует. Я сделал репозиторий как часть этого шаблона, но на самом деле я ничего в него не вставлял. Поэтому, когда MyECSServiceDefinition попытался развернуть DesiredCount из 2 экземпляров, он завис, потому что изображение на самом деле не было доступно в репозитории (потому что репозиторий буквально только что был создан в том же шаблоне).

Итак, на данный момент решение состоит в том, чтобы создать стек CloudFormation с DesiredCount = 0 для Service, загрузить соответствующий Image в репозиторий, а затем обновить стек CloudFormation для масштабирования службы. Или, как вариант, иметь отдельный шаблон, который настраивает основную инфраструктуру, такую ​​как репозиторий, загружать в него сборки, а затем иметь отдельный шаблон для запуска, который настраивает сами Services.

Надеюсь, что это поможет любому, у кого есть эта проблема!

person Brent Writes Code    schedule 16.06.2017
comment
Также, если определение задачи не имеет соответствующих разрешений ExecutionRole, служба зависнет в состоянии CREATING. У меня это случилось, когда я пытался создать LogConfiguration. - person Gary Holiday; 01.07.2019
comment
Также происходит, если тег изображения не существует в репозитории, например. возможно опечатка - person Dennis; 26.08.2019
comment
Надеюсь, что это поможет любому, у кого есть эта проблема! Это действительно так! Большое спасибо! - person Moneer81; 28.08.2019
comment
У меня все в одном стеке, установил DesiredCount в 0, фиксированное ECS :: Service CREATE_IN_PROGRESS занимает много времени, затем построит feil, спасибо :) - person GuoJunjun; 12.08.2020
comment
Альтернатива, если вы просто хотите иметь один сценарий, который не нужно обновлять, - это воспользоваться преимуществом длительного зависания CloudFormation (на самом деле он пытается и пытается найти изображение, когда оно зависает). Это дает достаточно времени, чтобы вручную загрузить изображение в ECR, и CloudFormation найдет его практически сразу после загрузки. - person Steve Chambers; 28.07.2021

Нет необходимости регистрировать полный ARN для TaskDefinition, потому что, когда логический идентификатор этого ресурса предоставляется встроенной функции Ref, Ref возвращает имя ресурса Amazon (ARN).

В следующем примере функция Ref возвращает ARN задачи MyTaskDefinition, например arn: aws: ecs: us-west-2: 123456789012: task / 1abf0f6d-a411-4033-b8eb-a4eed3ad252a.

{"Ref": "MyTaskDefinition"}

Источник http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html

person adilr00t    schedule 19.07.2016
comment
отлично работает ... пока определение задачи находится в том же стеке. В противном случае Fn :: ImportValue - хороший способ сделать это через стеки. docs.aws.amazon.com/AWSCloudFormation/ последняя / UserGuide / - person Daniel Farrell; 14.02.2017

Думаю, у меня была аналогичная проблема. Попробуйте посмотреть свойство «DesiredCount» в шаблоне службы. Я думаю, CloudFormation укажет, что создание / обновление все еще продолжается, пока Служба не достигнет этого числа «DesiredCount» в вашем кластере.

person Aymen Chetoui    schedule 11.10.2015
comment
Служба сообщает о стабилизации в пользовательском интерфейсе ECS, и желаемый счетчик и текущий счетчик установлены на 1. Попадание в контейнер также работает должным образом, и ELB сообщает об экземпляре правильно. Это похоже на то, что уведомление просто не доходит до Cloudformation - person Anvar; 15.10.2015

Все, что препятствует достижению определением службы ECS желаемого количества. В одном из примеров отсутствуют разрешения в политиках, связанных с ролью, используемой экземплярами. Проверьте журналы агента ECS экземпляров (/var/log/ecs/ecs-agent.log. timestamp).

Другой пример: у экземпляров недостаточно памяти для соответствия запрошенному желаемому количеству .... событий будет отображаться что-то вроде этого:

"... службе myService не удалось разместить задачу, потому что ни один экземпляр контейнера не отвечал всем ее требованиям. Ближайшему соответствующему экземпляру контейнера 123456789 недостаточно памяти ..."

person Community    schedule 14.08.2017

Чтобы добавить еще одну точку данных, я видел, как AWS::ECS::Service постоянно застревает в CREATE_IN_PROGRESS, если образ докера ECR не одновременно а) доступен из репозитория ECR и б) проходит проверку работоспособности.

Я несколько раз пытался загрузить AWS::ECS::Service с контейнером valid-image-hash-but-failing-health-check, затем исправить образ и выполнить различные операции «установить желаемый счетчик на ноль», «вернуть его обратно» и т. Д. ., и ничто AFAICT не отключает его.

В конце концов мне придется удалить стек и начать с изображения, которое немедленно проходит проверку работоспособности. Тогда нормально работает.

Супер хлопья.

person Stephen Haberman    schedule 04.10.2019

У меня такая же проблема. Я решил, увеличив объем выделенной памяти для определения задачи.

Контейнеры, которые вы используете, не должны превышать доступную память на вашем экземпляре ECS.

person thishandp7    schedule 27.06.2018

Чтобы добавить еще одну возможность, я столкнулся с этой проблемой один раз, когда все было в порядке с шаблоном, желаемое количество задач = количество запущенных задач и т. Д. Оказалось, что один из базовых экземпляров EC2 застрял около 100% состояния ЦП (но EC2 посчитал это «здоровым»). Это мешало CloudFormation проверить этот конкретный экземпляр. Я убил плохой экземпляр EC2, и ECS создала действительно здоровый.

person iandw    schedule 11.12.2018