Zatrzymałbym instancje kontenera ECS (mówię o hostach Docker - nie lubię tutaj terminologii AWS) i wdrożenie jako dwie osobne rzeczy.
Uruchom swój stos ECS. Możesz nim zarządzać za pomocą CloudFormation i grup Auto-Scaling, w porządku. Wystarczy pomyśleć o klastrze jako platforma, gdzie można wdrożyć do , a nie coś trzeba przesunięcie .
Następnie, w przypadku płyt CD, najłatwiejszą jak dotąd metodą jest aktualizacja definicji usługi w celu użycia nowej definicji zadania i umożliwienie ECS rolling aktualizacji kontenerów za Ciebie.
Za każdym razem, gdy uruchamia zadanie, ECS uruchamia okno dokujące pull image: tag, nawet jeśli ma obraz lokalnie, aby upewnić się, że ma najnowszą wersję tego image: tag. Tak więc znacznik graficzny, którego używasz, naprawdę nie ma znaczenia (nie trzeba zmieniać znacznika w każdej kompilacji).
Oznacza to, że możesz zbudować mójimage: najnowszy w kółko, aby łatwo go wdrożyć.
Potrzebujesz definicji zadania, w której obraz = mój obraz: najnowszy. Utwórz usługę z tą definicją zadania i za każdym razem, gdy ECS uruchomi zadanie (instancję twojej usługi), będzie to najnowsza wersja „myimage: latest”, którą zbudowałeś.
Stamtąd brakuje tylko jednego elementu układanki, z CodeDeploy możesz wywołać coś, być może funkcję lambda, aby utworzyć nową wersję definicji zadania i zaktualizować usługę, a ECS automatycznie utworzy nowe zadania dla tej zmiany i usuń stare zadania.
Przykład:
Załóżmy, że utworzyłeś usługę o nazwie MyService. Czy usługa została skonfigurowana do uruchamiania 2 zadań dla definicji zadania MyTaskDefinition: 1 (wersja 1). W tej definicji zadania masz jedną definicję kontenera, dla której obraz jest ustawiony na „myimage: latest”.
- Wczoraj zbudowałeś myimage: najnowszy, który miał identyfikator (SHA) 365d8f7bf565.
- Wystąpienie kontenera ABC uruchamia zadanie o nazwie MyTaskDefinition- 1 -containerName-someLongId. podczas sprawdzania tego kontenera jest wyświetlany obraz „sha256: 365d8f7bf565 ..........”
- Twoja inna instancja kontenera DEF uruchamia inne zadanie. Ma podobną nazwę (różni się tylko ID), ale działa z tym samym obrazem.
- Wprowadzasz zmianę w swoim repozytorium.
- CodePipeline przejmuje tę zmianę, buduje i publikuje obraz w ECR.
- Ten nowy obraz Dockera to także myimage: najnowszy, ale jego identyfikator (SHA) to f7ec5e54ac96
- Teraz musisz dodać krok do swojego potoku, aby użyć funkcji Lambda i zestawu AWS NodeJS SDK do wykonania niektórych wywołań do klastra:
- Utwórz nową definicję zadania (która będzie dokładnie taka sama jak poprzednio). To będzie MyTaskDefinition: 2
- Zaktualizuj swoją usługę MyService, aby korzystała z MyTaskDefinition: 2 (zamiast 1)
- ECS utworzy nowe zadania. Nazwy kontenerów będą MyTaskDefinition- 2 -containerName-someLongId. Gdy sprawdzisz te kontenery, zobaczysz, że będą działały „sha256: f7ec5e54ac96 .......”. Być może będziesz mieć 2 zadania na instancji kontenera ABC, być może zostaną one rozpylone (zależy to od konfiguracji usługi)
- Po pewnym czasie ECS usunie stare zadanie MyTaskDefinition-1-containerName-someLongId z ABC i DEF.
Uwaga: tak naprawdę nie musisz tworzyć nowej definicji zadania. Jeśli chcesz, możesz zamiast tego pobrać listę zadań usługi i ręcznie zatrzymać je jeden po drugim. Powinieneś poczekać, aż ECS zrestartuje zadanie przed zatrzymaniem nowego (to znaczy: zatrzymaj pierwszy kontener, poczekaj, aż ECS go zastąpi, zatrzymaj drugi kontener). Kiedy ECS ponownie uruchomi kontener, pobierze najnowszą wersję mojego obrazu: najnowszą wbudowaną, jak wyjaśniono wcześniej. Myślę, że utworzenie nowej definicji zadania jest łatwiejsze i mniej podatne na błędy (nie trzeba logiki czekać i sprawdzać, ECS zajmie się aktualizacją kroczącą, jeśli masz nową definicję zadania).