Terraform ile AWS Altyapı Otomasyonu: Ölçeklenebilir ve Güvenli Dağıtımlar

 · 

Terraform ile AWS Altyapı Otomasyonu: Ölçeklenebilir ve Güvenli Dağıtımlar

Terraform ile AWS Altyapı Otomasyonu: Ölçeklenebilir ve Güvenli Dağıtımlar

AWS bulut altyapısını manuel olarak yönetmek, büyüyen ortamlar için sürdürülemez bir yüktür. Kaynakların tutarsız yapılandırılması, dağıtım hataları ve operasyonel gecikmeler, manuel süreçlerin doğal sonuçlarıdır. Terraform, bu karmaşıklığı ortadan kaldırarak, AWS altyapınızı kod olarak (Infrastructure as Code - IaC) tanımlamanızı, sağlamanızı ve sürdürmenizi sağlayan deklaratif bir araçtır. Bu yaklaşım, öngörülebilir, tekrarlanabilir ve ölçeklenebilir bulut dağıtımlarının temelini oluşturur.

Terraform Neden AWS İçin Vazgeçilmezdir?

Terraform'un AWS ile entegrasyonu, altyapı yönetiminde önemli avantajlar sunar:

  • Deklaratif Yapı: Kaynakların nasıl oluşturulacağını değil, son durumlarının ne olması gerektiğini belirtirsiniz. Terraform, mevcut durumu hedef durumla eşleştirmek için gerekli adımları otomatik olarak belirler ve uygular.
  • İdempotans: Bir Terraform yapılandırmasını birden çok kez çalıştırmak, her seferinde aynı sonucu verir. Bu, altyapınızın tutarlı kalmasını garanti eder.
  • Durum Yönetimi (State Management): Terraform, dağıtılan kaynakların durumunu bir .tfstate dosyasında saklar. Bu dosya, Terraform'un AWS'teki gerçek durumu ile yapılandırma dosyasındaki tanımlar arasındaki farkları izlemesine olanak tanır.

AWS ile çalışmaya başlamak için basit bir sağlayıcı (provider) yapılandırması:

provider "aws" {
  region = "eu-central-1" # Frankfurt bölgesi
  # assume_role blokunu ekleyerek birden fazla AWS hesabını veya IAM rolünü yönetebilirsiniz
  # assume_role {
  #   role_arn = "arn:aws:iam::123456789012:role/TerraformAdminRole"
  # }
}

Yukarıdaki blok, Terraform'a AWS ile iletişim kurması için gerekli bilgiyi sağlar. Genellikle kimlik doğrulama, ortam değişkenleri (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) veya AWS CLI yapılandırma dosyaları üzerinden otomatik olarak gerçekleşir.

Temel Terraform Kavramları ve AWS Uygulamaları

Terraform, çeşitli blok türleri aracılığıyla altyapıyı tanımlar:

  • Providers: AWS gibi bulut sağlayıcılarla etkileşimi yönetir.
  • Resources: Yaratılacak, güncellenecek veya silinecek AWS kaynaklarını (VPC, EC2, S3 kovası vb.) tanımlar.
  • Data Sources: Mevcut AWS kaynaklarından bilgi çekmek için kullanılır. Örneğin, mevcut bir AMI ID'sini dinamik olarak almak.
  • Variables: Yapılandırmanıza dinamik değerler eklemenizi sağlar, böylece farklı ortamlar için aynı kodu kullanabilirsiniz.
  • Outputs: Dağıtım sonrası önemli bilgileri (ELB DNS adı, VPC ID vb.) görüntülemek veya diğer Terraform yapılandırmalarına aktarmak için kullanılır.

Basit bir AWS VPC ve iki alt ağ tanımlaması:

resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
  enable_dns_hostnames = true
  tags = {
    Name = "main-vpc"
    Environment = var.environment
  }
}

resource "aws_subnet" "public" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.1.0/24"
  availability_zone = "${var.aws_region}a"
  map_public_ip_on_launch = true
  tags = {
    Name = "public-subnet-a"
  }
}

resource "aws_subnet" "private" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.2.0/24"
  availability_zone = "${var.aws_region}a"
  tags = {
    Name = "private-subnet-a"
  }
}

