In this second part, I will install Docker on AWS EC2 before deploying.

In part II, here what you will learn:
- Configuring AWS EC2 Userdata with Terraform
- Setting Up VSCode SSH Configuration
- Utilizing Terraform Provisioners
- Installing Docker on EC2 before deploying
- Replacing Resources and Deploying EC2 with Terraform
- Working with Terraform Variables
- Using Terraform Conditional Expressions
- Basics of Terraform Outputs
Part II:
Launching an AWS EC2 Instance with Terraform
- Google “AWS EC2 resource in terraform”. You should land on the section in the terraform documentation that mention AWS EC2.
- Go back to VS Code and add the block to main.tf in the Terraform directory.
- Enter the necessary information needed to create a VPC.

- Run
terraform plan
, thenterraform apply -auto-approve
. You should see a new resource. - Reorganize the code in main.tf

Configuring AWS EC2 Userdata with Terraform
- Add userdata to our content to boostrap our instance. Boostrap goes over instance for docker to be ready.
- Create a new file named userdata.tpl

- Add it to the resource “aws_instance”

- Run
terraform plan
, thenterraform apply -auto-approve
. You should see a new resource. - Go to EC2 dashboard to verify.

- Or run
terraform state list

- Run
terraform state show aws_instance.dev_node

- Copy and save the public IP address to connect “44.202.189.9”

- Connect to the instance:
ssh -i ~/.ssh/keypairname username@ippublicaddress

- When connected, verify if docker is installed

Setting Up VSCode SSH Configuration
- Go to the extension, and search for “Remote — SSH”. Install it.

- Go back to explorer and type:
cat ~/.ssh/config
- Create a file named “windows-ssh-config.tpl

- Create another file for linux named “linux-ssh-config.tpl

Utilizing Terraform Provisioners
- Go back to main.tf, under resource “aws_instance” enter this code

- Run
terraform state list
- Run
terraform apply-replace aws_instance.dev_node

- Enter Y.
- Go to your console and verify if itt’s working.

- Enter
cat ~/.ssh/config
, you should get a correct result.

Installing Docker on EC2 before deploying
- In VS code, go to view. Click on Command palette, then ssh. Check the IP address and click on it.

- Select Linux, and click OK.

- Open terminal and run
docker
- Run
docker --version

- Click “Yes, I trust the authors”.

- You’ve deployed a DEV environment using Terraform, and accesible via SSH remote. You can stop the lab here.

BONUS: Or you can continue the lab.
Let’s try to optimize what I did. I am going to modify couple of scripts to adjust everything.
Replacing Resources and Deploying EC2 with Terraform
- Modify the type of OS we are using. Change windows in the provisioner so that it can be useful when using other operating systems.

- Use the interpolation syntax: $ { } which is a calculated variable used
- Create a new file named “variables.tf”
- Go to the terraform document. Search for “Declaring an input variable”
- Copy the code and enter the necessary changes

- Save the file.
- Run
terraform destroy -auto-approve
. Enter windows when a value is requested.

Working with Terraform Variables
- The system is requesting to define var.host_os
- Create a new file named “terraform.tfars” with the following details

- Create a another file named “dev.tfars” with the following details

- Run the following command: terraform console -var-file=”dev.tfars”, then enter the variable

Using Terraform Conditional Expressions
- Run the following command: terraform console -var=”host_os=windows”, then enter the variable

- You realize you should set or change the interpreter by integrating variables.

- Run
terraform plan
, then runterraform apply -auto-approve
. - If nothing change, run
terraform plan -refresh-only.

Basics of Terraform Outputs
- Launch terraform console, and type aws_instance.dev_node.public_ip to view IP address.
- Create a new file “outputs.tf”

- Run
terraform apply -refresh-only
.

- Run
terraform output
.to see the final result.

This is how you can optimize your terraform script with variables and outputs. This is the end.
Thank you for reading and/or following along! Leave us a clap or a comment. Please stay tuned for all my upcoming projects.

Leave a Reply