How to make EC2 user data script run again on startup?

Solution 1:

rm /var/lib/cloud/instances/*/sem/config_scripts_user

Confirmed working on:

  • CentOS 7.4
  • Ubuntu 14.04
  • Ubuntu 16.04

For the sake of completeness, if you have a situation where you care to keep track of the fact/possibility that this AMI [had a parent AMI that ...] and they all ran cloud-init user data, you can delete only the current semaphore.

rm /var/lib/cloud/instance/sem/config_scripts_user

Solution 2:

You can also configure your user data to re-run on every boot, instead of removing the state file. You have to use cloud_final_modules in your userdata script to re-run the userdata script and for that you have to customise uderdata to have miultiple files in userdata. Example userdata file would be like:

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
/bin/echo "Hello World" >> /tmp/userdata-test.txt
--//

This will make userdata script to execute on last step of every boot process. Here only a single line bin/echo "Hello World" >> /tmp/userdata-test.txt to be executed, replace this with your shell script that needs to be executed every time a machine is booted.


Solution 3:

You can put your script in /etc/rc.local, which will run the script on every reboot.