DEV Community

Vivesh
Vivesh

Posted on

Understanding Blue-Green and Canary Deployments

In DevOps and continuous delivery, blue-green and canary deployments are strategies used to reduce downtime and minimize risk during application updates.


1. Blue-Green Deployment

Blue-green deployment involves maintaining two identical environments (Blue and Green).

How It Works:

  1. The blue environment is the current live version of the application.
  2. Updates or changes are made in the green environment, which mirrors the blue one.
  3. Once the green environment is tested and validated:
    • The traffic is switched from the blue environment to the green one.
  4. If issues arise, you can roll back by switching traffic back to the blue environment.

Advantages:

  • Zero downtime during deployment.
  • Easy rollback to the previous version.
  • Allows for extensive testing before exposing users to changes.

Challenges:

  • Requires double the infrastructure temporarily (both blue and green environments).
  • Can be expensive for resource-intensive applications.

2. Canary Deployment

Canary deployment involves rolling out changes to a small subset of users before exposing the entire user base.

How It Works:

  1. Deploy the new version to a small percentage of traffic (the "canary").
  2. Monitor key metrics such as:
    • Error rates
    • Latency
    • Performance
    • User feedback
  3. If no issues are detected, gradually increase the percentage of traffic to the new version.
  4. If problems arise, roll back to the previous version.

Advantages:

  • Gradual rollout reduces risks.
  • Real-world testing with minimal exposure.
  • Allows for faster feedback loops.

Challenges:

  • More complex to configure compared to blue-green deployment.
  • Requires strong monitoring and automation to analyze performance during rollout.

Key Differences

Aspect Blue-Green Canary
Deployment Style Entire environment is swapped. Gradual rollout to specific users.
Risk Mitigation Full rollback by switching traffic. Rollback for specific traffic only.
Infrastructure Requires duplicate environments. Uses same infrastructure.
Use Case Zero-downtime upgrades. Testing specific features/versions.

When to Use Each

Scenario Recommended Strategy
You need to deploy critical updates with zero downtime. Blue-Green Deployment
You want to test features incrementally on live traffic. Canary Deployment
Rollback speed is more important than gradual rollout. Blue-Green Deployment
You need to validate changes with a subset of real users. Canary Deployment

Real-World Example:

Blue-Green Deployment:

  • Scenario: An e-commerce website launches a major UI redesign.
  • Execution:
    • "Blue" is the current live version.
    • "Green" contains the redesign.
    • Once the green environment is tested, DNS is switched to route traffic to the green environment.

Canary Deployment:

  • Scenario: A streaming service tests a new video recommendation algorithm.
  • Execution:
    • New algorithm is rolled out to 5% of users initially.
    • Gradually increased to 50%, then 100%, based on performance and feedback.

Task: Implement a Blue-Green Deployment Strategy on Your Application


Step-by-Step Implementation of Blue-Green Deployment

1. Prerequisites

  • An application hosted on a cloud platform (e.g., AWS).
  • Existing infrastructure for deploying the application (e.g., EC2 instances, containers, or serverless functions).
  • A load balancer to route traffic between environments.
  • Proper monitoring tools to track application performance.

2. High-Level Architecture

  • Blue Environment: The live, stable version of your application currently serving all traffic.
  • Green Environment: The new version of your application, deployed and tested but not yet live.
  • Load Balancer: A central component that switches traffic between the blue and green environments.

3. Implementation on AWS

Here’s how you can achieve blue-green deployment using AWS services like Elastic Load Balancing (ELB) and EC2 instances.


Step 1: Set Up the Blue Environment

  1. Deploy the stable version of your application to EC2 instances in an Auto Scaling Group (ASG).
  2. Attach the EC2 instances to a target group (e.g., blue-target-group) behind an Application Load Balancer (ALB).

Step 2: Create the Green Environment

  1. Launch a new set of EC2 instances in a separate ASG for the green environment.
  2. Deploy the updated version of your application to these instances.
  3. Attach these instances to a new target group (e.g., green-target-group) behind the same ALB.

Step 3: Test the Green Environment

  1. Use ALB listeners to route a small percentage of traffic (or only internal testing traffic) to the green environment.
  2. Verify the application's functionality, performance, and reliability by testing against the green environment.

Step 4: Switch Traffic to the Green Environment

  1. Once testing is successful, update the ALB listener rules to send 100% of traffic to the green-target-group.
  2. Monitor metrics (e.g., latency, error rates, and user feedback) to ensure the green environment is functioning properly.

Step 5: Clean Up the Blue Environment

  1. After sufficient validation, terminate the EC2 instances in the blue environment.
  2. Keep the infrastructure configuration for the blue environment as a backup until you’re confident no rollback is needed.

Terraform Script for AWS Blue-Green Deployment

Here’s an example Terraform script to set up the blue-green deployment with ALB and EC2 instances.

provider "aws" {
  region = "us-east-1"
}

resource "aws_security_group" "app_sg" {
  name        = "app-sg"
  description = "Allow HTTP traffic"
  vpc_id      = "vpc-xxxxxxxx"

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

resource "aws_lb" "app_lb" {
  name               = "blue-green-alb"
  internal           = false
  load_balancer_type = "application"
  security_groups    = [aws_security_group.app_sg.id]
  subnets            = ["subnet-xxxxxxxx", "subnet-yyyyyyyy"]

  enable_deletion_protection = false
}

resource "aws_lb_target_group" "blue" {
  name        = "blue-target-group"
  port        = 80
  protocol    = "HTTP"
  vpc_id      = "vpc-xxxxxxxx"
  target_type = "instance"
}

resource "aws_lb_target_group" "green" {
  name        = "green-target-group"
  port        = 80
  protocol    = "HTTP"
  vpc_id      = "vpc-xxxxxxxx"
  target_type = "instance"
}

resource "aws_lb_listener" "app_listener" {
  load_balancer_arn = aws_lb.app_lb.arn
  port              = 80
  protocol          = "HTTP"

  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.blue.arn
  }
}

resource "aws_instance" "blue_instances" {
  count         = 2
  ami           = "ami-xxxxxxxx"
  instance_type = "t2.micro"
  security_groups = [aws_security_group.app_sg.name]

  tags = {
    Name = "blue-instance-${count.index}"
  }
}

resource "aws_instance" "green_instances" {
  count         = 2
  ami           = "ami-yyyyyyyy"
  instance_type = "t2.micro"
  security_groups = [aws_security_group.app_sg.name]

  tags = {
    Name = "green-instance-${count.index}"
  }
}

resource "aws_lb_target_group_attachment" "blue_targets" {
  count             = 2
  target_group_arn  = aws_lb_target_group.blue.arn
  target_id         = aws_instance.blue_instances[count.index].id
  port              = 80
}

resource "aws_lb_target_group_attachment" "green_targets" {
  count             = 2
  target_group_arn  = aws_lb_target_group.green.arn
  target_id         = aws_instance.green_instances[count.index].id
  port              = 80
}
Enter fullscreen mode Exit fullscreen mode

4. Key Metrics to Monitor

  • Latency: Ensure response times are within acceptable limits.
  • Error Rates: Monitor for increased 4xx or 5xx errors.
  • User Feedback: Gather feedback to identify potential issues.

5. Rollback Plan

  • If the green environment encounters issues:
    1. Update the ALB listener rules to route traffic back to the blue-target-group.
    2. Investigate and resolve the issues in the green environment.

Benefits of Blue-Green Deployment

  1. Zero downtime during deployment.
  2. Seamless rollback in case of failure.
  3. Risk-free testing of new updates.

Happy Learning !!!

Top comments (0)