3

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/
4
  • 1
    Which ubuntu version? Also you can check on the instance /var/log/cloud-init-ouput.log Commented Jul 29, 2020 at 2:08
  • @Marcin Ubuntu 16.04.6 LTS (Xenial). Nothing unusual in logs except for device, route and key info and below at the end: WARNING: apt does not have a stable CLI interface. Use with caution in scripts. Err:1 http://security.ubuntu.com/ubuntu xenial-security InRelease Cannot initiate the connection to security.ubuntu.com:80 Commented Jul 29, 2020 at 15:14
  • That warning message is printed by apt itself, so its presence confirms that your script is being executed, but that it isn't succeeding to do what you intended. When you tried to reproduce the script from the command line you ran it as user ubuntu, which has different access than cloud-init does; for a more realistic reproduction, use sudo apt update to run apt with superuser permissions. Commented Jul 29, 2020 at 18:27
  • With that said, my guess is that the network configuration for your instance is blocking it from reaching over the internet to the Ubuntu package repositories. You could confirm this by trying to reach other http and https addresses using a command like curl. If no host on the internet is accessible, I'd suggest starting a new question about configuring outbound internet access for an EC2 instance, and include in that question the configuration for your VPC(s), subnet(s), and security group(s) too. Commented Jul 29, 2020 at 18:29

4 Answers 4

1

I verified the script on my sandbox account.

It had mistakes. The corrected version is as follows:

#!/bin/bash -xe

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

The changes were:

  • removal of sudo
  • fixing to -
  • fixing apt install Jenkins to apt install -y jenkins

I can confirm that it works now with terraform on Ubuntu 18.04 instance.

Upon launching the instance, jenkins is available at http://<instance-ip>:8080:

enter image description here

Sign up to request clarification or add additional context in comments.

2 Comments

I tried exact script you have given above but still its not working. Anywhere i can debug it or find tracelogs?
@Maven What exactly OS are you using. The script provided works on Ubuntu 18.04. I tested it as explained in the answer on the OS. Nevertheless you can inspect /var/log/cloud-init-output.log for error messages.
0

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

Comments

0

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).

2 Comments

Done but still not working, anywhere i can debug it or find tracelogs for user data execution?
Same documentation lists a few gotchas and suggests looking in /var/log/cloud-init-output.log
0

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.