Deploying to Amazon ECS with Fargate
This guide will walk you through deploying your SolidX application to Amazon Elastic Container Service (ECS) with Fargate, a serverless compute engine that allows you to run containers without managing the underlying infrastructure.
Info
Before you begin, make sure you have an AWS account, the AWS CLI installed and configured, and Docker running on your local machine.
1. Containerize and Push to ECR
First, we need to containerize our application and push the images to Amazon Elastic Container Registry (ECR).
Create ECR Repositories
Create ECR repositories for both the backend and frontend:
aws ecr create-repository --repository-name solidx-api --region <your-region>
aws ecr create-repository --repository-name solidx-ui --region <your-region>
Authenticate Docker to ECR
Authenticate your Docker client to your ECR registry:
aws ecr get-login-password --region <your-region> | docker login --username AWS --password-stdin <your-aws-account-id>.dkr.ecr.<your-region>.amazonaws.com
Build, Tag, and Push Images
Build, tag, and push the Docker images for both services.
Backend (solidx-api):
cd solid-api
docker build -t <your-aws-account-id>.dkr.ecr.<your-region>.amazonaws.com/solidx-api:latest .
docker push <your-aws-account-id>.dkr.ecr.<your-region>.amazonaws.com/solidx-api:latest
Frontend (solidx-ui):
cd ../solid-ui
docker build -t <your-aws-account-id>.dkr.ecr.<your-region>.amazonaws.com/solidx-ui:latest .
docker push <your-aws-account-id>.dkr.ecr.<your-region>.amazonaws.com/solidx-ui:latest
2. Set Up ECS Resources
Now, let's create the necessary ECS resources to run our application.
Create an ECS Cluster
Create an ECS cluster to host your services:
aws ecs create-cluster --cluster-name solidx-cluster --region <your-region>
Create Task Definitions
Create task definitions for the backend and frontend. A task definition is a blueprint for your application.
Create a solidx-api-task-definition.json file:
{
"family": "solidx-api-task",
"networkMode": "awsvpc",
"containerDefinitions": [
{
"name": "solidx-api",
"image": "<your-aws-account-id>.dkr.ecr.<your-region>.amazonaws.com/solidx-api:latest",
"portMappings": [
{
"containerPort": 3000,
"hostPort": 3000
}
],
"essential": true
}
],
"requiresCompatibilities": [
"FARGATE"
],
"cpu": "256",
"memory": "512"
}
And a solidx-ui-task-definition.json file:
{
"family": "solidx-ui-task",
"networkMode": "awsvpc",
"containerDefinitions": [
{
"name": "solidx-ui",
"image": "<your-aws-account-id>.dkr.ecr.<your-region>.amazonaws.com/solidx-ui:latest",
"portMappings": [
{
"containerPort": 3001,
"hostPort": 3001
}
],
"essential": true
}
],
"requiresCompatibilities": [
"FARGATE"
],
"cpu": "256",
"memory": "512"
}
Now, register the task definitions with ECS:
aws ecs register-task-definition --cli-input-json file://solidx-api-task-definition.json --region <your-region>
aws ecs register-task-definition --cli-input-json file://solidx-ui-task-definition.json --region <your-region>
3. Create Services and Load Balancer
We will create an Application Load Balancer (ALB) to route traffic to our services.
Create an ALB and Target Groups
- Create a security group for your ALB.
- Create an Application Load Balancer.
- Create target groups for
solidx-apiandsolidx-ui. - Create listeners for your ALB to forward traffic to the target groups (e.g., port 80 and 443).
Create ECS Services
Create the services that will run and maintain your tasks.
Create a solidx-api-service.json file:
{
"cluster": "solidx-cluster",
"serviceName": "solidx-api-service",
"taskDefinition": "solidx-api-task",
"desiredCount": 1,
"launchType": "FARGATE",
"networkConfiguration": {
"awsvpcConfiguration": {
"subnets": ["<your-subnet-id-1>", "<your-subnet-id-2>"],
"securityGroups": ["<your-security-group-id>"],
"assignPublicIp": "ENABLED"
}
},
"loadBalancers": [
{
"targetGroupArn": "<your-api-target-group-arn>",
"containerName": "solidx-api",
"containerPort": 3000
}
]
}
And a solidx-ui-service.json file:
{
"cluster": "solidx-cluster",
"serviceName": "solidx-ui-service",
"taskDefinition": "solidx-ui-task",
"desiredCount": 1,
"launchType": "FARGATE",
"networkConfiguration": {
"awsvpcConfiguration": {
"subnets": ["<your-subnet-id-1>", "<your-subnet-id-2>"],
"securityGroups": ["<your-security-group-id>"],
"assignPublicIp": "ENABLED"
}
},
"loadBalancers": [
{
"targetGroupArn": "<your-ui-target-group-arn>",
"containerName": "solidx-ui",
"containerPort": 3001
}
]
}
Now, create the services:
aws ecs create-service --cli-input-json file://solidx-api-service.json --region <your-region>
aws ecs create-service --cli-input-json file://solidx-ui-service.json --region <your-region>
4. Verify Your Deployment
Once the services are running, you can access your application through the DNS name of your Application Load Balancer. You can find the DNS name in the EC2 console under "Load Balancers".
Congratulations! You have successfully deployed your SolidX application to Amazon ECS with Fargate.