AWS ECS Błąd podczas uruchamiania zadania: w klastrze nie znaleziono żadnych instancji kontenera

116

Próbuję wdrożyć dockerobraz kontenera do AWSużycia ECS, ale instancja EC2 nie jest tworzona. Przeszukałem internet w poszukiwaniu wyjaśnienia, dlaczego otrzymuję następujący błąd:

„Wystąpił błąd klienta (InvalidParameterException) podczas wywoływania operacji RunTask: w klastrze nie znaleziono żadnych instancji kontenera”.

Oto moje kroki:

1. Przesłano obraz dockera Z Ubuntu do mojego repozytorium Amazon ECS.

2. Zarejestrowano definicję zadania ECS:

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

3. Uruchomiłem zadanie:

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

Jednak to się nie udaje.

Oto moje zadanie:

{
  "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
    }
  ]
}

Próbowałem również użyć konsoli zarządzania do skonfigurowania klastra i usług, ale pojawia się ten sam błąd. Jak skonfigurować klaster, aby zawierał wystąpienia ec2 i jakiego rodzaju wystąpienia kontenera muszę używać? Myślałem, że cały ten proces polega na stworzeniu instancji EC2 na początek !!

cosbor11
źródło
Wydaje mi się, że to widziałem, kiedy szybko przechodziłem między etapami tworzenia klastra i uruchamiania zadania.
Ben Creasy,

Odpowiedzi:

159

Doszedłem do tego po kilku godzinach badania. Amazon, jeśli nasłuchujesz, powinieneś określić to gdzieś w konsoli zarządzania podczas tworzenia klastra lub dodawania instancji do klastra:

„Zanim będzie można dodać instancje ECS do klastra, należy najpierw przejść do konsoli zarządzania EC2 i utworzyć ecs-optimizedinstancje z rolą IAM z AmazonEC2ContainerServiceforEC2Roledołączoną polityką”

Oto rigmarole:

1. Przejdź do pulpitu nawigacyjnego EC2 i kliknij Launch Instanceprzycisk.

2. W obszarze Community AMIsWyszukaj ecs-optimizedi wybierz ten, który najlepiej pasuje do potrzeb Twojego projektu. Każdy zadziała. Kliknij Następny.

3. Gdy dojdziesz do Konfigurowania szczegółów instancji, kliknij create new IAM role linki utwórz nową rolę o nazwie ecsInstanceRole.

4. Dołącz AmazonEC2ContainerServiceforEC2Rolezasady do tej roli.

5. Następnie zakończ konfigurację instancji ECS.
UWAGA: Jeśli tworzysz serwer sieciowy, będziesz chciał utworzyć grupę bezpieczeństwa, aby umożliwić dostęp do portu 80.

Po kilku minutach, gdy instancja zostanie zainicjowana i uruchomiona, możesz odświeżyć kartę ECS Instances, którą również próbujesz dodać.

cosbor11
źródło
10
Wybranie sugerowanego ami, które było określone dla danego regionu, rozwiązało mój problem. Aby dowiedzieć się, jakie ami należy wybrać, sprawdź ten adres URL docs.aws.amazon.com/AmazonECS/latest/developerguide/ ...
sanath_p
1
nie widzisz AmazonEC2ContainerServiceforEC2Role, czy nastąpiła jakaś zmiana od czasu Twojego ostatniego postu?
BlueDolphin
1
@BlueDolphin Udało mi się znaleźć tę zasadę, kiedy utworzyłem nową rolę w IAM.
cyrf
6
Warto zauważyć, że teraz (kwiecień 2018), jeśli używasz obecnie Beta Fargate ( aws.amazon.com/fargate ), aby uniknąć tego całego rodzaju kłopotów, może chcesz, żebym właśnie wybrał EC2jako typ uruchomienia, gdy pojawi się ten błąd ...
deklinacja
10
I podczas tworzenia EC2, nie zapomnij dodać #!/bin/bash echo ECS_CLUSTER=your_cluster_name >> /etc/ecs/ecs.configw Advanced Details -> User datajeśli masz swój własny, dla klastra domyślny. W przeciwnym razie nowo utworzona instancja EC2 utworzy klaster domyślny.
Jakub Czaplicki
40

