ข้อผิดพลาด 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 เพื่อเริ่มต้น !!


ฉันรู้สึกว่าฉันเห็นสิ่งนี้เมื่อฉันดำเนินการอย่างรวดเร็วระหว่างขั้นตอนการสร้างคลัสเตอร์และการรันงาน
Ben Creasy

คำตอบ:


159

ฉันพบสิ่งนี้หลังจากการตรวจสอบอีกสองสามชั่วโมง Amazon หากคุณกำลังฟังอยู่คุณควรระบุข้อมูลนี้ไว้ที่ใดที่หนึ่งในคอนโซลการจัดการของคุณเมื่อสร้างคลัสเตอร์หรือเพิ่มอินสแตนซ์ในคลัสเตอร์:

"ก่อนที่คุณจะสามารถเพิ่มอินสแตนซ์ ECS ลงในคลัสเตอร์ได้คุณต้องไปที่ EC2 Management Console ก่อนและสร้างecs-optimizedอินสแตนซ์ที่มีบทบาท IAM ที่มีAmazonEC2ContainerServiceforEC2Roleนโยบายแนบมาด้วย"

นี่คือ rigmarole:

1. ไปที่EC2 Dashboardของคุณแล้วคลิกLaunch Instanceปุ่ม

2. ภายใต้Community AMIsค้นหาecs-optimizedและเลือกสิ่งที่เหมาะกับความต้องการของโครงการมากที่สุด จะทำงานใด ๆ คลิกถัดไป

3. เมื่อคุณได้รับการกำหนดค่ารายละเอียดตัวอย่างคลิกและสร้างบทบาทใหม่ที่เรียกว่าcreate new IAM role linkecsInstanceRole

4. แนบAmazonEC2ContainerServiceforEC2Roleนโยบายกับบทบาทนั้น

5. จากนั้นกำหนดค่าอินสแตนซ์ ECS ของคุณให้เสร็จสิ้น
หมายเหตุ:หากคุณกำลังสร้างเว็บเซิร์ฟเวอร์คุณจะต้องสร้าง securityGroup เพื่ออนุญาตให้เข้าถึงพอร์ต 80

หลังจากนั้นไม่กี่นาทีเมื่ออินสแตนซ์เริ่มต้นและทำงานคุณสามารถรีเฟรชแท็บอินสแตนซ์ ECS ที่คุณพยายามเพิ่มอินสแตนซ์ได้เช่นกัน


10
การเลือก ami ที่แนะนำซึ่งระบุไว้สำหรับภูมิภาคนั้นช่วยแก้ปัญหาของฉันได้ หากต้องการทราบ ami คุณควรเลือกตรวจสอบ url docs.aws.amazon.com/AmazonECS/latest/developerguide/…
sanath_p

1
ไม่เห็น AmazonEC2ContainerServiceforEC2Role มีการเปลี่ยนแปลงตั้งแต่โพสต์ล่าสุดของคุณหรือไม่
BlueDolphin

1
@BlueDolphin ฉันสามารถค้นหานโยบายนั้นได้เมื่อฉันสร้างบทบาทใหม่ใน IAM
cyrf

6
เป็นที่น่าสังเกตว่าตอนนี้ (เมษายน 2018) หากคุณใช้ Beta 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 คือชื่อของอินเทอร์เน็ตเกตเวย์ที่คุณสร้างขึ้นใหม่


มีการกล่าวถึงที่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

ฉันคิดว่ามันคุ้มค่าที่จะกล่าวถึงช่วงเวลาที่คุณเพิ่มเส้นทางสำหรับ 0.0.0..0 / 0 ที่ชี้ไปที่ IGW ซับเน็ตจะไม่ใช่ซับเน็ตส่วนตัวอีกต่อไป จากมุมมองด้านความปลอดภัยของเครือข่ายการสร้างเส้นทางที่ชี้ไปยัง NAT-Gateway จะดีกว่า
Henrik Pingel


11

