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