Automating Deployment on EC2 Instance with Terraform and Docker
Hey buddy! Tech can be tricky, but you’ve got this. Think of this as a tech chat over coffee...or my personal favorite, chaay (tea).
Let’s dive into how to automate deploying your Meteor.js project on AWS. By the end of this, you’ll feel like a cloud deployment ninja. Ready? Let’s go!
What You’ll Need
Before we roll up our sleeves, let’s gather our stuffff. Here's the checklist:
AWS Credentials: Ensure you have the AWS CLI configured and ready to roll.
Terraform: Download and install Terraform if you haven’t already.
SSH Key Pair: Generate an SSH key pair. Keep the private key handy to connect to your instance later.
Domain Name: Got a domain? Great! Make sure you can update its A records.
Meteor Bundle: Prep your Meteor.js project bundle using this command:
meteor build --server-only --directory ~/path/to/Dockerfile
- Setup Scripts: You’ll need three scripts to set up the server:
Got everything? Awesome! Let’s start building.
The Game Plan
Here’s the journey we’re about to go on:
- Use Terraform to spin up an EC2 instance on AWS.
- Run some scripts to configure the server, install MongoDB, and deploy your Meteor.js app using Docker.
- Tweak your DNS settings to point your domain to the server’s IP.
- Finalize everything with SSL setup via Certbot.
Easy enough, right? Let’s break it down step by step.
Setting Up Terraform
Start by organizing your Terraform project. Create a directory structure like this:
project-directory/
├── main.tf
├── variables.tf
├── outputs.tf
├── run.sh
Step 1: Variables Configuration
In variables.tf
, define all the variables we’ll need. These make the setup flexible:
variable "server_name" {
description = "Server created by Terraform"
type = string
default = "AutomatedDeployment"
}
variable "key_pair_name" {
description = "Key pair name"
type = string
default = "tf-key-pair"
}
variable "domain_name" {
description = "Your domain name"
type = string
default = "xyz.domain.com"
}
Step 2: The Heart — main.tf
Here’s where the magic happens. This file sets up everything: EC2 instance, security groups, and provisioning steps.
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.16"
}
}
required_version = ">= 1.2.0"
}
provider "aws" {
region = "ca-central-1"
}
resource "aws_security_group" "tf-security-group" {
name = var.server_name
description = "Security group for ${var.server_name}"
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
resource "aws_instance" "tf-created-instance" {
ami = "ami-0083d3f8b2a6c7a81"
instance_type = "t2.micro"
key_name = var.key_pair_name
tags = {
Name = var.server_name
}
}
Step 3: Outputs
Define what Terraform should output after running:
output "public_ip" {
value = aws_instance.tf-created-instance.public_ip
description = "The public IP address of the instance"
}
Step 4: Automation Script
In run.sh
, write a script to automate Terraform commands and handle DNS propagation:
#!/bin/bash
set -e
DOMAIN="your.domain.com"
terraform apply -auto-approve
echo "Waiting for DNS propagation..."
OLD_IP=$(dig +short $DOMAIN)
while true; do
sleep 10
NEW_IP=$(dig +short $DOMAIN)
[ "$NEW_IP" != "$OLD_IP" ] && break
echo "DNS records not updated yet. Retrying..."
done
terraform apply -auto-approve
Dockerfile for Meteor
Here’s a sample Dockerfile to package your Meteor.js app:
FROM node:14.21.3-alpine
WORKDIR /app
COPY bundle/ .
EXPOSE 3000
ENV PORT=3000 \
ROOT_URL="http://localhost:3000" \
MONGO_URL="<your-MongoDB-url>"
WORKDIR /app/programs/server
RUN npm install
CMD ["sh", "-c", "MONGO_URL=mongodb://user:password@${MONGO_HOST}:27017/wp node /app/main.js"]
Steps to Deploy
- Initialize Terraform: Run this command to set up Terraform:
terraform init
- Deploy with Automation: Run the script to deploy:
./run.sh
DNS Update:
Update your domain’s A record to point to the EC2 instance’s public IP.Verify:
Once DNS propagation is complete, verify your deployment by visiting the domain in a browser.
And there you have it! A fully automated Meteor.js app deployment on AWS using Terraform and Docker. Remember, every challenge is just another opportunity to learn. If you hit a rock, take a sip of chaay and troubleshoot like the tech pro you are. Celebrate your deployment success and post it everywhere!😉
Top comments (0)