This project involves hosting a backend application on Amazon EC2 instances with auto-scaling capabilities and accessibility with HTTPS. The setup includes using Docker to containerize the application, Terraform for infrastructure as code, and GitHub Actions for CI/CD pipelines. The architecture leverages the following AWS services:
- EC2 Instances: Virtual servers to run the backend application.
- Auto Scaling Group (ASG): Automatically adjusts the number of EC2 instances based on the application's load to ensure high availability and reliability.
- Application Load Balancer (ALB): Distributes incoming traffic across multiple EC2 instances to balance the load and enhance fault tolerance.
- Route 53: Manages domain name system (DNS) settings to route end-user requests to the appropriate resources.
- Certificate Manager: Provides SSL/TLS certificates to enable secure HTTPS connections to the application.
- EC2 Launch Template: Defines the configuration for EC2 instances, including a custom user script to start the Docker container using Docker Compose.
- S3: Used for storing Terraform state files securely.
- IAM: Manages access and permissions for AWS services and resources, including OpenID Connect (OIDC) for GitHub Actions.
Commands
$ python -m venv venv
$ python -m unittest ./tests/test_app.py
Commands
$ cd docker/dev
$ docker-compose up -d
$ docker build --platform linux/amd64/v2 -t enricogoerlitz/bp2-backend-amd64v2 -f ./docker/Dockerfile .
$ docker push enricogoerlitz/bp2-backend-amd64v2:latest
push on dev:
- run unittests
pull request on main
- run unittests
- if unittests green -> build and deploy docker image on hub.docker.com
pull request on main
- deploy infrastructure with terraform
pull request on destroy-infra
- destroy infrastructure with terraform
-
aws > IAM > Identity Provider > new Identity Provider
- url=https://token.actions.githubusercontent.com
- audience=sts.amazonaws.com
-
aws > s3 > create bucket
- name
- enable enrcyption
-
aws > IAM > roles > create role > custom trusted policy
-
GitHub Secrets:
- AWS_BUCKET_NAME=bp2-terraform-deployment-state
- AWS_BUCKET_KEY_NAME=infra.tfstate
- AWS_REGION=eu-central-1
- AWS_ROLE=arn:aws:iam::533267024986:role/github-oicd-bp2-terraform-deployment-role