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 =

Feb 18, 2025 - 11:39
 0
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 = <<-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!