Hi Folks!
This is the first blog of the series Dockerize Your Application.
In the age of microservices we want our application code and requirements to be packed in an image and use that in a suitable container orchestration tool for better scalability and availability.
Pre-Requisites:
- An EC2 Server with git and docker installed
- Amazon ECR Repository
- AWS CLI configured on your server with sufficient permissions (to push image to ecr) or you can attach a role to your server with sufficient permissions.
- Region: Mumbai(ap-south-1)
About the API
It's a todo app with two API's one to get the list of to-do tasks and another to post your tasks.
GET-POST api path - /todo/api/v1.0/tasks
Source: [Flask_API_App]
Dockerfile
FROM alpine:latest
RUN apk add py3-pip
RUN pip3 install flask
WORKDIR /home
COPY app.py .
EXPOSE 80
ENTRYPOINT ["/usr/bin/flask","run"]
CMD ["--host=0.0.0.0", "--port=80"]
Login to your EC2 Server and clone the repo
git clone -b collate https://github.com/RajitPaul11/AWS_workshop_2022_data.git
Change directory and build docker image
cd AWS_workshop_2022_data/python_flask_code_in_aws_linux_restful_GET_POST
docker build -t flask_api_app:v1 .
Tag your docker image
docker tag flask_api_app:v1 youraccountID.dkr.ecr.ap-south-1.amazonaws.com/flask_api_app:v1
Login to your ECR Repo
aws ecr get-login-password --region ap-south-1 | docker login --username AWS --password-stdin youraccountID.dkr.ecr.ap-south-1.amazonaws.com
Push the docker image
docker push youraccountID.dkr.ecr.ap-south-1.amazonaws.com/flask_api_app:v1
Deploy to ECS
Select Services and then select ECS
Create an ECS Cluster
We shall be creating an ECS Cluster with EC2
Cluster Config
Choose a suitable name for your cluster, and select a provisioning model, in this case we shall go for Spot.
Choose diversified spot instance allocation strategy so the instances are spread across az's.
Select two instance types on a or basis.
Specify the Storage spec and select an existing key pair, so that you can ssh later to the EC2 instance and do some modification or troubleshoot from the terminal.
Create a new VPC or you can select an existing VPC.
Create a Task Definition
Select the launch type as EC2
Provide a suitable task def name, and select the Task Role and network mode (we shall be looking into the different network modes in an upcoming blog, for now let's go ahead with bridge), select a task execution role.
Allocate sufficient task memory and cpu based on your application requirements.
Add a container
Provide a container name and the ecr repo uri along with the version, you can set hard limit for the container in case you have set the task cpu and memory req this is not required, if you want dynamic port mapping, keep the host port as 0, in this case we have set it to 80 same as the container port
As per requirement you can explore advanced details and set container healthcheck, container timeouts, storage, logging and more.
Create a Service
Select the launch type as EC2, select your task definition and it's version you can see the latest suffix to denote the latest version, select your cluster and provide a suitable service name, select a service type (in this case we shall go with replica), provide the number of tasks you want to run (keep in mind the instance type you chose and the resource allocated to each task while you designate the number of tasks)
Select the deployment strategy (we shall go into depth on this in an upcoming blog, in this case we choose Rolling Update), select a Task Placement strategy (AZ Balanced spread will help to spread tasks across instances in different AZ's for high availability)
Configure a Load Balancer
Select your load balancer type(in this case we choose application load balancer), Create a new service IAM role, and select your existing Load Balancer.
In your target group you can register the existing ECS instance, and set the health check path as /todo/api/v1.0/tasks
If you want to scale your tasks you can enable autoscaling, in this case we do not want to scale our tasks so we won't enable auto scaling.
Select your listener, target group name for the Load Balancer and rest shall be populated
Service Created and Task Running!
Test API using ALB URL
GET Request
PUT Request
If you have any queries you can connect with me on LinkedIn
Top comments (0)