ฉันจะเก็บอินสแตนซ์คอนเทนเนอร์ ECS (ฉันกำลังพูดถึงโฮสต์ Docker - ฉันไม่ชอบคำศัพท์ AWS ที่นี่) และการปรับใช้เป็นสองสิ่งแยกกัน
รับ ECS ของคุณขึ้นและทำงาน คุณสามารถจัดการผ่าน CloudFormation และกลุ่มปรับขนาดอัตโนมัติได้ เพียงแค่คิดว่าคลัสเตอร์ของคุณเป็นแพลตฟอร์มที่คุณจะปรับใช้การไม่ได้สิ่งที่คุณต้องโยกย้ายกำลังคน
จากนั้นสำหรับซีดีวิธีที่ง่ายที่สุดคือการปรับปรุงคำจำกัดความบริการเพื่อใช้คำนิยามงานใหม่และให้ ECS กลิ้งเพื่ออัปเดตคอนเทนเนอร์สำหรับคุณ
ทุกครั้งที่เริ่มงาน ECS จะเรียกใช้ภาพดึงนักเทียบท่า: แท็กแม้ว่าจะมีภาพอยู่ในเครื่องเพื่อให้แน่ใจว่ามีแท็กภาพเวอร์ชันล่าสุด: ดังนั้นแท็กรูปภาพที่คุณใช้ไม่สำคัญเลย (ไม่จำเป็นต้องเปลี่ยนแท็กในทุกบิลด์)
นั่นหมายความว่าคุณสามารถสร้าง myimage: ล่าสุดซ้ำแล้วซ้ำอีกเพื่อปรับใช้อย่างง่ายดาย
สิ่งที่คุณต้องการคือข้อกำหนดของงานที่ image = myimage: ล่าสุด สร้างบริการด้วยคำจำกัดความของงานนั้นและทุกครั้งที่ ECS เริ่มงาน (ตัวอย่างของบริการของคุณ) มันจะเป็น "myimage: ล่าสุด" ล่าสุดที่คุณสร้าง
จากที่นั่นคุณหายไปเพียงชิ้นเดียวในจิ๊กซอว์จาก CodeDeploy คุณสามารถเรียกบางสิ่งบางอย่างอาจเป็นฟังก์ชั่นแลมบ์ดาเพื่อสร้างการแก้ไขข้อกำหนดงานของคุณใหม่และอัปเดตบริการของคุณและ ECS จะสร้างงานใหม่โดยอัตโนมัติ ลบงานเก่า
ตัวอย่าง:
สมมติว่าคุณได้สร้างบริการที่เรียกว่า MyService ที่คุณได้กำหนดค่าบริการนั้นให้ทำงาน 2 งานสำหรับข้อกำหนดงาน MyTaskDefinition: 1 (รุ่นที่ 1) ในการกำหนดภารกิจนั้นคุณมีคำจำกัดความคอนเทนเนอร์หนึ่งอันซึ่งรูปภาพถูกตั้งค่าเป็น "myimage: latest"
- เมื่อวานคุณสร้าง myimage: ล่าสุดซึ่งมี ID (SHA) 365d8f7bf565
- อินสแตนซ์คอนเทนเนอร์ ABC ของคุณกำลังเรียกใช้งานชื่อ MyTaskDefinition- 1 -containerName-someLongId เมื่อคุณตรวจสอบคอนเทนเนอร์นั้นมันกำลังเรียกใช้รูปภาพ "sha256: 365d8f7bf565 .......... "
- ตัวอย่างคอนเทนเนอร์อื่นของคุณ DEF กำลังทำงานอื่นอยู่ มันมีชื่อที่คล้ายกัน (เฉพาะ ID ที่แตกต่างกัน) แต่มันใช้ภาพเดียวกัน
- คุณผลักดันการเปลี่ยนแปลงไปยัง repo ของคุณ
- CodePipeline เลือกการเปลี่ยนแปลงนั้นสร้างและเผยแพร่ภาพไปยัง ECR
- อิมเมจ Docker ใหม่นั้นเป็นภาพของฉันด้วย: ล่าสุด แต่ ID (SHA) ของมันคือ f7ec5e54ac96
- ตอนนี้คุณต้องเพิ่มขั้นตอนในขั้นตอนการทำงานของคุณเพื่อใช้ฟังก์ชั่นแลมบ์ดาและ AWS NodeJS SDK เพื่อโทรเข้าคลัสเตอร์ของคุณ:
- สร้างคำนิยามภารกิจใหม่ (ซึ่งจะเหมือนกันทุกประการ) นั่นจะเป็น MyTaskDefinition: 2
- อัปเดต MyService ของคุณเพื่อใช้ MyTaskDefinition: 2 (แทน 1)
- ECS จะสร้างงานใหม่ ชื่อคอนเทนเนอร์จะ MyTaskDefinition- 2 -containerName-someLongId เมื่อคุณตรวจสอบคอนเทนเนอร์เหล่านั้นคุณจะเห็นว่าพวกเขาจะใช้งาน "sha256: f7ec5e54ac96 ....... " บางทีคุณอาจมีงาน 2 อย่างบนอินสแตนซ์คอนเทนเนอร์ ABC บางทีอาจถูกพ่นออกมา (ขึ้นอยู่กับการกำหนดค่าของบริการของคุณ)
- หลังจากเวลา ECS จะลบงานเก่า MyTaskDefinition-1-containerName-someLongId จาก ABC และ DEF
หมายเหตุ: คุณไม่จำเป็นต้องสร้างคำนิยามงานใหม่ หากคุณต้องการคุณสามารถดึงรายการงานของบริการและหยุดพวกเขาทีละคน คุณควรรอให้ ECS รีสตาร์ทงานก่อนที่จะหยุดงานใหม่ (นั่นคือ: หยุดคอนเทนเนอร์แรกรอให้ ECS แทนที่มันหยุดคอนเทนเนอร์ที่สอง) เมื่อ ECS รีสตาร์ทคอนเทนเนอร์มันจะคว้า myimage ล่าสุด: บิวด์ล่าสุดตามที่อธิบายไว้ก่อนหน้านี้ ฉันแค่คิดว่าการสร้างคำนิยามงานใหม่นั้นง่ายขึ้นและเกิดข้อผิดพลาดน้อยลง (ไม่ต้องใช้ตรรกะในการรอและตรวจสอบ ECS จะจัดการกับการอัปเดตที่กำลังดำเนินการสำหรับคุณหากคุณมีคำนิยามภารกิจใหม่)