Altyapı Kodu (IaC) Nedir?
Altyapı Kodu (Infrastructure as Code - IaC), BT altyapısını kod olarak tanımlama ve yönetme pratiğidir. Bu yaklaşım, sunucular, ağlar, depolama sistemleri ve diğer BT bileşenlerinin manuel olarak yapılandırılması yerine, kod kullanılarak tanımlanmasını ve otomatik olarak oluşturulmasını sağlar.
IaC, DevOps ve bulut bilişim çağında kritik bir bileşen haline gelmiştir. Tekrarlanabilirlik, tutarlılık, ölçeklenebilirlik ve sürüm kontrolü sağlayarak, BT altyapısının daha güvenilir ve verimli bir şekilde yönetilmesine olanak tanır.
IaC'nin Temel Prensipleri
- Kod Olarak Altyapı
- İdempotent Operasyonlar
- Sürüm Kontrolü
- Tekrarlanabilirlik
- Test Edilebilirlik
IaC Yaklaşımları
Deklaratif Yaklaşım
Deklaratif yaklaşım, altyapının istenen durumunu tanımlar ve bu duruma nasıl ulaşılacağını belirtmez. Sistem, mevcut durumu istenen durumla karşılaştırır ve gerekli değişiklikleri yapar.
Örnekler: Terraform, AWS CloudFormation, Azure Resource Manager
Avantajlar:
- İdempotent operasyonlar
- Durum yönetimi
- Daha az yan etki
Emperatif Yaklaşım
Emperatif yaklaşım, altyapının istenen durumuna ulaşmak için adım adım talimatlar belirtir. Sistem, bu talimatları sırayla uygular.
Örnekler: Chef, Puppet, Ansible (kısmen)
Avantajlar:
- Daha fazla kontrol
- Karmaşık işlemleri daha kolay ifade etme
- Mevcut sistemleri daha kolay yönetme
Popüler IaC Araçları
Terraform
HashiCorp tarafından geliştirilen açık kaynaklı bir IaC aracı. Bulut ve on-premise altyapıyı tanımlamak ve oluşturmak için kullanılır.
Özellikler:
- Deklaratif dil (HCL)
- Sağlayıcı ekosistemi
- Durum yönetimi
- Plan ve uygulama aşamaları
Ansible
Red Hat tarafından geliştirilen açık kaynaklı bir yapılandırma yönetimi aracı. Ajantsız mimarisi ve YAML tabanlı yapılandırma dosyaları ile bilinir.
Özellikler:
- Ajantsız mimari
- YAML tabanlı playbook'lar
- Geniş modül kütüphanesi
- Basit ve öğrenmesi kolay
AWS CloudFormation
AWS'nin IaC çözümü. AWS kaynaklarını JSON veya YAML formatında tanımlar ve oluşturur.
Özellikler:
- AWS entegrasyonu
- Stack kavramı
- Değişken ve çıktı yönetimi
- Drift tespiti
IaC'nin Faydaları
Tekrarlanabilirlik
IaC, altyapı oluşturma sürecini tekrarlanabilir hale getirir. Aynı kod, aynı altyapıyı her seferinde aynı şekilde oluşturur.
Tutarlılık
IaC, farklı ortamlar (geliştirme, test, üretim) arasında tutarlılık sağlar. Bu, "benim makinemde çalışıyor" sorununu ortadan kaldırır.
Hız ve Verimlilik
IaC, altyapı oluşturma ve yapılandırma süreçlerini otomatikleştirir. Bu, manuel süreçlere göre çok daha hızlı ve verimlidir.
Sürüm Kontrolü
IaC, altyapı değişikliklerinin sürüm kontrolü altında tutulmasını sağlar. Bu, değişikliklerin izlenmesini, geri alınmasını ve denetlenmesini kolaylaştırır.
Ölçeklenebilirlik
IaC, altyapının hızlı bir şekilde ölçeklendirilmesini sağlar. Aynı kod, bir veya bin sunucu oluşturmak için kullanılabilir.
Maliyet Tasarrufu
IaC, manuel süreçlere göre daha az zaman ve kaynak gerektirir. Bu, operasyonel maliyetleri azaltır ve kaynakların daha verimli kullanılmasını sağlar.
IaC Best Practices
Modülerlik ve Yeniden Kullanılabilirlik
IaC kodunu modüler ve yeniden kullanılabilir bir şekilde tasarlamak, bakımı kolaylaştırır ve tekrarı azaltır. Ortak işlevleri paylaşılan modüllere veya kütüphanelere çıkarın.
Sürüm Kontrolü ve CI/CD
IaC kodunu sürüm kontrolü altında tutun ve CI/CD pipeline'ları kullanarak test edin ve dağıtın. Bu, değişikliklerin güvenli ve tutarlı bir şekilde uygulanmasını sağlar.
Test ve Doğrulama
IaC kodunu test etmek ve doğrulamak, hataları erken tespit etmeyi ve güvenilirliği artırmayı sağlar. Birim testleri, entegrasyon testleri ve doğrulama araçları kullanın.
Güvenlik ve Uyumluluk
IaC kodunda güvenlik ve uyumluluk gereksinimlerini dikkate alın. Güvenlik taramaları, politika kontrolleri ve uyumluluk doğrulamaları yapın.
Terraform Kod Örneği
# AWS'de bir VPC ve EC2 örneği oluşturan Terraform kodu
provider "aws" {
region = "us-west-2"
}
# VPC oluşturma
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "Main VPC"
}
}
# Subnet oluşturma
resource "aws_subnet" "public" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
tags = {
Name = "Public Subnet"
}
}
# Internet Gateway oluşturma
resource "aws_internet_gateway" "gw" {
vpc_id = aws_vpc.main.id
tags = {
Name = "Main IGW"
}
}
# Route Table oluşturma
resource "aws_route_table" "public" {
vpc_id = aws_vpc.main.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.gw.id
}
tags = {
Name = "Public Route Table"
}
}
# Subnet ile Route Table ilişkilendirme
resource "aws_route_table_association" "public" {
subnet_id = aws_subnet.public.id
route_table_id = aws_route_table.public.id
}
# Security Group oluşturma
resource "aws_security_group" "web" {
name = "web-server-sg"
description = "Allow HTTP and SSH traffic"
vpc_id = aws_vpc.main.id
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 22
to_port = 22
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"]
}
tags = {
Name = "Web Server SG"
}
}
# EC2 örneği oluşturma
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
subnet_id = aws_subnet.public.id
vpc_security_group_ids = [aws_security_group.web.id]
tags = {
Name = "Web Server"
}
}