TL; DR: Comment puis-je modifier les exigences de mémoire et de processeur (ou spécifier des détails sur la définition de la tâche ECS) après le déploiement d'un CodePipeline ciblant ECS?
J'ai créé un CodePipeline qui déploie un conteneur ECS. Pour ce faire, mon étape de construction génère un fichier appelé imagedefinitions.json:
[ { "name": "idws", "imageUri": "xxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/xxx/idws-dev:latest" } ]
(xxx pour la confidentialité, mais vous voyez l'idée).
Cependant, ce fichier de définitions d'image ne prend pas en charge tous les détails qui se trouvent dans une définition de tâche ECS. Il permet uniquement la spécification d'un URI de conteneur. D'où vient la configuration de la tâche?
Ce que je trouve particulièrement étrange, c'est que ce pipeline ne fonctionnait pas du tout jusqu'à ce que je crée manuellement une définition de tâche dans ECS qui avait un conteneur du même nom que apparaît dans le fichier de définitions d'image. Cette exigence non documentée me fait supposer que CodePipeline hérite en quelque sorte des détails de la définition de tâche du service, ce qui est irritant mais pas impossible à contourner SAUF: si vous essayez de modifier la définition de la tâche, la prochaine fois que le pipeline exécute tous les détails de la définition de la tâche reviennent à la définition de tâche telle qu'elle était configurée au moment de la création du pipeline. Rien de tout cela n'est expliqué par les instructions pour CodePipeline ou ECS.
4 Réponses :
Dans votre processus CodePipeline, essayez de brancher une étape pour déployer une pile Cloudformation où votre tâche ECS est déclarée. Ainsi, votre pipeline ressemblera à
Source -> Codebuild (construire et pousser l'image du docker) -> Déployer Cloudformation -> Déployer ECS
Voici un modèle incomplet:
Parameters: Cpu: Default: 1024 Memory: Default: 1GB Resources: TaskDefinition: Type: AWS::ECS::TaskDefinition Properties: ContainerDefinitions: - Cpu: !Ref Cpu Memory: !Ref Memory # ...
Comment le service sur lequel je déploie fera-t-il référence à la définition de tâche créée par cette pile?
Vous ne savez pas ce que vous entendez par là, pouvez-vous élaborer? Peut-être avoir l'ARN de la définition de tâche dans les sorties du modèle et la référence croisée que cela ferait?
J'ai aussi beaucoup utilisé Codepipeline ECS pour déployer des clusters ECS croisés. La différence avec votre configuration est que je crée le cluster ECS (et les définitions de tâches, les services, les dépôts ECR, ELB, etc.) avant le pipeline de code, soit via Terraform ou Cloudformation.
Une fois la définition du cluster et de la tâche présente, la ligne de code met simplement à jour l'URL "image" dans la définition de tâche, crée une nouvelle version et déploie de nouvelles tâches en utilisant cette définition.
La création du cluster séparément a fonctionné pour moi car je n'ai pas besoin de créer un cluster / un service / un équilibreur de charge / des politiques / règles d'autoscaling, etc. à chaque fois que mon pipeline s'exécute. Voici les modèles que j'ai utilisés pour créer mon cluster ECS (et d'autres éléments dont il a besoin) a> et pipeline de code , si cela aide!
Il est logique que cela mette à jour l'url de l'image, mais ce n'est pas ce que je vis. Il rétablit en fait la définition de tâche à une spécification de définition de tâche précédente.
C'est bizarre. Seriez-vous en mesure de publier votre json de pipeline et la définition de vos tâches? Peut-être l'ajouter au message d'ouverture.
@DiscoMike Je rencontre le même problème: il utilise une ancienne définition de tâche, mais met à jour la révision à la dernière. Je les désenregistre même / les inactive, mais cela semble encore tirer d'une vieille définition. Je publierai une réponse si je peux développer une solution de contournement solide.
Pour moi, le seul moyen était de créer une nouvelle définition de tâche car le pipeline de déploiement utilisera celle-ci comme base.
Cela n'a pas fonctionné pour moi. Après avoir créé la nouvelle définition de tâche et réexécuté le pipeline, la configuration de la définition de tâche précédente a été utilisée à la place de la nouvelle définition de tâche que j'ai créée.
L'action AWS CodePipeline ECS Deploy semble examiner la définition de tâche la plus récente liée au service sur lequel le déploiement est en cours. Ceci est basé sur l'expérience suivante:
Définition de tâche TDv1
Déployer via un pipeline de code
Mettre à jour manuellement la définition de tâche TDv3
Déployer via un pipeline de code
Mettre à jour manuellement la définition de tâche TDv5
Service de mise à jour pour utiliser TDv5
Déployer via un pipeline de code
Je vois exactement le même problème que vous - j'ai même essayé d'ajouter une étape à la fin de la construction (avant le déploiement) pour pousser ma définition de tâche JSON en tant que nouvelle révision - mais le déploiement ECS la rétablit à chaque fois.