kloia Blog

Using AWS Fargate for Efficient CI/CD Pipelines

Written by Enes Cetinkaya | Sep 27, 2023 7:23:56 AM

In today's world, accelerating the application development process, reducing infrastructure management costs, and optimizing resource utilization are paramount. AWS Fargate, a service provided by Amazon Web Services (AWS), is an excellent serverless computing tool that addresses these needs.

What is it?

Fargate is a serverless service that simplifies running container-based applications by removing the need for infrastructure management. It integrates seamlessly with AWS's Elastic Container Service (ECS) and Elastic Kubernetes Service (EKS).

Why Should We Use It?

Conventional infrastructure management is time-consuming and intricate. With Fargate, you can execute your applications directly in containers without the hassles of server management, capacity planning, or patch management.

Benefits of Fargate

  • Automatic Scaling: Adjusts to the traffic inflow and outflow of your application automatically.
  • Maximum Security: Leveraging AWS's robust security model, each container runs in isolation.
  • Cost Optimization: The pay-as-you-go model means you only pay for the resources you use.

Fargate and CI/CD Integration

AWS's CI/CD tools integrate easily with Fargate. Specifically, AWS CodeBuild automates the tasks of compiling, testing, and containerizing your application. This integration makes the development process faster, more consistent, and secure.

 

Step-by-Step CI/CD Setup:

  1. Source Codes and buildspec.yml: First, you set up the source codes and the buildspec.yml file in our GitHub repo.
  2. CodeBuild Integration: AWS CodeBuild reads the buildspec.yml and manages the application's compilation, testing, and Docker container image creation.
  3. Uploading Docker Image to ECR: Post compilation, the Docker image is uploaded to the Amazon Elastic Container Registry (ECR). ECR safely stores Docker images, granting access when required.
  4. Fargate Deployment: The final step involves running the container image on Fargate. Here, task definitions and Fargate profiles specify how the application operates and its resource use.

 


version: 0.2

env:
variables:
REPO_URI: "11111111111.dkr.ecr.eu-central-1.amazonaws.com/example-reponame"
TASK_FAMILY: "example-definition-name"
TASK_ROLE_ARN: "arn:aws:iam::11111111111:role/ecsTaskExecutionRole"
CPU: "1024"
MEMORY: "3072"
CONTAINER_NAME: "example-containername"
CONTAINER_PORT: "80"
LOG_GROUP: "/example/loggroup"
LOG_REGION: "eu-central-1"

phases:
install:
commands:
- apt-get update
- apt-get install -y jq

pre_build:
commands:
- echo Cloning repository...
- git clone https://@github.com/username/repo_name.git
- cd repo_name
- echo Logging in to Amazon ECR...
- aws ecr get-login-password --region eu-central-1 | docker login --username AWS --password-stdin 11111111111.dkr.ecr.eu-central-1.amazonaws.com
- COMMIT_HASH=$(git log --format="%H" -n 1)
- IMAGE_TAG=$(echo $COMMIT_HASH | cut -c 1-7)

build:
commands:
- echo Build started on `date`
- echo Building the Docker image...
- docker build -t $REPO_URI:$IMAGE_TAG .
- echo Pushing the Docker image...
- docker push $REPO_URI:$IMAGE_TAG

post_build:
commands:
- echo Registering ECS Task Definition...
- |
aws ecs register-task-definition \
--family $TASK_FAMILY \
--container-definitions "[{
\"name\": \"$CONTAINER_NAME\",
\"image\": \"$REPO_URI:$IMAGE_TAG\",
\"cpu\": $CPU,
\"portMappings\": [{
\"containerPort\": $CONTAINER_PORT,
\"hostPort\": $CONTAINER_PORT,
\"protocol\": \"tcp\"
}],
\"essential\": true,
\"logConfiguration\": {
\"logDriver\": \"awslogs\",
\"options\": {
\"awslogs-group\": \"$LOG_GROUP\",
\"awslogs-region\": \"$LOG_REGION\",
\"awslogs-stream-prefix\": \"ecs\"
}
}
}]" \
--requires-compatibilities FARGATE \
--network-mode awsvpc \
--cpu $CPU \
--memory $MEMORY \
--execution-role-arn $TASK_ROLE_ARN \
--query 'taskDefinition.taskDefinitionArn' \
--output text
- echo Update to Fargate image version...
- aws ecs update-service --cluster example-clustername --service example-service --task-definition example-definition-name --output text

 

Fargate and Running Concurrent Tasks

AWS Fargate offers the capability to run tasks concurrently, a feature particularly useful for applications that require parallel processing or need to handle multiple requests at the same time. For instance, if your application involves batch processing, data analytics, or real-time monitoring, you can distribute the workload across multiple tasks to accelerate the process.

  • Task Definitions: Create a task definition in ECS that outlines the Docker container and the resources it will use. Be sure to specify the CPU and memory requirements carefully to optimize resource utilization.
  • Service Configuration: When creating or updating a service, you can specify the desired number of tasks to run concurrently. This is done by setting the "Number of tasks" in the service definition.

These features can significantly boost the efficiency and responsiveness of your application. However, the advantages of running tasks concurrently come with challenges such as potential data inconsistency and increased complexity in debugging and monitoring. Therefore, it's crucial to implement proper synchronization and error-handling mechanisms.

Limitations of AWS Fargate

  • Resource Limitations: While Fargate does abstract away the underlying infrastructure, there are limits to the CPU and memory configurations you can assign to your tasks. Tasks can use a maximum of 4 vCPUs and 30GB of memory.
  • Cost Considerations: Although Fargate might seem cost-effective initially, for workloads that run 24/7, it might end up being costlier than running an EC2 instance, especially if not optimized properly. It's essential to monitor and adjust resource configurations to ensure cost-effectiveness.
  • No Persistent Storage: Fargate doesn't support persistent storage. So, if your containers need to store data permanently, you'll need to use an external storage solution like Amazon S3 or a managed database service.
  • Slower Startup Time: Fargate tasks might take a bit longer to start than tasks on ECS with EC2 as the launch type, especially if they need to pull large Docker images.
  • Region Availability: Fargate might not be available in all AWS regions. Therefore, ensure it's available in your desired region before architecting a solution around it.
  • Less Customizability: Since Fargate abstracts away the infrastructure layer, you get less control over the underlying resources. For some advanced use-cases, this lack of control might be restrictive.

Conclusion and Future Trends

AWS Fargate offers a perfect solution for organizations aiming to streamline modern application development processes in a simple, swift, and cost-effective manner. Removing the complexities of infrastructure management, it enables developers to focus on their primary task - coding the application.

With the shift towards more serverless and cloud-native solutions, it's evident that services like AWS Fargate will become even more important. This evolving trend is set to redefine the methods of application development and deployment, marking a significant shift in the realm of cloud computing.