Чтобы шаблон CloudFormation ожидал завершения сценария UserData, необходимо сделать две вещи:
Добавить CreationPolicy к целевому ресурсу (виртуальная машина в моем случае).
Добавьте logi c в скрипт, чтобы сообщить о его завершении. Этот пользовательский лог c использует утилиту cfn-signal , которую вам, возможно, придется установить в своем экземпляре.
Вот как теперь выглядит шаблон :
"UserData": {
"Fn::Base64" : {
"Fn::Join" : [
"",
[
"curl --silent --show-error --retry 5 https://bootstrap.pypa.io/get-pip.py | sudo python\n",
"curl https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz -o /home/ubuntu/aws-cfn-bootstrap.tar.gz\n",
"tar -xvzf /home/ubuntu/aws-cfn-bootstrap.tar.gz -C /home/ubuntu/\n",
"rm /home/ubuntu/aws-cfn-bootstrap.tar.gz\n",
"chmod +x /home/ubuntu/aws-cfn-bootstrap-*/bin/cfn-signal\n",
"pip install /home/ubuntu/aws-cfn-bootstrap-*\n",
"dcv create-session --type virtual ",
" --owner ubuntu",
" --user ubuntu",
" my-session, "\n",
"while ! (dcv list-sessions | grep -q 'my-session'); do sleep 1; done\n"
"/home/ubuntu/aws-cfn-bootstrap-*/bin/cfn-signal -e $? ",
" --stack ", { "Ref": "AWS::StackName" },
" --resource MyInstance" ,
" --region ", { "Ref" : "AWS::Region" }, "\n"
]
]
}
},
"CreationPolicy": {
"ResourceSignal" : {
"Count": "1",
"Timeout": "PT5M"
}
}
Разрушение сценария.
Эта команда извлекает и устанавливает набор инструментов aws -cfn , необходимый для cfn -signal :
"curl --silent --show-error --retry 5 https://bootstrap.pypa.io/get-pip.py | sudo python\n",
"curl https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz -o /home/ubuntu/aws-cfn-bootstrap.tar.gz\n",
"tar -xvzf /home/ubuntu/aws-cfn-bootstrap.tar.gz -C /home/ubuntu/\n",
"rm /home/ubuntu/aws-cfn-bootstrap.tar.gz\n",
"chmod +x /home/ubuntu/aws-cfn-bootstrap-*/bin/cfn-signal\n",
"pip install /home/ubuntu/aws-cfn-bootstrap-*\n",
Это мой пользовательский сценарий, который я хочу убедиться, что он завершен до того, как формирование облака завершит развертывание:
"dcv create-session --type virtual ",
" --owner ubuntu",
" --user ubuntu",
" my-session, "\n",
"while ! (dcv list-sessions | grep -q 'my-session'); do sleep 1; done\n"
Наконец, я использую cfn-signal утилита для оповещения о завершении скрипта:
"/home/ubuntu/aws-cfn-bootstrap-*/bin/cfn-signal -e $? ",
" --stack ", { "Ref": "AWS::StackName" },
" --resource MyInstance" ,
" --region ", { "Ref" : "AWS::Region" }, "\n"