AWS ECS Ошибка при выполнении задачи: в вашем кластере не найдено экземпляров контейнера

117

Я пытаюсь развернуть dockerобраз контейнера для AWSиспользования ECS, но экземпляр EC2 не создается. Я поискал в Интернете объяснение, почему я получаю следующую ошибку:

«Ошибка клиента (InvalidParameterException) произошла при вызове операции RunTask: в вашем кластере не обнаружено ни одного экземпляра контейнера».

Вот мои шаги:

1. Отправил образ докеры ИЗ Ubuntu в репозиторий Amazon ECS.

2. Зарегистрировать определение задачи ECS:

aws ecs register-task-definition --cli-input-json file://path/to/my-task.json 

3. Выполните задание:

aws ecs run-task --task-definition my-task

Тем не менее, это не удается.

Вот моя задача:

{
  "family": "my-task",
  "containerDefinitions": [
    {
        "environment": [],
        "name": "my-container",
        "image": "my-namespace/my-image",
        "cpu": 10,
        "memory": 500,
        "portMappings": [
            {
                "containerPort": 8080,
                "hostPort": 80
            }
        ],
        "entryPoint": [
            "java",
            "-jar",
            "my-jar.jar"
        ],
        "essential": true
    }
  ]
}

Я также пробовал использовать консоль управления для настройки кластера и служб, но получаю ту же ошибку. Как настроить кластер на наличие экземпляров ec2 и какие экземпляры контейнера мне нужно использовать? Я думал, что весь этот процесс заключался в создании экземпляров EC2 для начала !!

cosbor11
источник
Мне кажется, я видел это, когда быстро переходил между этапами создания кластера и выполнения задачи.
Ben Creasy

Ответы:

159

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

«Прежде чем вы сможете добавить экземпляры ECS в кластер, вы должны сначала перейти в консоль управления EC2 и создать ecs-optimizedэкземпляры с ролью IAM, к которой AmazonEC2ContainerServiceforEC2Roleприкреплена политика»

Вот вздор:

1. Перейдите на панель управления EC2 и нажмите Launch Instanceкнопку.

2. В разделе « Community AMIsПоиск» ecs-optimizedвыберите тот, который лучше всего соответствует потребностям вашего проекта. Любой будет работать. Нажмите кнопку "Далее.

3. Когда вы перейдете к настройке сведений об экземпляре, нажмите create new IAM role linkи создайте новую роль с именем ecsInstanceRole.

4. Прикрепите AmazonEC2ContainerServiceforEC2Roleполитику к этой роли.

5. Затем завершите настройку экземпляра ECS.
ПРИМЕЧАНИЕ. Если вы создаете веб-сервер, вам нужно создать группу безопасности, чтобы разрешить доступ к порту 80.

Через несколько минут, когда экземпляр будет инициализирован и запущен, вы можете обновить вкладку Экземпляры ECS, которые вы также пытаетесь добавить.

cosbor11
источник
10
Выбор предложенного ами, который был указан для данного региона, решил мою проблему. Чтобы узнать ami, вы должны выбрать этот URL docs.aws.amazon.com/AmazonECS/latest/developerguide/…
sanath_p
1
не видите AmazonEC2ContainerServiceforEC2Role, есть ли какие-либо изменения со времени вашего последнего сообщения?
BlueDolphin
1
@BlueDolphin Мне удалось найти эту политику, когда я создал новую роль в IAM.
cyrf 04
6
Стоит отметить сейчас (апрель 2018 г.), если вы используете в настоящее время бета-версию Fargate ( aws.amazon.com/fargate ), чтобы избежать всего этого типа хлопот, вам может понравиться, что я просто выбрал EC2тип запуска, когда вы получили эту ошибку ...
склонение
10
И, при создании EC2, не забудьте добавить #!/bin/bash echo ECS_CLUSTER=your_cluster_name >> /etc/ecs/ecs.configв , Advanced Details -> User dataесли у вас есть свой собственный, номер кластер по умолчанию. В противном случае вновь созданный экземпляр EC2 создаст кластер по умолчанию.
Jakub Czaplicki
40

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

Несмотря на то, что все экземпляры были созданы Amazon с правильными настройками, мои экземпляры не регистрировались. На форумах Amazon AWS я нашел подсказку. Оказывается, вашим кластерам нужен доступ в Интернет, и если ваш частный VPC не имеет интернет-шлюза, кластеры не смогут подключиться.

Исправление

На панели управления VPC необходимо создать новый Интернет-шлюз и подключить его к VPC, используемому кластером. После подключения вы должны обновить (или создать) таблицу маршрутов для VPC и добавить в качестве последней строки

0.0.0.0/0 igw-24b16740  

Где igw-24b16740 - это имя вашего недавно созданного интернет-шлюза.

P_W999
источник
Об этом говорится на docs.aws.amazon.com/AWSEC2/latest/UserGuide/… [EC2-VPC] Проверьте таблицу маршрутизации для подсети. Вам нужен маршрут, который отправляет весь трафик, предназначенный за пределами VPC, на интернет-шлюз для VPC.
Джастин М. Киз
2
Спасибо за подсказку! Я назначил своим экземплярам группу безопасности, которая блокировала весь исходящий трафик, за исключением трафика моего балансировщика нагрузки. Я переключил это, чтобы разрешить весь исходящий трафик, но ограничить входящий трафик только от балансировщика нагрузки, и затем экземпляры появились в моем кластере EC2.
Mikepote
1
Хотел бы я проголосовать за ваш ответ более одного раза. Это устранило мою точную проблему «В вашем кластере не было найдено ни одного экземпляра контейнера». и исходный ответ, за который проголосовали больше, не имел ничего общего с вашим фактическим решением. Еще раз спасибо.
alexkb
Помимо связывания шлюза с вашим VPC, вам может потребоваться направить через него интернет-трафик для конкретной подсети, в которой находятся ваши экземпляры ECS. - например, aws ec2 associate-route-table --subnet-id $SUBNET_ID --route-table-id $ROUTE_TABLE_IDмогу я предложить добавить это к ответу?
Грег
Я думаю, стоит упомянуть, что в тот момент, когда вы добавляете маршрут для 0.0.0..0 / 0, указывающий на IGW, подсеть больше не является частной подсетью. С точки зрения сетевой безопасности лучше создать маршрут, указывающий на NAT-шлюз.
Хенрик Пингель
18

