Skip to content

hanchiang/url-shortener-infra

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

88 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Introduction

example workflow example workflow example workflow

This project is the infrastructure as code management for URL shortener backend using AWS.

Structure

  • images/: Packer files for building AMI
    • image.pkr.hcl: Main packer script
    • scripts/: Scripts to be run when provisioning AMI
  • instances/: Terraform files to provision EC2 in VPC
    • main.tf: Main terraform script
    • ansible/: Ansible scripts to run post-provisioning tasks such as mounting EBS volume, set up file system, copy postgres data, setup SSL for nginx
    • scripts/: Scripts to automate(everything after step 2 of the workflow) start and stop of EC2, DNS, and deployment of URL shortener backend. Calls ansible scripts

Workflow

1. Provision EC2 AMI using packer

Provisions a EBS-backed EC2 AMI, and install the necessary softwares for URL shortener backend, i.e. postgres, redis, as well as nginx

cd into images/ Define variables that are declared in image.pkr.hcl in a new file variables.auto.pkrvars.hcl Build image: packer build -machine-readable -var-file variables.auto.pkrvars.hcl image.pkr.hcl | tee build.log

2. Provision EC2 in a VPC using terraform

cd into instances/ Copy the AMI ID from packer build, update it in variables.tf Provision infra: terraform apply

Everything from here onwards is handled in instances/scripts/start.sh

3. Run ansible script

Run post-provisioning configurations such as mounting EBS volume, setting PostGreSQL data directory, nginx SSL, grafana

4. Deploy application

Rerun the latest deploy job in github action

Diagram

Traffic flow

Deployment pipeline

TODO:

  • Extract common functions into a reusable python module
  • Use ansible roles to define reusable configurations
  • Use terraform modules to define reusable configurations
  • IAM user and policies for system admin
  • container image scan
  • Use terraform vault to store secrets
  • Create postgres roles and user: app, grafana
  • Grafana: Traces, alerts on infra & app, monitor grafana itself
  • Use AWS ECS for multi container deployment
  • Update architecture diagram
  • Dockerise nginx

Learnings:

  • Messed up PostGreSQL WAL by rsyncing /var/lib/postgresql/13/main/ to its new data directory. Don't do it.