variable "environment" {
  description = "Dağıtım ortamı (dev, staging, prod)"
  type        = string
  default     = "dev"
}

variable "aws_region" {
  description = "AWS Bölgesi"
  type        = string
  default     = "eu-central-1"
}

Bu örnek, bir VPC ve iki farklı kullanım amacı için alt ağları tanımlar. var.environment ve var.aws_region gibi değişkenler, kodun yeniden kullanılabilirliğini artırır.

Gerçek Üretim Senaryosu: Otomatik Ölçeklenen Yüksek Erişilebilirliğe Sahip Web Uygulaması Altyapısı

Bir e-ticaret platformunun yoğun trafik beklentisiyle tasarlanmış altyapısı, Terraform'un gücünü gösterir. Platformun, talep arttığında otomatik olarak ölçeklenmesi, veri tabanı erişilebilirliğini koruması ve statik varlıkları verimli bir şekilde sunması gerekmektedir.

Altyapı Bileşenleri:

  • VPC ve Alt Ağlar: Genel (public) alt ağlarda Load Balancer ve NAT Gateway, özel (private) alt ağlarda EC2 web sunucuları ve RDS veri tabanları.
  • Internet Gateway (IGW) ve NAT Gateway: Genel alt ağların internete çıkışını ve özel alt ağlardaki kaynakların internete erişimini sağlar.
  • Application Load Balancer (ALB): Gelen web trafiğini otomatik ölçeklenen EC2 web sunucularına dağıtır.
  • Auto Scaling Group (ASG) ve Launch Template: EC2 örneklerini belirli ölçütlere göre (CPU kullanımı, ağ trafiği vb.) otomatik olarak başlatır veya sonlandırır. Launch Template, ASG tarafından başlatılacak EC2 örneklerinin yapılandırmasını (AMI, örnek tipi, kullanıcı verileri vb.) tanımlar.
  • Amazon RDS (PostgreSQL): Çoklu Erişilebilirlik Alanı (Multi-AZ) kurulumu ile yüksek erişilebilirlik ve veri yedekliliği sağlar. Özel alt ağlarda barındırılır.
  • Amazon S3: Statik web varlıklarını (resimler, CSS, JS) ve uygulama günlüklerini barındırmak için kullanılır.

ASG için bir Launch Template tanımı:

resource "aws_launch_template" "web_app_template" {
  name_prefix   = "web-app-template"
  image_id      = data.aws_ami.latest_amazon_linux.id # Dinamik AMI ID
  instance_type = "t3.medium"
  key_name      = "my-ssh-key-pair"
  vpc_security_group_ids = [aws_security_group.web_sg.id]
  user_data     = base64encode(file("install_web_server.sh")) # Başlangıç komut dosyası

  block_device_mappings {
    device_name = "/dev/xvda"
    ebs {
      volume_size = 30
      volume_type = "gp2"
    }
  }

  tag_specifications {
    resource_type = "instance"
    tags = {
      Name = "web-server"
      Environment = var.environment
    }
  }
}

data "aws_ami" "latest_amazon_linux" {
  most_recent = true
  owners      = ["amazon"]
  filter {
    name   = "name"
    values = ["amzn2-ami-hvm-*-x86_64-gp2"]
  }
}

Bu Launch Template, en son Amazon Linux 2 AMI'sini kullanarak t3.medium tipinde EC2 örneklerinin nasıl başlatılacağını tanımlar. user_data ile web sunucusu yazılımının otomatik kurulumu sağlanır.

Ardından, bu Launch Template'i kullanan bir Auto Scaling Group:

resource "aws_autoscaling_group" "web_app_asg" {
  name                      = "web-app-asg"
  vpc_zone_identifier       = [aws_subnet.private.id, aws_subnet.private_b.id] # Özel alt ağlar
  desired_capacity          = 2
  max_size                  = 5
  min_size                  = 2
  health_check_type         = "ELB"
  health_check_grace_period = 300 # Saniye

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

  tag {
    key                 = "Name"
    value               = "web-app-instance"
    propagate_at_launch = true
  }

  lifecycle {
    create_before_destroy = true
  }

  target_group_arns = [aws_lb_target_group.web_app_tg.arn] # ALB Hedef Grubu
}