Я столкнулся с этой проблемой при использовании Fargate. Исправил когда явно определил launchType="FARGATE"при звонке run_task.

Милан Чермак
источник
1
С помощью интерфейса командной строки, который я добавил--launch-type FARGATE
shlomiLan
11

Другие рекомендуемые проверки

  1. Выбор предлагаемого AMI, который был указан для данного региона, решил мою проблему.

    Чтобы узнать AMI, установите флажок Запуск экземпляра контейнера Amazon ECS .

  2. По умолчанию все экземпляры ec2 добавляются в кластер по умолчанию. Так что название кластера тоже имеет значение.

См. Пункт 10 в разделе « Запуск экземпляра контейнера Amazon ECS» .

Более подробная информация доступна в этой ветке .

sanath_p
источник
3

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

Помимо того, что было сказано здесь, касается роли экземпляра EC2, как здесь прокомментировано , в моем случае работало только в том случае, если я все еще настраивал экземпляр EC2 с простой информацией. Используя пользовательские данные, начальный сценарий, подобный этому:

#!/bin/bash
cat <<'EOF' >> /etc/ecs/ecs.config
ECS_CLUSTER=quarkus-ec2
EOF

Сообщение о соответствующем имени кластера ECS, созданном в этом файле конфигурации ecs, решило мою проблему. Без этой конфигурации журнал агента ECS в экземпляре EC2 показывал ошибку, из-за которой невозможно было подключиться к ECS, при этом у меня есть экземпляр EC2, видимый для кластера ECS.

После этого я смог получить экземпляр EC2, доступный для моего кластера EC2: введите описание изображения здесь

В документации AWS сказано, что эта часть является необязательной, но в моем случае она не работала без этой «необязательной» конфигурации.

Уалтер-младший
источник
2

Если вы столкнулись с этой проблемой после создания кластера

Перейдите к экземпляру ECS в списке экземпляров EC2 и проверьте роль IAM, которую вы назначили экземпляру. Вы можете легко идентифицировать экземпляры по имени экземпляра, начинающемуся сECS Instance

введите описание изображения здесь

После этого нажмите на роль IAM, и она направит вас к консоли IAM. Выберите AmazonEC2ContainerServiceforEC2Roleполитику из списка политик разрешений и сохраните роль.

Ваши экземпляры будут доступны в кластере вскоре после его сохранения.

sandaru.ny
источник
1

Настоящая проблема - отсутствие разрешения. Пока вы создаете и назначаете роль IAM с разрешением AmazonEC2ContainerServiceforEC2Role, проблема исчезает.

Бен
источник
0

Другой возможной причиной, с которой я столкнулся, было обновление AMI моего кластера ECS до AMI «Amazon Linux 2» вместо «AMI Amazon Linux», из-за чего мой скрипт запуска EC2 user_data не работал.

skeller88
источник
0

Когда это происходит, вам нужно обратить внимание на следующее:

  1. Ваши экземпляры EC2 должны иметь роль с AmazonEC2ContainerServiceforEC2Roleпривязанной к ней управляемой политикой.
  2. На ваших экземплярах EC2 должен быть запущен образ AMI ecs-optimized(вы можете проверить это на панели инструментов EC2)
  3. Частным подсетям вашего VPC не назначены общедоступные IP-адреса, ИЛИ у вас не настроена конечная точка интерфейса VPC, ИЛИ у вас не настроен шлюз NAT

В большинстве случаев эта проблема возникает из-за неправильно настроенного VPC. Согласно документации :

ЦИТАТА: Если у вас не настроена конечная точка интерфейса VPC и ваши экземпляры контейнеров не имеют общедоступных IP-адресов, они должны использовать преобразование сетевых адресов (NAT) для обеспечения такого доступа.

  • Чтобы создать конечную точку VPC: следуйте документации здесь
  • Чтобы создать шлюз NAT: следуйте документации здесь

Это причины, по которым вы не видите экземпляры EC2 в списке на панели управления ECS.

Выстрел
источник
0

Я понимаю, что это более старая тема, но я наткнулся на нее, увидев ошибку, упомянутую OP, следуя этому руководству .

Переход на ecs-optimizedобраз AMI не помог. У моего VPC уже был маршрут 0.0.0.0/0, указывающий на подсеть. Мои экземпляры были добавлены в правильный кластер, и у них были соответствующие разрешения.

Благодаря ссылке @ sanath_p на эту ветку я нашел решение и сделал следующие шаги:

  1. Скопировал конфигурацию моей группы автомасштабирования
  2. Установите IP address typeв дополнительных настройках значение «Назначать общедоступный IP-адрес каждому экземпляру».
  3. Обновлена ​​моя группа автомасштабирования для использования этой новой конфигурации.
  4. Обновил мои экземпляры на вкладке « Обновление экземпляра ».
paulmiller3000
источник