작업 실행시 AWS ECS 오류 : 클러스터에 컨테이너 인스턴스가 없습니다.


115

dockerAWS사용하여 컨테이너 이미지 를 배포하려고 ECS하지만 EC2 인스턴스가 생성되지 않습니다. 다음 오류가 발생하는 이유에 대한 설명을 찾기 위해 인터넷을 검색했습니다.

"RunTask 작업을 호출 할 때 클라이언트 오류 (InvalidParameterException)가 발생했습니다. 클러스터에서 컨테이너 인스턴스를 찾을 수 없습니다."

내 단계는 다음과 같습니다.

1. Ubuntu에서 Amazon ECS repo로 Docker 이미지를 푸시했습니다.

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 인스턴스를 생성하는 것이라고 생각했습니다 !!


클러스터를 생성하고 작업을 실행하는 단계 사이를 빠르게 진행할 때 이것을 본 것 같습니다.
벤 크리시

답변:


158

나는 몇 시간 더 조사한 후에 이것을 알아 냈다. Amazon에서 수신하는 경우 클러스터를 생성하거나 클러스터에 인스턴스를 추가 할 때 관리 콘솔의 어딘가에이를 명시해야합니다.

"클러스터에 ECS 인스턴스를 추가하려면 먼저 EC2 관리 콘솔로 이동 ecs-optimized하여 AmazonEC2ContainerServiceforEC2Role정책이 연결된 IAM 역할로 인스턴스를 생성해야합니다. "

다음은 rigmarole입니다.

1. EC2 대시 보드로 이동 하여 Launch Instance버튼을 클릭 합니다.

2.에서 Community AMIs를 검색하고 ecs-optimized프로젝트 요구 사항에 가장 적합한 것을 선택합니다. 모두 작동합니다. 다음을 클릭하십시오.

3. Configure Instance Details에 도달하면을 클릭하고 create new IAM role link라는 새 역할을 만듭니다 ecsInstanceRole.

4. AmazonEC2ContainerServiceforEC2Role해당 역할에 정책을 연결합니다 .

5. 그런 다음 ECS 인스턴스 구성을 완료합니다.
참고 : 웹 서버를 생성하는 경우 포트 80에 대한 액세스를 허용하는 securityGroup을 생성 할 수 있습니다.

몇 분 후 인스턴스가 초기화되고 실행되면 인스턴스를 추가하려는 ECS 인스턴스 탭을 새로 고칠 수 있습니다.


10
주어진 지역에 대해 지정된 제안 된 ami를 선택하면 문제가 해결되었습니다. AMI의 내용을 보려면 다음 URL에서 확인할 선택해야 docs.aws.amazon.com/AmazonECS/latest/developerguide/...
sanath_p

1
AmazonEC2ContainerServiceforEC2Role이 표시되지 않습니다. 마지막 게시물 이후로 변경된 사항이 있습니까?
BlueDolphin 2017-10-23

1
@BlueDolphin IAM에서 새 역할을 만들 때 해당 정책을 찾을 수있었습니다.
cyrf

6
이 모든 유형의 번거 로움 을 피하기 위해 현재 Beta Fargate ( aws.amazon.com/fargate )를 사용하고 있다면 지금 (2018 년 4 월) 주목할 가치가 있습니다.이 오류가 발생했을 때 시작 유형으로 방금 선택한 것이 좋을 것입니다. ...EC2
declension

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에서 올바른 설정으로 생성되었지만 내 인스턴스가 등록되지 않았습니다. 온 아마존 AWS 포럼 나는 단서를 발견했다. 클러스터에 인터넷 액세스가 필요하며 프라이빗 VPC에 인터넷 게이트웨이가없는 경우 클러스터를 연결할 수 없습니다.

수정

VPC 대시 보드에서 새 인터넷 게이트웨이를 생성하고 클러스터에서 사용하는 VPC에 연결해야합니다. 연결되면 VPC에 대한 라우팅 테이블을 업데이트 (또는 생성)하고 마지막 줄로 추가해야합니다.

0.0.0.0/0 igw-24b16740  

여기서 igw-24b16740은 새로 생성 된 인터넷 게이트웨이의 이름입니다.


이는 docs.aws.amazon.com/AWSEC2/latest/UserGuide/…에 언급되어 있습니다. [EC2-VPC] 서브넷의 라우팅 테이블을 확인합니다. VPC 외부로 향하는 모든 트래픽을 VPC의 인터넷 게이트웨이로 보내는 경로가 필요합니다.
Justin M. Keyes

2
단서 감사합니다! 로드 밸런서에 대한 트래픽을 제외한 모든 아웃 바운드 트래픽을 차단하는 보안 그룹을 인스턴스에 할당했습니다. 모든 아웃 바운드 트래픽을 허용하지만로드 밸런서에서 들어오는 트래픽 만 제한하도록이 옵션을 전환 한 다음 인스턴스가 내 EC2 클러스터에 나타납니다.
Mikepote

1
나는 당신의 대답을 두 번 이상 찬성 할 수 있기를 바랍니다. 이렇게하면 "클러스터에서 컨테이너 인스턴스를 찾을 수 없습니다."라는 정확한 문제가 해결되었습니다. 더 많이 투표 한 원래 답변은 실제 솔루션과 관련이 없습니다. 다시 감사합니다.
alexkb

