Kesalahan AWS ECS saat menjalankan tugas: Tidak ada Instans Kontainer yang ditemukan di klaster Anda

115

Saya mencoba menerapkan dockergambar kontainer untuk AWSdigunakan ECS, tetapi contoh EC2 tidak sedang dibuat. Saya telah menjelajahi internet untuk mencari penjelasan mengapa saya menerima kesalahan berikut:

"Kesalahan klien (InvalidParameterException) terjadi saat memanggil operasi RunTask: Tidak ada Contoh Penampung yang ditemukan di kluster Anda."

Inilah langkah saya:

1. Mendorong image buruh pelabuhan DARI Ubuntu ke repo Amazon ECS saya.

2. Mendaftarkan Definisi Tugas ECS:

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

3. Jalankan tugas:

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

Namun, gagal.

Inilah tugas saya:

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

Saya juga mencoba menggunakan konsol manajemen untuk mengonfigurasi cluster dan layanan, namun saya mendapatkan kesalahan yang sama. Bagaimana cara mengonfigurasi cluster agar memiliki instance ec2, dan jenis instance container apa yang perlu saya gunakan? Saya pikir seluruh proses ini adalah untuk membuat instans EC2 !!

cosbor11
sumber
Saya merasa seperti saya melihat ini ketika saya bergerak cepat di antara langkah-langkah membuat cluster dan menjalankan tugas.
Ben Creasy

Jawaban:

158

Saya menemukan ini setelah beberapa jam menyelidiki. Amazon, jika Anda mendengarkan, Anda harus menyatakan ini di suatu tempat di konsol manajemen Anda saat membuat klaster atau menambahkan instans ke klaster:

"Sebelum Anda dapat menambahkan instans ECS ke kluster, Anda harus terlebih dahulu membuka EC2 Management Console dan membuat ecs-optimizedinstans dengan peran IAM yang AmazonEC2ContainerServiceforEC2Rolekebijakannya dilampirkan"

Inilah rigmarole:

1. Buka Dasbor EC2 Anda , dan klik Launch Instancetombol.

2. Di bawah Community AMIs, Cari ecs-optimized, dan pilih salah satu yang paling sesuai dengan kebutuhan proyek Anda. Apapun akan berhasil. Klik berikutnya.

3. Saat Anda masuk ke Configure Instance Details, klik create new IAM role linkdan buat peran baru bernama ecsInstanceRole.

4. Lampirkan AmazonEC2ContainerServiceforEC2Rolekebijakan untuk peran itu.

5. Kemudian, selesaikan konfigurasi Instans ECS Anda.
CATATAN: Jika Anda membuat server web, Anda akan ingin membuat securityGroup untuk mengizinkan akses ke port 80.

Setelah beberapa menit, ketika instans diinisialisasi dan berjalan, Anda dapat menyegarkan tab Instans ECS yang Anda coba tambahkan juga.

cosbor11
sumber
10
Memilih ami yang disarankan yang ditentukan untuk wilayah tertentu memecahkan masalah saya. Untuk mengetahui ami Anda harus memilih periksa url ini docs.aws.amazon.com/AmazonECS/latest/developerguide/…
sanath_p
1
tidak melihat AmazonEC2ContainerServiceforEC2Role, apakah ada perubahan sejak posting terakhir Anda?
BlueDolphin
1
@BlueDolphin Saya dapat menemukan kebijakan tersebut saat membuat Peran baru di IAM.
cyrf
6
Perlu dicatat sekarang (April 2018) jika Anda menggunakan Beta Fargate saat ini ( aws.amazon.com/fargate ) untuk menghindari semua jenis kerumitan ini, Anda mungkin menyukai saya baru saja memilih EC2sebagai jenis peluncuran ketika Anda mendapatkan kesalahan ini ...
kemunduran
10
Dan, saat membuat EC2, jangan lupa untuk menambahkan #!/bin/bash echo ECS_CLUSTER=your_cluster_name >> /etc/ecs/ecs.configdi Advanced Details -> User datajika Anda memiliki sendiri, non klaster default Anda. Jika tidak, instans EC2 yang baru dibuat akan membuat cluster Default.
Jakub Czaplicki
40

