Simple CI / CD container ใน AWS


14

ฉันกำลังใช้ AWS Code Pipeline, Code Build เพื่อสร้างคอนเทนเนอร์ Docker ใหม่และผลักดันมันไปยัง ECR

แอปพลิเคชันของฉันเป็นแบบเรียบง่ายแบบ Single-Forward สิ่งที่จะลดความเสียดทานให้น้อยลงเพื่อดึง Container ที่ใช้อยู่ในปัจจุบันออกมาและเรียกใช้ Container ใหม่จากรีจีสทรี ECS (เอาท์พุตของ Code Build ผ่าน Code Pipeline)

ฉันลอง CloudFormation ด้วยข้อมูลผู้ใช้ EC2, สคริปต์ที่กำหนดเองในด้านหนึ่งและ CloudFormation กับ ECS พร้อมคำจำกัดความของงานในอีกด้านหนึ่ง (ยังไม่สำเร็จ) ฉันรู้สึกว่าจะต้องมีวิธีที่ชัดเจนและเรียบง่ายกว่า

คำตอบ:


16

ฉันจะเก็บอินสแตนซ์คอนเทนเนอร์ ECS (ฉันกำลังพูดถึงโฮสต์ Docker - ฉันไม่ชอบคำศัพท์ AWS ที่นี่) และการปรับใช้เป็นสองสิ่งแยกกัน

รับ ECS ของคุณขึ้นและทำงาน คุณสามารถจัดการผ่าน CloudFormation และกลุ่มปรับขนาดอัตโนมัติได้ เพียงแค่คิดว่าคลัสเตอร์ของคุณเป็นแพลตฟอร์มที่คุณจะปรับใช้การไม่ได้สิ่งที่คุณต้องโยกย้ายกำลังคน

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

ทุกครั้งที่เริ่มงาน ECS จะเรียกใช้ภาพดึงนักเทียบท่า: แท็กแม้ว่าจะมีภาพอยู่ในเครื่องเพื่อให้แน่ใจว่ามีแท็กภาพเวอร์ชันล่าสุด: ดังนั้นแท็กรูปภาพที่คุณใช้ไม่สำคัญเลย (ไม่จำเป็นต้องเปลี่ยนแท็กในทุกบิลด์)

นั่นหมายความว่าคุณสามารถสร้าง myimage: ล่าสุดซ้ำแล้วซ้ำอีกเพื่อปรับใช้อย่างง่ายดาย

สิ่งที่คุณต้องการคือข้อกำหนดของงานที่ image = myimage: ล่าสุด สร้างบริการด้วยคำจำกัดความของงานนั้นและทุกครั้งที่ ECS เริ่มงาน (ตัวอย่างของบริการของคุณ) มันจะเป็น "myimage: ล่าสุด" ล่าสุดที่คุณสร้าง

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

ตัวอย่าง:

สมมติว่าคุณได้สร้างบริการที่เรียกว่า MyService ที่คุณได้กำหนดค่าบริการนั้นให้ทำงาน 2 งานสำหรับข้อกำหนดงาน MyTaskDefinition: 1 (รุ่นที่ 1) ในการกำหนดภารกิจนั้นคุณมีคำจำกัดความคอนเทนเนอร์หนึ่งอันซึ่งรูปภาพถูกตั้งค่าเป็น "myimage: latest"

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

หมายเหตุ: คุณไม่จำเป็นต้องสร้างคำนิยามงานใหม่ หากคุณต้องการคุณสามารถดึงรายการงานของบริการและหยุดพวกเขาทีละคน คุณควรรอให้ ECS รีสตาร์ทงานก่อนที่จะหยุดงานใหม่ (นั่นคือ: หยุดคอนเทนเนอร์แรกรอให้ ECS แทนที่มันหยุดคอนเทนเนอร์ที่สอง) เมื่อ ECS รีสตาร์ทคอนเทนเนอร์มันจะคว้า myimage ล่าสุด: บิวด์ล่าสุดตามที่อธิบายไว้ก่อนหน้านี้ ฉันแค่คิดว่าการสร้างคำนิยามงานใหม่นั้นง่ายขึ้นและเกิดข้อผิดพลาดน้อยลง (ไม่ต้องใช้ตรรกะในการรอและตรวจสอบ ECS จะจัดการกับการอัปเดตที่กำลังดำเนินการสำหรับคุณหากคุณมีคำนิยามภารกิจใหม่)


น่าทึ่ง - ฉันจะเรียกคำตอบของคุณว่าเป็นคู่มือที่ขาดหายไปสำหรับ CI / CD สำหรับนักเทียบท่า ขอขอบคุณ.
Naveen Vijay

3

สำหรับกรณีการใช้งานที่เรียบง่ายฉันขอแนะนำให้ตรวจสอบ Elastic Beanstalk สำหรับ Docker ไม่ใช่โซลูชันขั้นต่ำเช่นการใช้งาน ECS เปล่า แต่คุณสามารถได้รับประโยชน์จากบริการที่จัดการและกำหนดค่าอัตโนมัติเช่น ELB, EC2 AutoScale, การตรวจสอบสุขภาพและอีกมากมาย

สรุประดับสูง:

  1. กำหนดค่า Elastic Beanstalk เพื่อใช้แท็ก myimage ของแท็กเฉพาะ: ทดสอบแล้ว
  2. ใช้ Code Pipeline / Build เพื่อสร้างทดสอบและโปรโมตแท็ก "ทดสอบ"
  3. การปรับใช้ Trigger Elastic Beanstalk ซึ่งจะดึงภาพที่ได้รับการเลื่อนระดับ myimage: ทดสอบกับทุกกรณีกลยุทธ์การปรับใช้ที่แตกต่างกัน

วิธีการนี้จะขึ้นอยู่กับการใช้แท็กเดียวกันอีกครั้งแนวทางที่เป็นทางเลือกคือการสร้างแท็กด้วยบิลด์ไอดีเช่น myimage: ทดสอบ -42 สิ่งนี้จะต้องมีการอัพเดต Elastic Beanstalk ในแต่ละครั้งด้วยแท็กใหม่ แต่ให้การควบคุม


0

ฉันสองฝักถั่วยืดหยุ่นสำหรับความเรียบง่าย มันง่ายมากที่จะติดตั้งและปรับใช้

หากคุณคุ้นเคยกับนักเทียบท่าการเขียนอีกวิธีหนึ่งคือการกำหนดนักเทียบท่า-compose.yml และปรับใช้โดยตรงบน ECS ด้วย ecs-cli

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