Obecnie interfejs sieciowy Amazon AWS może automatycznie tworzyć instancje z poprawnym AMI i poprawną nazwą, aby zarejestrować się we właściwym klastrze.

Mimo że wszystkie instancje zostały utworzone przez Amazon z prawidłowymi ustawieniami, moje instancje nie zostałyby zarejestrowane. Na forach Amazon AWS znalazłem wskazówkę. Okazuje się, że Twoje klastry potrzebują dostępu do Internetu, a jeśli Twój prywatny VPC nie ma bramy internetowej, klastry nie będą mogły się połączyć.

Poprawka

W panelu kontrolnym VPC należy utworzyć nową bramę internetową i podłączyć ją do VPC używanego przez klaster. Po podłączeniu musisz zaktualizować (lub utworzyć) tabelę tras dla VPC i dodać jako ostatnią linię

0.0.0.0/0 igw-24b16740  

Gdzie igw-24b16740 to nazwa nowo utworzonej bramy internetowej.

P_W999
źródło
Jest to wymienione na stronie docs.aws.amazon.com/AWSEC2/latest/UserGuide/ ... [EC2-VPC] Sprawdź tabelę tras dla podsieci. Potrzebujesz trasy, która kieruje cały ruch skierowany poza VPC do bramy internetowej VPC.
Justin M. Keyes
2
Dziękuję za wskazówkę! Do moich instancji przypisałem grupę zabezpieczeń, która blokowała cały ruch wychodzący z wyjątkiem ruchu do mojego modułu równoważenia obciążenia. Zmieniłem to, aby zezwolić na cały ruch wychodzący, ale ograniczyć ruch przychodzący tylko z modułu równoważenia obciążenia, a instancje pojawiły się w moim klastrze EC2.
Mikepote
1
Chciałbym móc głosować na twoją odpowiedź więcej niż raz. To rozwiązało mój dokładny problem „W Twoim klastrze nie znaleziono żadnych instancji kontenerów”. a pierwotna odpowiedź, w której głosowało więcej, nie miała nic wspólnego z Twoim rzeczywistym rozwiązaniem. Jeszcze raz dziękuję.
alexkb
Oprócz powiązania bramy z VPC może być konieczne skierowanie przez nią ruchu internetowego do określonej podsieci, w której znajdują się instancje ECS. - na przykład aws ec2 associate-route-table --subnet-id $SUBNET_ID --route-table-id $ROUTE_TABLE_ID- czy mogę zasugerować dodanie tego do odpowiedzi?
Greg,
Myślę, że warto wspomnieć, że w momencie dodania trasy dla 0.0.0..0 / 0 wskazującej na IGW podsieć nie jest już prywatną podsiecią. Z punktu widzenia bezpieczeństwa sieci lepiej jest utworzyć trasę wskazującą na bramę NAT.
Henrik Pingel
18

Napotkałem ten problem podczas korzystania z Fargate. Naprawiłem to, kiedy wyraźnie zdefiniowałem launchType="FARGATE"podczas dzwonienia run_task.

Milan Cermak
źródło
1
Z CLI dodałem--launch-type FARGATE
shlomiLan
11

Inne sugerowane kontrole

  1. Wybór sugerowanego AMI, który został określony dla danego regionu, rozwiązał mój problem.

    Aby dowiedzieć się o AMI - sprawdź Uruchamianie instancji kontenera Amazon ECS .

  2. Domyślnie wszystkie wystąpienia ec2 są dodawane do domyślnego klastra. Dlatego też nazwa klastra ma znaczenie.

