En la plantilla de CloudFormation que estoy implementando, estoy ejecutando una operación de larga duración en el bloque UserData.
Se ve de la siguiente manera:
"UserData": { "Fn::Base64" : { "Fn::Join" : [ "", [ "/usr/local/bin/mylongrunningscript.sh" ] ] } }Los contenidos del guión son:
echo "UserData starting!" > /var/log/mycustomlog.log sleep 300 echo "UserData finished!" >> /var/log/mycustomlog.logEl problema que veo es que creo que la plantilla de CloudFormation está completando su implementación antes de que termine de ejecutarse el script UserData. Creo que este es el caso porque si soy lo suficientemente rápido y hago ssh en la instancia, veré algo como lo siguiente:
$ cat /var/log/mycustomlog.log UserData startinglo que sugiere que UserData no terminó de ejecutarse
¿Cómo puedo asegurarme de que la ejecución del código UserData se complete antes de que la pila esté en el estado "CreateComplete"?
Para asegurarse de que la plantilla de CloudFormation espere a que se complete el script de UserData, debe hacer dos cosas:
Agregue una CreationPolicy al recurso al que se dirige (máquina virtual en mi caso).
Agregue lógica en el script para señalar su finalización. Esta lógica personalizada utiliza la utilidad cfn-signal , que es posible que deba instalar en su instancia.
Así es como se ve la plantilla ahora:
"UserData": { "Fn::Base64" : { "Fn::Join" : [ "", [ "/usr/local/bin/mylongrunningscript.sh" ] ] } }, "CreationPolicy": { "ResourceSignal" : { "Count": "1", "Timeout": "PT10M" } }La utilidad cfn-signal se utiliza para señalar la finalización del script:
"/home/ubuntu/aws-cfn-bootstrap-*/bin/cfn-signal -e $? ", " --stack ", { "Ref": "AWS::StackName" }, " --resource MyInstance" , " --region ", { "Ref" : "AWS::Region" }, "\n"Vea aquí un ejemplo de Windows.