'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.
templatefilereads the file at the given path and renders its content as a template using a supplied set of template variables wherefilereads 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 |