Zobacz punkt 10 w sekcji Uruchamianie instancji kontenera Amazon ECS .

Więcej informacji w tym wątku .

sanath_p
źródło
3

Na wypadek, gdyby ktoś inny został zablokowany przez ten problem, tak jak ja ... Próbowałem wszystkiego tutaj i nie zadziałało.

Poza tym, co zostało tutaj powiedziane, dotyczy roli instancji EC2, jak skomentowałem tutaj , w moim przypadku działało tylko wtedy, gdy nadal skonfigurowałem instancję EC2 z prostymi informacjami. Używając danych użytkownika, skorzystaj z takiego początkowego skryptu:

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

Poinformowanie o powiązanej nazwie klastra ECS utworzonej w tym pliku konfiguracyjnym ecs rozwiązało mój problem. Bez tej konfiguracji dziennik agenta ECS w instancji EC2 pokazywał błąd uniemożliwiający połączenie z ECS. Robiąc to, mam instancję EC2 widoczną dla klastra ECS.

Po wykonaniu tej czynności mogłem uzyskać Instancję EC2 dostępną dla mojego klastra EC2: wprowadź opis obrazu tutaj

Dokumentacja AWS mówi, że ta część jest opcjonalna, ale w moim przypadku nie działałaby bez tej „opcjonalnej” konfiguracji.

Ualter Jr.
źródło
2

Jeśli napotkałeś ten problem po utworzeniu klastra

Przejdź do instancji ECS na liście instancji EC2 i sprawdź rolę IAM przypisaną do instancji. Możesz łatwo zidentyfikować instancje, używając nazwy instancji zaczynającej się odECS Instance

wprowadź opis obrazu tutaj

Następnie kliknij rolę IAM, a zostaniesz przekierowany do konsoli IAM. Wybierz AmazonEC2ContainerServiceforEC2Rolepolitykę z listy zasad uprawnień i zapisz rolę.

Twoje instancje będą dostępne w klastrze wkrótce po jego zapisaniu.

sandaru.ny
źródło
1

Prawdziwym problemem jest brak pozwolenia. Jeśli utworzysz i przypiszesz rolę IAM z uprawnieniem AmazonEC2ContainerServiceforEC2Role, problem zniknie.

Ben
źródło
0

Inną możliwą przyczyną, na którą się natknąłem, była aktualizacja mojego klastra ECS AMI do AMI „Amazon Linux 2” zamiast „Amazon Linux AMI”, co spowodowało, że mój skrypt uruchamiania EC2 user_data nie działał.

skeller88
źródło
0

W takim przypadku należy spojrzeć na następujące kwestie:

  1. Twoje instancje EC2 powinny mieć rolę z AmazonEC2ContainerServiceforEC2Roledołączoną polityką zarządzaną
  2. Twoje instancje EC2 powinny mieć uruchomiony obraz AMI, który jest ecs-optimized(możesz to sprawdzić w panelu EC2)
  3. Prywatne podsieci Twojego VPC nie mają przypisanych publicznych adresów IP LUB nie masz skonfigurowanego punktu końcowego VPC interfejsu LUB nie masz skonfigurowanej bramy NAT

W większości przypadków ten problem pojawia się z powodu nieprawidłowo skonfigurowanego VPC. Zgodnie z dokumentacją :

CYTAT: Jeśli nie masz skonfigurowanego punktu końcowego VPC interfejsu, a instancje kontenera nie mają publicznych adresów IP, to w celu zapewnienia tego dostępu muszą używać translacji adresów sieciowych (NAT).

  • Aby utworzyć punkt końcowy VPC: postępuj zgodnie z dokumentacją tutaj
  • Aby utworzyć bramę NAT: Postępuj zgodnie z dokumentacją tutaj

Oto powody, dla których nie widzisz instancji EC2 na pulpicie nawigacyjnym ECS.

Strzał
źródło