Migracja do chmury AWS

Migracja do chmury AWS

Przeniesienie infrastruktury sklepu internetowego do AWS z optymalizacją kosztów i wydajności.

Wyzwanie

Firma e-commerce borykała się z następującymi problemami: • Częste przestoje podczas szczytów sprzedażowych (Black Friday, promocje) • Wysokie koszty utrzymania dedykowanego serwera • Brak automatycznego skalowania i redundancji • Długi czas wdrażania nowych funkcji (ponad 2 godziny) • Problemy z wydajnością bazy danych podczas dużego ruchu

Rozwiązanie

Zaprojektowaliśmy i wdrożyliśmy nowoczesną architekturę w AWS: 1. Infrastruktura jako kod (Terraform): • Automatyczne tworzenie i zarządzanie zasobami • Wersjonowanie infrastruktury • Możliwość szybkiego odtworzenia środowiska 2. Architektura wysokiej dostępności: • Multi-AZ deployment dla zwiększenia niezawodności • Auto Scaling Group dla aplikacji • RDS Multi-AZ dla bazy danych • ElastiCache dla sesji i cache 3. Optymalizacja wydajności: • CloudFront CDN dla statycznych zasobów • Route 53 z GeoDNS dla routingu ruchu • Application Load Balancer z SSL termination • S3 dla przechowywania mediów 4. Monitoring i bezpieczeństwo: • CloudWatch z niestandardowymi metrykami • AWS WAF dla ochrony przed atakami • VPC z podziałem na prywatne i publiczne subnety • Automatyczne backupy i disaster recovery

Rezultaty

  • Redukcja kosztów infrastruktury o 35% dzięki optymalizacji zasobów i auto-scaling
  • Zwiększenie dostępności do 99.99% poprzez multi-AZ deployment
  • Automatyczne skalowanie obsługujące 10x większy ruch w szczytach
  • Skrócenie czasu wdrażania zmian z 2 godzin do 15 minut
  • Zmniejszenie średniego czasu ładowania strony o 60%
  • Redukcja obciążenia bazy danych o 45% dzięki cachowaniu

Technologie

AWSTerraformDockerNginxCloudFrontRDSElastiCache

Przykłady implementacji

Konfiguracja Auto Scaling Group w Terraform

resource "aws_autoscaling_group" "web" {
  name                = "web-asg"
  desired_capacity    = 2
  max_size           = 4
  min_size           = 1
  target_group_arns  = [aws_lb_target_group.web.arn]
  vpc_zone_identifier = aws_subnet.private[*].id

  launch_template {
    id      = aws_launch_template.web.id
    version = "$Latest"
  }

  tag {
    key                 = "Environment"
    value               = "production"
    propagate_at_launch = true
  }
}

resource "aws_autoscaling_policy" "web_scale_up" {
  name                   = "web_scale_up"
  scaling_adjustment     = 1
  adjustment_type       = "ChangeInCapacity"
  cooldown              = 300
  autoscaling_group_name = aws_autoscaling_group.web.name
}

resource "aws_cloudwatch_metric_alarm" "high_cpu" {
  alarm_name          = "high-cpu-utilization"
  comparison_operator = "GreaterThanThreshold"
  evaluation_periods  = "2"
  metric_name        = "CPUUtilization"
  namespace          = "AWS/EC2"
  period             = "300"
  statistic          = "Average"
  threshold          = "75"
  alarm_description  = "Scale up if CPU > 75%"
  alarm_actions      = [aws_autoscaling_policy.web_scale_up.arn]
}

Konfiguracja CloudFront z S3

resource "aws_s3_bucket" "static_assets" {
  bucket = "my-static-assets"
}

resource "aws_cloudfront_distribution" "s3_distribution" {
  origin {
    domain_name = aws_s3_bucket.static_assets.bucket_regional_domain_name
    origin_id   = "S3-static-assets"

    s3_origin_config {
      origin_access_identity = aws_cloudfront_origin_access_identity.default.cloudfront_access_identity_path
    }
  }

  enabled             = true
  is_ipv6_enabled     = true
  default_root_object = "index.html"

  default_cache_behavior {
    allowed_methods  = ["GET", "HEAD", "OPTIONS"]
    cached_methods   = ["GET", "HEAD"]
    target_origin_id = "S3-static-assets"

    forwarded_values {
      query_string = false
      cookies {
        forward = "none"
      }
    }

    viewer_protocol_policy = "redirect-to-https"
    min_ttl                = 0
    default_ttl            = 3600
    max_ttl                = 86400
  }

  price_class = "PriceClass_100"

  restrictions {
    geo_restriction {
      restriction_type = "none"
    }
  }

  viewer_certificate {
    cloudfront_default_certificate = true
  }
}