CloudFormation: How to handle errors in UserData

This is something that should be configured at the UserData level. Think of the UserData as simply a shell script which runs on the machine. You have full control over what happens while the script is run. Few options come to mind to achieve the behavior you are looking for:

  • Setup the script so that on error it sends an alarm to CloudWatch
  • Setup the script so that on error it uses SNS/SES to send you an email
  • Setup the script so that on error the instance shuts itself down automatically

(or indeed you can combine the above).

As to how the shell script should be configured, I suggest the use of trap, so that you can easily run whatever logic you want if the script ever errors.

An example:

#!/bin/bash -xe

notify() {
  echo "UserData was unsuccessful!"
  ... 
  # use this function to implement the notification/shutdown behavior
}

trap 'notify' ERR

cd /var/www
git clone myrepo html
...

I would like some sort of alarm triggered if UserData has a bad exit code so that the instance can be terminated and I can be notified.

This is something you have to program yourself in your UserData. AWS does not have auto-of-the-box means to check for errors in your UserData.