When an AWS EC2 User Data script fails, you’ll see something like this in /var/log/cloud-init.log in your instance:
2018-02-03 06:08:16,536 - util.py[DEBUG]: Failed running /var/lib/cloud/instance/scripts/part-001  Traceback (most recent call last): File "/usr/lib/python3/dist-packages/cloudinit/util.py", line 806, in runparts subp(prefix + [exe_path], capture=False) File "/usr/lib/python3/dist-packages/cloudinit/util.py", line 1847, in subp cmd=args) cloudinit.util.ProcessExecutionError: Unexpected error while running command. Command: ['/var/lib/cloud/instance/scripts/part-001'] Exit code: 127 Reason: - Stdout: - Stderr: - 2018-02-03 06:08:16,541 - cc_scripts_user.py[WARNING]: Failed to run module scripts-user (scripts in /var/lib/cloud/instance/scripts) 2018-02-03 06:08:16,541 - handlers.py[DEBUG]: finish: modules-final/config-scripts-user: FAIL: running config-scripts-user with frequency once-per-instance
It tells you something failed, but not what. The trouble seems that output from your user data script does not go to the cloud-init.log by default.
One of the answers in this post suggests to pipe your script commands and output to logger into a separate log file like this:
set -x exec > >(tee /var/log/user-data.log|logger -t user-data ) 2>&1 echo BEGIN date '+%Y-%m-%d %H:%M:%S'
Now running my script with a ‘apt-get update -y’ looks like:
+ echo BEGIN BEGIN + date '+%Y-%m-%d %H:%M:%S' 2018-02-03 23:37:55 + apt-get update -y ... output continues here
And further down, here’s my specific error I was looking for:
+ java -Xmx1024M -Xms1024M -jar minecraft_server.1.12.2.jar nogui /var/lib/cloud/instance/scripts/part-001: line 11: java: command not found
My EC2 running the Ubuntu AMI does not have Java installed by default, so I need to install it with (adding to my User Data script):
apt-get install openjdk-8-jre-headless -y
… and now my script runs as expected.