Deploying an EC2 Instance with a Dockerized App using Terraform
Introduction In this blog, we will walk through deploying an AWS EC2 instance using Terraform and setting up a Dockerized application (Nginx) on it. This is a great project for those looking to enhance their Terraform and AWS skills while automating infrastructure provisioning. Prerequisites Before we begin, ensure you have: ✅ Terraform installed → Download Here ✅ AWS CLI installed and configured → Run aws configure ✅ An AWS Key Pair (to SSH into the instance) Project Overview We will create: ✔️ An EC2 instance with a security group allowing SSH and HTTP traffic ✔️ Docker installation via Terraform's user_data ✔️ Nginx container running on the EC2 instance Step 1: Define the Terraform Provider Create a file named provider.tf and specify AWS as the provider: provider "aws" { region = "us-east-1" # Change this as needed } Step 2: Define an EC2 Instance with Docker Setup Create a file named ec2.tf and add the following configuration: resource "aws_instance" "web" { ami = "ami-0c55b159cbfafe1f0" # Amazon Linux 2 AMI (update if needed) instance_type = "t2.micro" key_name = "your-key" # Replace with your actual key pair name security_groups = [aws_security_group.ec2_sg.name] user_data =

Introduction
In this blog, we will walk through deploying an AWS EC2 instance using Terraform and setting up a Dockerized application (Nginx) on it. This is a great project for those looking to enhance their Terraform and AWS skills while automating infrastructure provisioning.
Prerequisites
Before we begin, ensure you have:
✅ Terraform installed → Download Here
✅ AWS CLI installed and configured → Run aws configure
✅ An AWS Key Pair (to SSH into the instance)
Project Overview
We will create:
✔️ An EC2 instance with a security group allowing SSH and HTTP traffic
✔️ Docker installation via Terraform's user_data
✔️ Nginx container running on the EC2 instance
Step 1: Define the Terraform Provider
Create a file named provider.tf
and specify AWS as the provider:
provider "aws" {
region = "us-east-1" # Change this as needed
}
Step 2: Define an EC2 Instance with Docker Setup
Create a file named ec2.tf
and add the following configuration:
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0" # Amazon Linux 2 AMI (update if needed)
instance_type = "t2.micro"
key_name = "your-key" # Replace with your actual key pair name
security_groups = [aws_security_group.ec2_sg.name]
user_data = <<-EOF
#!/bin/bash
sudo yum update -y
sudo yum install docker -y
sudo systemctl start docker
sudo systemctl enable docker
sudo docker run -d -p 80:80 nginx
EOF
tags = {
Name = "Terraform-EC2-Docker"
}
}
What is happening here?
✔️ The Amazon Machine Image (AMI) is set to Amazon Linux 2
✔️ Instance Type is t2.micro
(free-tier eligible)
✔️ Docker is installed and started
✔️ Nginx container is deployed and runs on port 80
Step 3: Define a Security Group
Create a file named security-group.tf
:
resource "aws_security_group" "ec2_sg" {
name = "terraform-sg"
description = "Allow SSH and HTTP"
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"] # Allows SSH access
}
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"] # Allows HTTP access
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"] # Allows all outbound traffic
}
}
Step 4: Output the EC2 Public IP
Create a file outputs.tf
to display the instance's public IP:
output "public_ip" {
value = aws_instance.web.public_ip
}
Step 5: Deploy the Infrastructure
Now, let’s deploy the Terraform configuration.
Initialize Terraform
terraform init
Preview the Changes
terraform plan
Apply the Configuration
terraform apply -auto-approve
Terraform will output the public IP address of the instance.
Step 6: Access the Deployed Application
Once the deployment is complete, open your browser and visit:
http://
You should see the Nginx default page, meaning your Docker container is running successfully!