Bu ASG tanımı, web sunucularının özel alt ağlarda, en az 2, en fazla 5 örnekle çalışmasını sağlar ve trafik yüküne göre otomatik ölçeklenir. ALB'nin hedef grubuna entegre edilerek trafik dağıtımını üstlenir.

Durum Yönetimi ve Ekip Çalışması İçin Uzak Backend

Terraform'un .tfstate dosyası, altyapınızın "gerçeğin kaynağı"dır. Ekip ortamlarında bu dosyanın yerel makinelerde kalması, çakışmalara ve tutarsız durumlara yol açar. Bu nedenle, durumu merkezi ve güvenli bir konumda saklamak kritik öneme sahiptir. AWS S3 kovası ve DynamoDB tablosu bu amaçla en yaygın kullanılan kombinasyondur.

terraform {
  backend "s3" {
    bucket         = "my-terraform-state-bucket-52394"
    key            = "prod/web-app/terraform.tfstate"
    region         = "eu-central-1"
    encrypt        = true
    dynamodb_table = "terraform-lock-table"
  }
}

Bu yapılandırma, Terraform durumunu şifreli bir S3 kovasında saklar ve DynamoDB kullanarak durum dosyasını kilitler. Bu, aynı anda birden fazla geliştiricinin Terraform çalıştırmasını engeller ve durum bozulmalarını önler.

Modüllerle Yeniden Kullanılabilirlik ve Abstraksiyon

Büyük AWS altyapılarında, tekrarlayan kaynak bloklarını yönetmek zaman alıcı ve hataya açık olabilir. Terraform modülleri, ilgili kaynakları bir araya getirerek soyutlama ve yeniden kullanılabilirlik sağlar. Örneğin, sıkça kullanılan bir VPC yapısını, bir veritabanı grubunu veya bir web sunucusu kümesini modül olarak tanımlayabilirsiniz.

Örnek bir VPC modülü kullanımı:

module "app_vpc" {
  source = "./modules/vpc" # Yerel bir modül
  # source = "git::https://example.com/vpc-module.git?ref=v1.0.0" # Uzak bir modül

  project_name = "ECommerceApp"
  environment  = var.environment
  vpc_cidr     = "10.10.0.0/16"
  public_subnets  = ["10.10.1.0/24", "10.10.2.0/24"]
  private_subnets = ["10.10.10.0/24", "10.10.11.0/24"]
  database_subnets = ["10.10.20.0/24", "10.10.21.0/24"]
}

Bu yaklaşım, kod tekrarını azaltır, kod tabanını daha okunabilir hale getirir ve altyapı bileşenlerinin standartlaştırılmasını kolaylaştırır.

Güvenlik Entegrasyonları: IAM ve Güvenlik Grupları

AWS'te güvenlik, her altyapı tasarımının temelidir. Terraform, IAM (Identity and Access Management) rolleri, politikaları ve güvenlik gruplarını kod olarak tanımlayarak, güvenlik duruşunuzu güçlendirir. Bu, güvenlik politikalarının sürüm kontrolüne alınmasını ve dağıtımlarla birlikte otomatik olarak uygulanmasını sağlar.

Bir web sunucusu için güvenlik grubu tanımı:

resource "aws_security_group" "web_sg" {
  name        = "web-server-security-group"
  description = "Web sunucusu için trafik kuralları"
  vpc_id      = aws_vpc.main.id

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"] # HTTP trafiğine açık
  }

  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"] # HTTPS trafiğine açık
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1" # Tüm giden trafiğe izin ver
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = {
    Name = "web-sg"
  }
}

Bu güvenlik grubu, web sunucularının HTTP ve HTTPS portlarından gelen tüm trafiklere izin verirken, giden trafiği kısıtlamaz. Gerçek üretim ortamlarında, giden trafiği de minimum yetki prensibine göre kısıtlamak esastır.

Terraform ile AWS altyapı otomasyonu, karmaşık bulut ortamlarının yönetimini basitleştirir, insan hatasını minimize eder ve operasyonel verimliliği artırır. Kod olarak altyapı yaklaşımı, DevOps kültürünün temel taşlarından biridir ve modern bulut dağıtımları için vazgeçilmez bir araçtır.

← Blog Listesine Dön