Saat ini, antarmuka web Amazon AWS dapat secara otomatis membuat instans dengan AMI yang benar dan nama yang benar sehingga akan terdaftar ke klaster yang benar.

Meskipun semua instans dibuat oleh Amazon dengan pengaturan yang benar, instans saya tidak akan terdaftar. Di forum Amazon AWS saya menemukan petunjuk. Ternyata cluster Anda memerlukan akses internet dan jika VPC pribadi Anda tidak memiliki gateway internet, cluster tidak akan dapat terhubung.

Cara mengatasinya

Di dasbor VPC, Anda harus membuat Gateway Internet baru dan menghubungkannya ke VPC yang digunakan oleh cluster. Setelah terpasang, Anda harus memperbarui (atau membuat) tabel rute untuk VPC dan menambahkan sebagai baris terakhir

0.0.0.0/0 igw-24b16740  

Di mana igw-24b16740 adalah nama gateway internet yang baru Anda buat.

P_W999
sumber
Ini disebutkan di docs.aws.amazon.com/AWSEC2/latest/UserGuide/… [EC2-VPC] Periksa tabel rute untuk subnet. Anda memerlukan rute yang mengirimkan semua lalu lintas yang ditujukan di luar VPC ke gateway Internet untuk VPC.
Justin M. Keyes
2
Terima kasih atas petunjuknya! Saya telah menetapkan grup keamanan ke instance saya yang memblokir semua lalu lintas keluar kecuali untuk lalu lintas ke penyeimbang beban saya. Saya mengalihkan ini untuk mengizinkan semua lalu lintas keluar tetapi membatasi lalu lintas masuk hanya dari penyeimbang beban, dan instans kemudian muncul di klaster EC2 saya.
Mikepote
1
Saya berharap saya dapat memberikan suara untuk jawaban Anda lebih dari sekali. Ini memperbaiki masalah saya secara tepat, "Tidak ada Contoh Penampung yang ditemukan di cluster Anda". dan jawaban awal memilih lebih tidak ada hubungannya dengan solusi Anda yang sebenarnya. Terima kasih lagi.
alexkb
Selain mengaitkan gateway dengan VPC, Anda mungkin perlu merutekan lalu lintas internet melaluinya untuk subnet tertentu yang menaungi instance ECS Anda. - misalnya aws ec2 associate-route-table --subnet-id $SUBNET_ID --route-table-id $ROUTE_TABLE_ID- dapatkah saya menyarankan menambahkan ini ke jawaban?
Greg
Saya pikir perlu disebutkan bahwa saat Anda menambahkan rute untuk 0.0.0..0 / 0 yang menunjuk ke IGW subnet tidak lagi menjadi subnet pribadi. Dari perspektif keamanan jaringan, lebih baik membuat rute yang mengarah ke NAT-Gateway.
Henrik Pingel
18

Saya mengalami masalah ini saat menggunakan Fargate. Saya memperbaikinya ketika saya secara eksplisit menentukan launchType="FARGATE"saat menelepon run_task.

Milan Cermak
sumber
1
Dengan CLI yang saya tambahkan--launch-type FARGATE
shlomiLan
11

Pemeriksaan lain yang disarankan

  1. Memilih AMI yang disarankan yang ditentukan untuk wilayah tertentu memecahkan masalah saya.

    Untuk mengetahui AMI - periksa Meluncurkan Instans Kontainer Amazon ECS .

  2. Secara default, semua instance ec2 ditambahkan ke cluster default. Jadi nama cluster juga penting.

Lihat poin 10 di Meluncurkan Instans Kontainer Amazon ECS .

