Я б зберігав екземпляри контейнерів ECS (я говорю про хостів Docker - тут мені не подобається терміналогія AWS) та розгортання як дві окремі речі.
Поставте свій стек ECS і працюйте. Ви можете керувати нею через групи CloudFormation та автоматичного масштабування, це добре. Просто подумайте про кластер в якості платформи , де буде розгорнуто на , а не те , що вам потрібно повторне розгортання .
Тоді для компакт-дисків найпростішим методом на сьогодні є оновлення визначення служби для використання нового визначення завдання та дозволити прослуховуванню ECS оновити контейнери для вас.
Кожен раз, коли він починає завдання, ECS запускатиме докерне зображення: тег, навіть якщо у нього є місцеве зображення, щоб переконатися, що в ньому є остання версія цього зображення: тег. Тому тег зображення, який ви використовуєте, насправді не має значення (не потрібно змінювати тег у кожній збірці).
Це означає, що ви можете створювати мімідж: останній раз і знову, щоб легко розгорнути його.
Вам потрібно визначити завдання, де зображення = myimage: найновіше. Створіть сервіс із цим визначенням завдання, і кожного разу, коли ECS запустить завдання (екземпляр вашої служби), це буде найсвіжіший "myimage: latest", який ви створили.
Звідси у головоломки вам не вистачає лише однієї частини, з CodeDeploy ви можете зателефонувати щось, можливо, лямбда-функція, щоб створити нову редакцію свого завдання та оновити службу. ECS автоматично створить нові завдання для цієї версії та видаліть старі завдання.
Приклад:
Припустимо, ви створили сервіс під назвою MyService. Що ви налаштували цю службу для виконання двох завдань для визначення завдання MyTaskDefinition: 1 (версія 1). У цьому визначенні завдання у вас є одне визначення контейнера, для якого зображення встановлено "myimage: latest".
- Вчора ви створили myimage: останній, який мав ідентифікатор (SHA) 365d8f7bf565.
- Ваш контейнер-екземпляр ABC виконує завдання з назвою MyTaskDefinition- 1 -containerName-someLongId. коли ви оглядаєте цей контейнер, він виконує зображення "sha256: 365d8f7bf565 .........."
- Ваш інший екземпляр контейнера DEF виконує ще одне завдання. Він має схожу назву (відрізняються лише ідентифікатори), але він має те саме зображення.
- Ви натискаєте зміну на репо.
- CodePipeline підбирає цю зміну, створює та публікує зображення в ECR.
- Цей новий образ Докера також мімідж: останній, але його ідентифікатор (SHA) - f7ec5e54ac96
- Тепер вам потрібно додати крок до свого конвеєра, щоб використовувати функції Lambda та 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 перезапустить контейнер, він захопить найсвіжіший мімідж: останній побудований, як було пояснено раніше. Я просто думаю, що створити нове визначення завдання простіше і менш схильним до помилок (не потрібно логіки чекати і перевіряти, ECS буде обробляти постійне оновлення для вас, якщо у вас є нове визначення завдання).