Comment exécuter le script EC2 UserData sur la mise à jour Cloudformation

Oct 01 2020

J'ai un script ec2 userData qui effectue une extraction et une commande de docker-compose.

Je veux lancer "aws cloudformation update-stack" et charger de nouvelles images docker. Chaque fois que la propriété $ {imageTag} change.

Ceci est mon instance de cloudformation yml:

 myInstance:
    Type: 'AWS::EC2::Instance'
    Metadata:
      'AWS::CloudFormation::Init':
        configSets:
          configs:
            - "configDockers"
            - "configOther"
        configDocker:
          commands:
            a:
              command: 'echo -e IMAGE_TAG=${imageTag} >> .env'
            b:
              command: 'docker-compose pull'
            c:
              command: 'docker-compose up'
    Properties:
      UserData:
        Fn::Base64:
          !Sub |
          runcmd:
           - /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource myInstance --region ${AWS::Region} -c configs
           - /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource myInstance --region ${AWS::Region}

J'ai essayé d'ajouter "docker-compose down", de supprimer les anciennes images dans le script UserData et d'ajouter cloud_final_modules pour exécuter UserData à chaque démarrage:

 myInstance:
    Type: 'AWS::EC2::Instance'
    Metadata:
      'AWS::CloudFormation::Init':
        configSets:
          configs:
            - "configDockers"
            - "configOther"
        configDocker:
          commands:
            a:
              command: 'echo -e IMAGE_TAG=${imageTag} >> .env'
            b:
              command: 'docker-compose down'
            c:
              command: 'docker images -q | xargs -r sudo docker rmi'
            d:
              command: 'docker-compose pull'
            e:
              command: 'docker-compose up'
    Properties:
      UserData:
        Fn::Base64:
          !Sub |
          #cloud-config
          cloud_final_modules:
           - [scripts-user, always]
          runcmd:
           - /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource myInstance --region ${AWS::Region} -c configs
           - /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource myInstance --region ${AWS::Region}

Mais après "aws cloudformation update-stack", le script ne s'exécute pas à nouveau malgré le changement d'imageTag. il ne fonctionne que si je change une valeur sous runcmd.

Comment puis-je exécuter le script UserData à chaque exécution de "aws cloudformation update-stack" (à chaque changement d'imageTag)?

Comment puis-je exécuter certaines commandes UserData uniquement au premier démarrage, d'autres commandes à chaque redémarrage et d'autres commandes sur l'instance d'arrêt?

par exemple: je veux exécuter "docker-compose down" uniquement à l'arrêt de l'instance mais d'autres commandes command: 'docker-compose pull / up' à chaque redémarrage de l'instance ou "aws cloudformation update-stack" et certaines commandes initiales uniquement lors de la première configuration .

Réponses

1 Marcin Oct 01 2020 at 07:14

Comment puis-je exécuter certaines commandes UserData uniquement au premier démarrage, d'autres commandes à chaque redémarrage et d'autres commandes sur l'instance d'arrêt?

Vous ne pouvez pas. UserDataest conçu pour s'exécuter uniquement au lancement de l'instance, et non au redémarrage, au démarrage ou à l'arrêt (une exception mentionnée ci-dessous). Pour ce faire, vous devez implémenter vous-même toutes ces fonctionnalités.

Ceci est généralement fait via la définition de fichiers d' unité systemd personnalisés . Ainsi, vous devrez créer de tels fichiers d'unité pour votre docker-compose.

La seule exception est, une manière plutôt piratée, d'exécuter les données utilisateur au démarrage de l'instance décrite dans un récent article de blog AWS:

  • Comment puis-je utiliser les données utilisateur pour exécuter automatiquement un script à chaque redémarrage de mon instance Amazon EC2?