2015-07-17 3 views
16

Je veux automatiser le déploiement de ma demande en ayant mon lancement de service ECS avec la dernière image Docker. D'après ce que j'ai lu, la façon de déployer une nouvelle version d'image est la suivante:service ECS - Automatiser déployer avec nouvelle image Docker

  1. Créer une nouvelle révision de la tâche (après mise à jour de l'image sur votre dépôt Docker).
  2. Mettez à jour le service et spécifiez la nouvelle révision.

Cela semble fonctionner, mais je veux le faire tout au long de l'interface de ligne de commande afin que je puisse le script. # 2 semble assez facile à faire par l'AWS CLI avec update-service, mais je ne vois pas une façon de faire # 1 sans préciser l'ensemble des tâches JSON tout recommencer comme avec register-task-definition (mon JSON comprendra des informations d'identification dans les variables d'environnement, donc je vouloir avoir cela dans le moins d'endroits possible).

Est-ce que je devrais l'automatisation du déploiement de mes mises à jour de service ECS? Et si oui, existe-t-il un "bon" moyen pour que la définition de tâche lance une nouvelle révision (c'est-à-dire sans dupliquer tout)?

+2

L'astuce est que ce 'décrit-tâche definition' contiendra votre définition de tâche d'origine avec _containerDefinitions_ comme la clé. J'ai réussi à modifier ceci en exécutant 'register-task-definition' pour enregistrer une nouvelle définition. Si vous êtes préoccupé par ENV, la solution la plus simple consiste à utiliser l'un des SDK non bash. –

Répondre

12

Oui, c'est la bonne approche.

Et non, avec l'API actuelle, vous ne pouvez pas enregistrer une nouvelle révision d'une définition de tâche existante sans dupliquer.

Si vous n'avez pas utilisé la CLI pour générer la définition de tâche d'origine (ou ne voulez pas réutiliser les commandes originales qui ont généré), vous pouvez essayer quelque chose comme ce qui suit à travers la 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)'" 

pas à 100% sûr que le dernier argument de commande --container-defintions (qui comprend "environment" entrées) sera toujours visible à travers des processus tels que ps. Un SDK AWS donnerait une meilleure tranquillité d'esprit.

+0

Vous pouvez également avoir besoin d'autres sections telles que les volumes. Utilisez simplement jq pour l'analyser, puis ajoutez les options (par exemple --volumes VOLUMES_DEF) à la 'register-task-definition' –

4

La réponse fournie par Matt Callanan ne fonctionnait pas pour moi: je reçu une erreur sur cette partie:

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

donné comme résultat: paramètre Erreur d'analyse « --container-définitions »: attendu: « = » , a reçu: '' 'pour l'entrée:

' {environnement: [{etc etc ....

ce que je l'ai fait pour le résoudre était:

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 

Je prends à la fois les éléments containerDefinitions et volumes du document json d'origine, car mon conteneurDefinition utilise ces volumes (il n'est donc pas nécessaire si vous n'utilisez pas de volumes).