This repo configures infrastructure for the https://dap.ps/ service.
The service is split into two stages:
Stage | With CDN | Without CDN |
---|---|---|
prod |
https://prod.dap.ps/ | https://raw.prod.dap.ps/ |
dev |
https://dev.dap.ps/ | https://raw.dev.dap.ps/ |
The prod
environment is CNAME
ed to dap.ps
domain.
The infrastructure is hosted on AWS and consists of 5 main elements:
- ELB - Load balancers
- EB - Node.js App hosting
- EC2 - MongoDB cluster
- S3 - MongoDB backups & Terraform state
- SES - Mail forwarding
- CF - CDN
- R53 - Route53 DNS
All the AWS parts are provisioned and managed with Terraform and the MongoDB cluster configured with Ansible.
The dap.ps
domain is registered via Gandi DNS provider and is managed with AWS Route53 Hosted Zone by changing the Name Servers with help from Gandi support. See dns.tf
for more details.
There are no mailboxes for dap.ps
domain. We forward emails using AWS Lambda and AWS SES. You can change the forwarding rules by editing the defaultConfig
object in files/sesforwarder.js
and adding Verified Emails in mail.tf
.
Creation of both dev
and prod
stages is as simple as:
terraform init
terraform apply
And then configure the MongoDB hosts using ansible:
ansible-playbook ansible/dev.yml
ansible-playbook ansible/prod.yml
- The ElasticBeanstalk environments can fail when being recreated
- This is mostly due to AWS being slow at destorying resources and their race conditions
- There is no easy way of making ElasticBeanstalk spread geographically
- The only way seems to have multiple EB environments linked via ELB
- CDN can be slow to pick up updates to ElasticBeanstalk application
- Invalidating the CloudFront cache fixes the issue
- #4 - [prod] Geographically spread hosts
- #11 - [prod] MongoDB Web UI
- #13 - [prod] Stress test infrastructure
These helped me during work on this setup:
- https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb-cli3.html
- https://aws.amazon.com/getting-started/tutorials/deploy-app-command-line-elastic-beanstalk/
- https://medium.com/@vygandas/how-to-deploy-your-nodejs-app-on-amazon-elastic-beanstalk-aws-eb-with-circleci-short-tutorial-d8210d2a7f0c
- https://realpython.com/deploying-a-django-app-to-aws-elastic-beanstalk/