Sets up the following AWS infrastructure:
- Networking:
- VPC
- Public and private subnets
- Routing tables
- Internet Gateway
- Key Pairs
- Security Groups
- Load Balancers, Listeners, and Target Groups
- IAM Roles and Policies
- ECS:
- Task Definition (with multiple containers)
- Cluster
- Service
- Auto scaling config
- RDS
- Health Checks and Logs
Check out the tutorial.
-
Install Terraform
-
Sign up for an AWS account
-
Create two ECR repositories,
django-app
andnginx
. -
Fork/Clone
-
Build the Django and Nginx Docker images and push them up to ECR:
$ cd app $ docker build -t <AWS_ACCOUNT_ID>.dkr.ecr.us-west-1.amazonaws.com/django-app:latest . $ docker push <AWS_ACCOUNT_ID>.dkr.ecr.us-west-1.amazonaws.com/django-app:latest $ cd .. $ cd nginx $ docker build -t <AWS_ACCOUNT_ID>.dkr.ecr.us-west-1.amazonaws.com/nginx:latest . $ docker push <AWS_ACCOUNT_ID>.dkr.ecr.us-west-1.amazonaws.com/nginx:latest $ cd ..
-
Update the variables in terraform/variables.tf.
-
Set the following environment variables, init Terraform, create the infrastructure:
$ cd terraform $ export AWS_ACCESS_KEY_ID="YOUR_AWS_ACCESS_KEY_ID" $ export AWS_SECRET_ACCESS_KEY="YOUR_AWS_SECRET_ACCESS_KEY" $ terraform init $ terraform apply $ cd ..
-
Terraform will output an ALB domain. Create a CNAME record for this domain for the value in the
allowed_hosts
variable. -
To apply the migrations, run the following command, making sure to replace
YOUR_SUBNET_1
,YOUR_SUBNET_2
, andYOUR_SECURITY_GROUP
with the values that were outputted to your terminal from theterraform apply
command:$ aws ecs run-task \ --cluster production-cluster \ --task-definition django-migration-task \ --launch-type FARGATE \ --network-configuration "awsvpcConfiguration={subnets=[YOUR_SUBNET_1, YOUR_SUBNET_2],securityGroups=[YOUR_SECURITY_GROUP],assignPublicIp=ENABLED}"
-
Now you can open
https://your.domain.com/admin
. Note thathttp://
won't work. -
To collect the static files, navigate to the "deploy" folder, create and activate a Python virtual environment, install the requirements, and then run the following command, making sure to replace
<AWS_ACCOUNT_ID>
with your AWS account ID:(env)$ python update-ecs.py \ --cluster=production-cluster \ --service=production-service \ --image="<AWS_ACCOUNT_ID>.dkr.ecr.us-west-1.amazonaws.com/django-app:latest" \ --container-name django-app
You can use the same command to bump the Task Definition and update the Service.