2015-07-17 8 views
16

Chcę zautomatyzować wdrażanie mojej aplikacji poprzez uruchomienie usługi ECS z najnowszym obrazem Docker. Z tego, co przeczytałem, sposób wdrożenia nowej wersji obrazu jest następujący:Usługa ECS - Automatyzacja wdrażania za pomocą nowego obrazu Docker

  1. Utwórz nową wersję zadania (po zaktualizowaniu obrazu w repozytorium Docker).
  2. Zaktualizuj usługę i podaj nową wersję.

To wydaje się działać, ale chcę to zrobić poprzez CLI, więc mogę go napisać. # 2 wydaje się dość łatwy do zrobienia dzięki AWS CLI z update-service, ale nie widzę sposobu, aby zrobić # 1 bez określenia całego JSON zadania od nowa tak jak z register-task-definition (mój JSON będzie zawierał poświadczenia w zmiennych środowiskowych, więc chcesz mieć to w jak najmniejszej liczbie miejsc).

Czy w ten sposób powinienem automatyzować wdrażanie moich aktualizacji usług ECS? A jeśli tak, czy istnieje "dobry" sposób, aby Definicja Zadań uruchomiła nową wersję (tj. Bez duplikowania wszystkiego)?

+2

Podejście polega na tym, że 'opis-zadanie-definicja' będzie zawierać pierwotną definicję zadania z _containerDefinitions_ jako klucz. Odniosłem sukces, modyfikując to, a następnie uruchamiając 'register-task-definition', aby zarejestrować nową definicję. Jeśli martwisz się o ENV, najłatwiejszym rozwiązaniem jest użycie jednego z nie-bashowych zestawów SDK. –

Odpowiedz

12

Tak, to jest prawidłowe podejście.

I nie, przy obecnym API nie można zarejestrować nowej wersji istniejącej definicji zadania bez jej powielenia.

Jeśli nie korzystać z CLI do generowania oryginalnej definicji zadania (lub nie chcesz ponownie użyć oryginalnego polecenia generowany), można spróbować coś jak następuje poprzez CLI:

OLD_TASK_DEF=$(aws ecs describe-task-definition --task-definition <task_family_name>) 
NEW_CONTAINER_DEFS=$(echo $OLD_TASK_DEF | jq '.taskDefinition.containerDefinitions' | jq '.[0].image="<new_image_name>"') 
aws ecs register-task-definition --family <task_family_name> --container-definitions "'$(echo $NEW_CONTAINER_DEFS)'" 

Nie w 100% bezpieczny, ponieważ argument ostatniego polecenia o wartości --container-defintions (zawierający pozycje "environment") będzie nadal widoczny w procesach takich jak ps. Jeden z pakietów SDK AWS zapewni lepszy spokój.

+0

Możesz również potrzebować innych sekcji, takich jak woluminy. Po prostu użyj jq, aby je przetworzyć, a następnie dodaj opcje (np. --volumes VOLUMES_DEF) do 'register-task-definition' –

4

Odpowiedź udzielana przez Matt Callanana nie działa dla mnie: Otrzymałem błąd na tej części:

--container-definitions "'$(echo $NEW_CONTAINER_DEFS)'" 

następująco: Błąd parsowania parametr „--container-definicji”: Oczekiwany: „=” otrzymała: '' 'dla wejścia:

' {środowiska: [{etc etc ....

Co zrobiłem, aby rozwiązać to było:

TASK_FAMILY=<task familiy name> 
DOCKER_IMAGE=<new_image_name> 
LATEST_TASK_DEFINITION=$(aws ecs describe-task-definition --task-definition ${TASK_FAMILY}) 

echo $LATEST_TASK_DEFINITION \ 
    | jq '{containerDefinitions: .taskDefinition.containerDefinitions, volumes: .taskDefinition.volumes}' \ 
    | jq '.containerDefinitions[0].image='\"${DOCKER_IMAGE}\" \ 
    > /tmp/tmp.json 

aws ecs register-task-definition --family ${TASK_FAMILY} --cli-input-json file:///tmp/tmp.json 

Przyjmuje zarówno elementy containerDefinitions i woluminy z oryginalnego dokumentu json, ponieważ moje containerDefinition używa tych woluminów (więc nie jest potrzebne, jeśli nie używasz woluminów).

Powiązane problemy