J'amorce une instance Windows Amazon EC2 à l'aide du script cfn-init.exe dans AWS CloudFormation et je renvoie un signal à l'aide de cfn-signal.exe. L'une des étapes exécutées par cfn-init.exe entraîne un redémarrage de l'instance. Il arrive parfois que le signal soit renvoyé trop tôt et CloudFormation marque alors l'état de l'instance comme étant CREATE_COMPLETE alors que son amorçage n'est pas terminé. cfn-init.exe et cfn-signal.exe sont tous les deux exécutés à partir de UserData.

Dans une instance Windows EC2, les scripts UserData sont exécutés par le processus Ec2ConfigService. Lors de l'appel de cfn-init.exe à partir de UserData, il exécute un processus enfant d'Ec2ConfigService. Si l'une des étapes exécutées par cfn-init.exe requiert un redémarrage du système, l'arrêt du système peut parfois commencer et celui-ci retransfère alors l'exécution au processus Ec2ConfigService. Il continue à traiter le script UserData et il exécute cfn-signal.exe pour renvoyer le signal à CloudFormation. Cette condition de concurrence peut se produire ou pas, selon la rapidité avec laquelle le système s'arrête lors de l'opération de redémarrage.

Voici un exemple d'un appel standard de cfn-init.exe et cfn-signal.exe à partir de UserData :

"UserData": { "Fn::Base64": { "Fn::Join": ["", [

    "\",

    " cfn-init.exe -v -s ", { "Ref": "AWS::StackName" },

    "  -r Instance",

    "  --region ", { "Ref" : "AWS::Region" }, "\",

    " cfn-signal.exe -e %ERRORLEVEL% ", {"Fn::Base64": { "Ref": "WaitHandle" }}, "\",

    ""

]]}}

Déplacez cfn-signal.exe en dehors de UserData et exécutez-le en tant que dernière commande exécutée par cfn-init.exe, par exemple :

"WindowsServer": {

    ...

    "Type" : "AWS::EC2::Instance",

    "Metadata": {

        "AWS::CloudFormation::Init": {

            "config": {

                "commands": {

                    "0-restart": {

                        "command": "powershell.exe -Command Restart-Computer",

                        "waitAfterCompletion": "forever"

                    },

                    "1-signal-success": {

                        "command": {

                            "Fn::Join": ["", [

                                "cfn-signal.exe -e 0 --stack ", { "Ref": "AWS::StackId" },

                               " --resource WindowsServer --region ", { "Ref": "AWS::Region" } ] ]

                        }

                    }

                }

            }

        }

    }

}

Ce faisant, nous ne sommes plus en mesure de capturer la valeur %ERRORLEVEL% globale du processus cfn-init.exe. Toutefois, si le processus échoue, aucun signal de réussite n'est renvoyé à la pile CloudFormation dans le délai d'expiration spécifié.

CloudFormation, Windows, EC2, signal, intermittent, cfn-signal.exe


Cette page vous a-t-elle été utile ? Oui | Non

Retour au Centre de connaissances AWS Support

Vous avez besoin d'aide ? Consultez le site du Centre AWS Support

Date de publication : 30/09/2016