'user_data not getting executed over instance creation

I have provided an .sh file as user_data in my Terraform script:

resource "aws_instance" "alpha-terraform"{
    ami=var.amis[var.region]
    instance_type="t2.micro"
    vpc_security_group_ids=[aws_security_group.alpha-terraform-sg.id]
    user_data = file("user_data_bootstrap.sh")
    key_name = "alpha-terraform"

    tags={
        type="alpha"
        purpose="terraform"        
    }
}

The .sh file contains:

#Jenkins Installation:
sudo apt update
sudo apt install openjdk-8-jdk --yes
wget –q –O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add –
sudo sh -c 'echo deb https://pkg.jenkins.io/debian binary/ >> /etc/apt/sources.list'
sudo apt update
sudo apt install Jenkins
sudo systemctl status jenkins
find /usr/lib/jvm/java-1.8* | head -n 3

My instance is getting created all right. However, I believe my user_data is not getting executed. I can see the user_data is being copied to /var/lib/cloud/instance/ as user-data.txt and user-data.txt.i but still not getting executed.

Why is this happening and how can I debug it further?

Update

I tried accessing the server through and executing each command one by one but getting following error while updating apt packages:

ubuntu@ip-172-31-52-**:~$ apt update
Reading package lists... Done
W: chmod 0700 of directory /var/lib/apt/lists/partial failed - SetupAPTPartialDirectory (1: Operation not permitted)
E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
E: Unable to lock directory /var/lib/apt/lists/
W: Problem unlinking the file /var/cache/apt/pkgcache.bin - RemoveCaches (13: Permission denied)
W: Problem unlinking the file /var/cache/apt/srcpkgcache.bin - RemoveCaches (13: Permission denied)
ubuntu@ip-172-31-52-**:~$ sudo apt update
Reading package lists... Done
E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)
E: Unable to lock directory /var/lib/apt/lists/


Solution 1:[1]

You're missing #!/bin/bash at the beginning of the file. From the documentation:

User data shell scripts must start with the #! characters and the path to the interpreter you want to read the script (commonly /bin/bash). For a great introduction on shell scripting, see the BASH Programming HOW-TO at the Linux Documentation Project (tldp.org).

Solution 2:[2]

I will prefer templatefile over file where you have more control and pass variable to user data as well.

templatefile reads the file at the given path and renders its content as a template using a supplied set of template variables where file reads the contents of a file at the given path and returns them as a string.

templatefile(path, vars)
data "template_file" "backend_cloud_init" {
  template = "${file("user_data_bootstrap.sh")}"
  vars = {
    JDK_VERSION = "openjdk-8-jdk"
  }
}

then use the template_file in a userdata section

resource "aws_instance" "alpha-terraform"{
    ami=var.amis[var.region]
    instance_type="t2.micro"
    vpc_security_group_ids=[aws_security_group.alpha-terraform-sg.id]
    user_data                   = "${data.template_file.backend_cloud_init.rendered}"
    key_name = "alpha-terraform"

    tags={
        type="alpha"
        purpose="terraform"        
    }
}

Also, add the hashbang in the file with debug

#!/usr/bin/env bash
set -x

Solution 3:[3]

To help troubleshooting, it's a good idea to SSH and check folder /var/lib/cloud/instances/instance-id/. You should find the data_user script there. Read it to check if everything is as expected.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 kichik
Solution 2 Adiii
Solution 3