Informasi lebih lanjut tersedia di utas ini .

sanath_p
sumber
3

Kalau-kalau ada orang lain yang diblokir dengan masalah ini seperti saya ... Saya sudah mencoba semuanya di sini dan tidak berhasil untuk saya.

Selain apa yang dikatakan di sini mengenai Peran Instans EC2, seperti yang dikomentari di sini , dalam kasus saya hanya berfungsi jika saya masih mengonfigurasi Instans EC2 dengan informasi sederhana. Menggunakan Data Pengguna skrip awal seperti ini:

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

Menginformasikan Nama Cluster ECS terkait yang dibuat di file konfigurasi ecs ini, menyelesaikan masalah saya. Tanpa konfigurasi ini, Log Agen ECS di Instans EC2 menunjukkan kesalahan yang tidak memungkinkan untuk terhubung ke ECS, melakukan ini, saya membuat Instans EC2 terlihat oleh Klaster ECS.

Setelah melakukan ini, saya bisa mendapatkan Instans EC2 yang tersedia untuk Klaster EC2 saya: masukkan deskripsi gambar di sini

Dokumentasi AWS mengatakan bahwa bagian ini opsional, tetapi dalam kasus saya, bagian ini tidak berfungsi tanpa konfigurasi "opsional" ini.

Ualter Jr.
sumber
2

Jika Anda menemukan masalah ini setelah membuat cluster

Buka instans ECS di daftar instans EC2 dan periksa peran IAM yang telah Anda tetapkan ke instans tersebut. Anda dapat mengidentifikasi instance dengan mudah dengan nama instance yang dimulai denganECS Instance

masukkan deskripsi gambar di sini

Setelah itu klik pada peran IAM dan itu akan mengarahkan Anda ke konsol IAM. Pilih AmazonEC2ContainerServiceforEC2Rolekebijakan dari daftar kebijakan izin dan simpan peran tersebut.

Instance Anda akan tersedia di cluster segera setelah Anda menyimpannya.

sandaru.ny
sumber
1

Masalah sebenarnya adalah kurangnya izin. Selama Anda membuat dan menetapkan Peran IAM dengan izin AmazonEC2ContainerServiceforEC2Role, masalahnya akan hilang.

Ben
sumber
0

Kemungkinan penyebab lain yang saya hadapi adalah memperbarui AMI klaster ECS saya menjadi AMI "Amazon Linux 2" alih-alih "AMI Amazon Linux", yang menyebabkan skrip peluncuran data_ pengguna EC2 saya tidak berfungsi.

skeller88
sumber
0

Jika ini terjadi, Anda perlu memperhatikan yang berikut:

  1. Instans EC2 Anda harus memiliki peran dengan AmazonEC2ContainerServiceforEC2Rolekebijakan terkelola yang melekat padanya
  2. Instans EC2 Anda harus menjalankan gambar AMI ecs-optimized(Anda dapat memeriksanya di dasbor EC2)
  3. Subnet pribadi VPC Anda tidak memiliki IP publik yang ditetapkan, ATAU Anda tidak memiliki titik akhir antarmuka VPC yang dikonfigurasi, ATAU Anda tidak memiliki gateway NAT yang disiapkan

Sering kali, masalah ini muncul karena VPC yang salah dikonfigurasi. Menurut Dokumentasi :

KUTIPAN: Jika Anda tidak memiliki titik akhir VPC antarmuka yang dikonfigurasi dan instance penampung Anda tidak memiliki alamat IP publik, mereka harus menggunakan terjemahan alamat jaringan (NAT) untuk memberikan akses ini.

  • Untuk membuat titik akhir VPC: Ikuti dokumentasinya di sini
  • Untuk membuat gateway NAT: Ikuti dokumentasi di sini

Ini adalah alasan mengapa Anda tidak melihat instans EC2 terdaftar di dasbor ECS.

Ashot
sumber