게이트웨이를 VPC와 연결하는 것 외에도 ECS 인스턴스를 수용하는 특정 서브넷에 대해이를 통해 인터넷 트래픽을 라우팅해야 할 수 있습니다. -예를 들어 aws ec2 associate-route-table --subnet-id $SUBNET_ID --route-table-id $ROUTE_TABLE_ID-대답에 이것을 추가 할 것을 제안 할 수 있습니까?
Greg

IGW를 가리키는 0.0.0..0 / 0에 대한 경로를 추가하는 순간 서브넷은 더 이상 프라이빗 서브넷이 아니라는 점을 언급 할 가치가 있다고 생각합니다. 네트워크 보안 관점에서 NAT- 게이트웨이를 가리키는 경로를 만드는 것이 좋습니다.
Henrik Pingel 2019

18

Fargate를 사용할 때이 문제가 발생했습니다. 을 호출 할 때 명시 적으로 정의 launchType="FARGATE"했을 때 수정했습니다 run_task.


1
CLI를 추가하여--launch-type FARGATE
shlomiLan

11

기타 제안 된 검사

  1. 주어진 지역에 대해 지정된 제안 AMI를 선택하면 문제가 해결되었습니다.

    AMI를 찾으려면 Launching an Amazon ECS Container Instance를 확인하십시오 .

  2. 기본적으로 모든 ec2 인스턴스는 기본 클러스터에 추가됩니다. 따라서 클러스터의 이름도 중요합니다.

Amazon ECS 컨테이너 인스턴스 시작의 10 번 항목을 참조하십시오 .

이 스레드 에서 더 많은 정보를 얻을 수 있습니다 .


3

다른 사람이이 문제로 막힐 경우를 대비해서 ... 나는 여기에서 모든 것을 시도했지만 나를 위해 일하지 않았습니다.

여기에 언급 된 내용 외에도 EC2 인스턴스 역할과 관련하여 여기 에 설명 된대로 제 경우에는 간단한 정보로 EC2 인스턴스를 구성한 경우에만 작동했습니다. 사용자 데이터를 다음과 같은 초기 스크립트 사용 :

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

이 ecs 구성 파일에서 생성 된 관련 ECS 클러스터 이름을 알려주고 문제가 해결되었습니다. 이 구성이 없으면 EC2 인스턴스의 ECS 에이전트 로그에 ECS에 연결할 수없는 오류가 표시되어 ECS 클러스터에 EC2 인스턴스가 표시됩니다.

이렇게 한 후 EC2 클러스터에서 사용할 수있는 EC2 인스턴스를 얻을 수 있습니다. 여기에 이미지 설명 입력

AWS 설명서에는이 부분이 선택 사항이라고 나와 있지만 제 경우에는이 "선택 사항"구성 없이는 작동하지 않았습니다.


2

클러스터를 만든 후이 문제가 발생한 경우

EC2 인스턴스 목록에서 ECS 인스턴스로 이동하여 인스턴스에 할당 한 IAM 역할을 확인합니다. 인스턴스 이름이 다음으로 시작하는 인스턴스를 쉽게 식별 할 수 있습니다.ECS Instance

여기에 이미지 설명 입력

그 후 IAM 역할을 클릭하면 IAM 콘솔로 연결됩니다. 선택AmazonEC2ContainerServiceforEC2Role권한 정책 목록에서 정책을 역할을 저장합니다.

인스턴스는 저장 한 직후 클러스터에서 사용할 수 있습니다.


1

진짜 문제는 권한 부족입니다. AmazonEC2ContainerServiceforEC2Role 권한으로 IAM 역할을 생성하고 할당하면 문제가 사라집니다.


0

또 다른 가능한 원인은 ECS 클러스터 AMI를 "Amazon Linux AMI"대신 "Amazon Linux 2"AMI로 업데이트하는 것이 었는데, 이로 인해 EC2 user_data 시작 스크립트가 작동하지 않았습니다.


0

이 경우 다음 사항을 확인해야합니다.

  1. EC2 인스턴스에는 AmazonEC2ContainerServiceforEC2Role관리 형 정책이 연결된 역할이 있어야 합니다.
  2. EC2 인스턴스는 다음과 같은 AMI 이미지를 실행해야합니다. ecs-optimized (EC2 대시 보드에서 확인할 수 있음).
  3. VPC의 프라이빗 서브넷에 퍼블릭 IP가 할당되지 않았거나 인터페이스 VPC 엔드 포인트가 구성되지 않았거나 NAT 게이트웨이가 설정되지 않았습니다.

대부분의 경우이 문제는 잘못 구성된 VPC로 인해 나타납니다. 문서 에 따르면 :

QUOTE : 인터페이스 VPC 엔드 포인트가 구성되어 있지 않고 컨테이너 인스턴스에 퍼블릭 IP 주소가없는 경우 NAT (네트워크 주소 변환)를 사용하여이 액세스를 제공해야합니다.

  • VPC 엔드 포인트를 생성하려면 : 여기 에있는 설명서를 따르십시오.
  • NAT 게이트웨이를 생성하려면 : 여기 에있는 설명서를 따르십시오.

이것이 ECS 대시 보드에 나열된 EC2 인스턴스를 볼 수없는 이유입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.