การตรวจสอบที่แนะนำอื่น ๆ

  1. การเลือก AMI ที่แนะนำซึ่งระบุไว้สำหรับภูมิภาคนั้นช่วยแก้ปัญหาของฉันได้

    เพื่อหา AMI - ตรวจสอบการเปิดตัว Amazon ECS คอนเทนเนอร์อินสแตนซ์

  2. โดยค่าเริ่มต้นอินสแตนซ์ ec2 ทั้งหมดจะถูกเพิ่มลงในคลัสเตอร์เริ่มต้น ดังนั้นชื่อของคลัสเตอร์ก็มีความสำคัญเช่นกัน

เห็นจุด 10 ที่เปิดตัว Amazon ECS คอนเทนเนอร์อินสแตนซ์

มีข้อมูลเพิ่มเติมในชุดข้อความนี้


3

ในกรณีที่มีคนอื่นถูกบล็อกด้วยปัญหานี้เหมือนฉัน ... ฉันได้ลองทุกอย่างแล้วที่นี่และไม่ได้ผลสำหรับฉัน

นอกเหนือจากสิ่งที่กล่าวไว้ในที่นี้เกี่ยวกับบทบาทอินสแตนซ์ EC2 ตามที่แสดงความคิดเห็นที่นี่ในกรณีของฉันใช้งานได้ก็ต่อเมื่อฉันยังคงกำหนดค่าอินสแตนซ์ EC2 ด้วยข้อมูลง่ายๆ การใช้ข้อมูลผู้ใช้สคริปต์เริ่มต้นเช่นนี้:

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

การแจ้งชื่อคลัสเตอร์ ECS ที่เกี่ยวข้องซึ่งสร้างขึ้นที่ไฟล์กำหนดค่า ecs นี้ช่วยแก้ปัญหาของฉันได้ หากไม่มีการกำหนดค่านี้ ECS Agent Log ที่อินสแตนซ์ EC2 แสดงข้อผิดพลาดที่ไม่สามารถเชื่อมต่อกับ ECS ได้การทำเช่นนี้ฉันได้รับอินสแตนซ์ EC2 ที่คลัสเตอร์ ECS มองเห็นได้

หลังจากทำสิ่งนี้แล้วฉันจะได้รับอินสแตนซ์ EC2 สำหรับคลัสเตอร์ EC2 ของฉัน: ใส่คำอธิบายภาพที่นี่

เอกสาร AWS กล่าวว่าส่วนนี้เป็นทางเลือก แต่ในกรณีของฉันมันใช้ไม่ได้หากไม่มีการกำหนดค่า "ทางเลือก" นี้


2

หากคุณพบปัญหานี้หลังจากสร้างคลัสเตอร์

ไปที่อินสแตนซ์ ECS ในรายการอินสแตนซ์ EC2 และตรวจสอบบทบาท IAM ที่คุณกำหนดให้กับอินสแตนซ์ คุณสามารถระบุอินสแตนซ์ได้อย่างง่ายดายด้วยชื่ออินสแตนซ์ที่ขึ้นต้นด้วยECS Instance

ใส่คำอธิบายภาพที่นี่

หลังจากนั้นคลิกที่บทบาท IAM และจะนำคุณไปยังคอนโซล IAM เลือกAmazonEC2ContainerServiceforEC2Roleนโยบายจากรายการนโยบายการอนุญาตและบันทึกบทบาท

อินสแตนซ์ของคุณจะพร้อมใช้งานในคลัสเตอร์ไม่นานหลังจากที่คุณบันทึก


1

ปัญหาที่แท้จริงคือการไม่ได้รับอนุญาต ตราบใดที่คุณสร้างและกำหนด IAM Role ด้วยสิทธิ์ AmazonEC2ContainerServiceforEC2Role ปัญหาจะหมดไป


0

สาเหตุที่เป็นไปได้อีกประการหนึ่งที่ฉันพบคือการอัปเดตคลัสเตอร์ ECS AMI ของฉันเป็น AMI "Amazon Linux 2" แทน "Amazon Linux AMI" ซึ่งทำให้สคริปต์เรียกใช้ EC2 user_data ของฉันไม่ทำงาน


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. รีเฟรชอินสแตนซ์ของฉันภายใต้แท็บรีเฟรชอินสแตนซ์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.