AWS EC2 Elastic IP Adresi Atama ve Yönetimi
AWS üzerinde bir EC2 instance’ı ayağa kaldırdığında, o instance’a otomatik olarak bir public IP adresi atanır. Kulağa güzel geliyor, değil mi? Ancak bu IP adresinin bir sorunu var: instance’ı durdurduğunda ya da yeniden başlattığında IP adresi değişiyor. Yani production ortamında bir web sunucusu çalıştırıyorsan ve sunucuyu yeniden başlatmak zorunda kaldığında, DNS kayıtlarını güncellemek için koşturmak zorunda kalıyorsun. İşte tam bu noktada Elastic IP adresleri devreye giriyor. Bu yazıda Elastic IP’nin ne olduğunu, nasıl atandığını, AWS Console, AWS CLI ve Terraform üzerinden nasıl yönetildiğini ve gerçek dünya senaryolarında nasıl kullanıldığını derinlemesine ele alacağız.
Elastic IP Nedir ve Neden Gereklidir?
Elastic IP (EIP), AWS hesabına bağlı statik bir public IPv4 adresidir. Normal dinamik public IP’lerin aksine bu adres, sen serbest bırakmadığın sürece senindir. Instance’ı durdursan da, yeniden başlatsan da, hatta instance’ı tamamen silip yenisini oluştursan da aynı IP adresini kullanmaya devam edebilirsin.
Gerçek dünya senaryosu olarak düşün: Bir e-ticaret sitesi işletiyorsun. DNS kayıtlarında A kaydı olarak EC2 instance’ının IP adresi yazıyor. Bir güvenlik yaması nedeniyle sunucuyu yeniden başlatman gerekiyor. Eğer Elastic IP kullanmıyorsan, sunucu yeniden başladığında yeni bir IP adresi alıyor ve DNS’in TTL süresi dolana kadar sitene ulaşmak isteyen kullanıcılar hata alıyor. Elastic IP ile bu sorun tamamen ortadan kalkıyor.
Elastic IP’nin temel özellikleri:
- Hesabına bağlıdır, instance’a değil
- Bir instance’tan alıp başka bir instance’a saniyeler içinde atayabilirsin
- Bölge (region) bazlıdır, bir bölgede aldığın EIP’yi başka bölgede kullanamazsın
- Varsayılan olarak hesap başına 5 EIP limiti vardır (artırım talep edilebilir)
- Bir EC2 instance’ına atanmış ve o instance çalışıyorsa ücretsizdir; atanmamış ya da durdurulmuş instance’a atanmışsa ücret alınır
AWS Console Üzerinden Elastic IP Atama
En temel yöntemle başlayalım. AWS Management Console üzerinden Elastic IP almak ve atamak oldukça basit bir süreçtir.
Adımlar:
- AWS Console’a giriş yap ve EC2 servisine git
- Sol menüden “Network & Security” altındaki “Elastic IPs” seçeneğine tıkla
- “Allocate Elastic IP address” butonuna bas
- Network Border Group ve Public IPv4 address pool seçeneklerini varsayılan bırak
- “Allocate” butonuna tıkla ve EIP’nin tahsis edilmesini bekle
- Tahsis edilen EIP’yi seç, “Actions” menüsünden “Associate Elastic IP address” seç
- Instance veya Network Interface seçeneğini belirle, hedef instance’ını seç
- “Associate” butonuna tıkla
Bu kadar. Artık seçtiğin instance bu IP adresine sahip ve instance yeniden başlasa bile bu IP değişmeyecek.
AWS CLI ile Elastic IP Yönetimi
Sysadmin olarak gerçek güç CLI’dadır. AWS CLI ile Elastic IP işlemlerini otomatize edebilir, script’lere dahil edebilir ve çok daha hızlı halledebilirsin.
CLI Kurulumu ve Yapılandırması
Önce AWS CLI’nın kurulu ve yapılandırılmış olduğundan emin ol:
# AWS CLI versiyon kontrolü
aws --version
# AWS CLI yapılandırması
aws configure
# AWS Access Key ID, Secret Access Key, Region ve output format gireceksin
Elastic IP Tahsis Etme
# Yeni bir Elastic IP tahsis et
aws ec2 allocate-address --domain vpc
# Çıktı şu şekilde gelecek:
# {
# "PublicIp": "54.187.xxx.xxx",
# "AllocationId": "eipalloc-0a1b2c3d4e5f67890",
# "PublicIpv4Pool": "amazon",
# "NetworkBorderGroup": "us-east-1",
# "Domain": "vpc"
# }
# AllocationId'yi bir değişkene atayalım
ALLOCATION_ID=$(aws ec2 allocate-address --domain vpc --query 'AllocationId' --output text)
echo "Tahsis edilen EIP ID: $ALLOCATION_ID"
Elastic IP’yi EC2 Instance’ına Atama
# Instance ID'yi bir değişkene atalım
INSTANCE_ID="i-0a1b2c3d4e5f67890"
# EIP'yi instance'a ata
aws ec2 associate-address
--instance-id $INSTANCE_ID
--allocation-id $ALLOCATION_ID
# Atama sonrası instance'ın public IP'sini kontrol et
aws ec2 describe-instances
--instance-ids $INSTANCE_ID
--query 'Reservations[0].Instances[0].PublicIpAddress'
--output text
Mevcut Elastic IP’leri Listeleme
# Hesabındaki tüm Elastic IP'leri listele
aws ec2 describe-addresses
--query 'Addresses[*].{IP:PublicIp,AllocationId:AllocationId,InstanceId:InstanceId,AssociationId:AssociationId}'
--output table
# Sadece atanmamış (boşta duran) EIP'leri bul - bunlar para yakıyor!
aws ec2 describe-addresses
--query 'Addresses[?AssociationId==null].{IP:PublicIp,AllocationId:AllocationId}'
--output text
EIP Atamayı Kaldırma ve Serbest Bırakma
# Önce association ID'yi bul
ASSOCIATION_ID=$(aws ec2 describe-addresses
--allocation-ids $ALLOCATION_ID
--query 'Addresses[0].AssociationId'
--output text)
# EIP'yi instance'tan ayır
aws ec2 disassociate-address
--association-id $ASSOCIATION_ID
# EIP'yi tamamen serbest bırak (artık senin değil)
aws ec2 release-address
--allocation-id $ALLOCATION_ID
Gelişmiş Senaryo: Failover için EIP Taşıma
Bu, Elastic IP’nin en güçlü kullanım senaryolarından biridir. Diyelim ki primary ve standby olarak iki EC2 instance’ın var. Primary instance çöktüğünde EIP’yi otomatik olarak standby instance’a taşıyan bir script yazalım.
#!/bin/bash
# failover.sh - EIP Failover Script
# Kullanim: ./failover.sh <primary-instance-id> <standby-instance-id> <allocation-id>
PRIMARY_INSTANCE=$1
STANDBY_INSTANCE=$2
ALLOCATION_ID=$3
# Primary instance'ın durumunu kontrol et
PRIMARY_STATE=$(aws ec2 describe-instances
--instance-ids $PRIMARY_INSTANCE
--query 'Reservations[0].Instances[0].State.Name'
--output text)
echo "Primary instance durumu: $PRIMARY_STATE"
if [ "$PRIMARY_STATE" != "running" ]; then
echo "Primary instance çalışmıyor! Failover başlatılıyor..."
# Mevcut association ID'yi bul
CURRENT_ASSOCIATION=$(aws ec2 describe-addresses
--allocation-ids $ALLOCATION_ID
--query 'Addresses[0].AssociationId'
--output text)
# Eğer EIP bir instance'a atanmışsa önce ayır
if [ "$CURRENT_ASSOCIATION" != "None" ] && [ -n "$CURRENT_ASSOCIATION" ]; then
echo "EIP mevcut instance'tan ayrılıyor..."
aws ec2 disassociate-address --association-id $CURRENT_ASSOCIATION
sleep 2
fi
# EIP'yi standby instance'a ata
echo "EIP standby instance'a atanıyor..."
aws ec2 associate-address
--instance-id $STANDBY_INSTANCE
--allocation-id $ALLOCATION_ID
--allow-reassociation
echo "Failover tamamlandı! EIP artık $STANDBY_INSTANCE üzerinde."
# SNS ile bildirim gönder (opsiyonel)
aws sns publish
--topic-arn "arn:aws:sns:us-east-1:123456789:alerts"
--message "Failover gerçekleşti. EIP $STANDBY_INSTANCE instance'ına taşındı."
--subject "EC2 Failover Alert"
else
echo "Primary instance sağlıklı çalışıyor. Failover gerekmiyor."
fi
Bu script’i crontab’a ekleyerek ya da CloudWatch Events ile tetikleyerek otomatik failover mekanizması oluşturabilirsin.
Terraform ile Elastic IP Yönetimi
Infrastructure as Code yaklaşımıyla Elastic IP yönetimi için Terraform mükemmel bir seçim. Özellikle birden fazla ortam (dev, staging, prod) yönetiyorsan Terraform’u şiddetle tavsiye ederim.
# main.tf
# VPC ve subnet tanımları varsayılan olarak mevcut kabul ediliyor
# EC2 Instance
resource "aws_instance" "web_server" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t3.medium"
subnet_id = var.public_subnet_id
vpc_security_group_ids = [aws_security_group.web_sg.id]
tags = {
Name = "web-server-prod"
Environment = "production"
ManagedBy = "terraform"
}
}
# Elastic IP Tahsis
resource "aws_eip" "web_server_eip" {
domain = "vpc"
# EIP'yi instance silinmeden önce koru
lifecycle {
prevent_destroy = true
}
tags = {
Name = "web-server-prod-eip"
Environment = "production"
}
}
# EIP'yi Instance'a Bağla
resource "aws_eip_association" "web_server_eip_assoc" {
instance_id = aws_instance.web_server.id
allocation_id = aws_eip.web_server_eip.id
}
# Output olarak EIP adresini göster
output "web_server_public_ip" {
value = aws_eip.web_server_eip.public_ip
description = "Web sunucusunun Elastic IP adresi"
}
Terraform ile bu konfigürasyonu uygulamak için:
# Terraform başlatma
terraform init
# Plan kontrolü
terraform plan
# Uygulama
terraform apply
# EIP adresini görüntüleme
terraform output web_server_public_ip
# Sadece EIP'yi yok etmekten korumak için import etme
# Mevcut bir EIP'yi Terraform state'ine ekle
terraform import aws_eip.web_server_eip eipalloc-0a1b2c3d4e5f67890
Elastic IP ve Security Group Entegrasyonu
Üretim ortamında EIP kullanırken güvenlik ayarlarını da doğru yapılandırman kritik öneme sahip. İşte tipik bir web sunucusu güvenlik grubu yapılandırması:
# Güvenlik grubu oluştur
aws ec2 create-security-group
--group-name web-server-sg
--description "Web sunucusu güvenlik grubu"
--vpc-id vpc-0a1b2c3d4e5f67890
# HTTP trafiğine izin ver
aws ec2 authorize-security-group-ingress
--group-id sg-0a1b2c3d4e5f67890
--protocol tcp
--port 80
--cidr 0.0.0.0/0
# HTTPS trafiğine izin ver
aws ec2 authorize-security-group-ingress
--group-id sg-0a1b2c3d4e5f67890
--protocol tcp
--port 443
--cidr 0.0.0.0/0
# SSH erişimini sadece belirli IP'lerden izin ver
# Kendi ofis IP'n veya VPN IP'n olmalı
aws ec2 authorize-security-group-ingress
--group-id sg-0a1b2c3d4e5f67890
--protocol tcp
--port 22
--cidr 203.0.113.0/32
# EIP'nin atandığı instance'ın güvenlik grubunu güncelle
aws ec2 modify-instance-attribute
--instance-id $INSTANCE_ID
--groups sg-0a1b2c3d4e5f67890
Maliyet Optimizasyonu: Boşta Duran EIP’leri Bulma
AWS, kullanılmayan EIP’ler için saatlik ücret keser. Bu ücret küçük görünse de biriktikçe fark edilebilir bir maliyet oluşturur. İşte tüm bölgelerdeki boşta duran EIP’leri bulan bir script:
#!/bin/bash
# find_unused_eips.sh - Kullanılmayan EIP'leri bul ve raporla
echo "=== Kullanılmayan Elastic IP Raporu ==="
echo "Tarih: $(date)"
echo ""
TOTAL_COST=0
REGIONS=$(aws ec2 describe-regions --query 'Regions[*].RegionName' --output text)
for REGION in $REGIONS; do
UNUSED_EIPS=$(aws ec2 describe-addresses
--region $REGION
--query 'Addresses[?AssociationId==null].[PublicIp,AllocationId]'
--output text 2>/dev/null)
if [ -n "$UNUSED_EIPS" ]; then
echo "Bölge: $REGION"
echo "Kullanılmayan EIP'ler:"
echo "$UNUSED_EIPS" | while read IP ALLOC_ID; do
echo " - IP: $IP | Allocation ID: $ALLOC_ID"
echo " Aylık tahmini maliyet: ~3.65 USD"
done
echo ""
EIP_COUNT=$(echo "$UNUSED_EIPS" | wc -l)
REGION_COST=$(echo "$EIP_COUNT * 3.65" | bc)
echo " Bu bölgede aylık tahmini toplam: $REGION_COST USD"
echo "---"
fi
done
echo ""
echo "Not: Kullanılmayan EIP'leri serbest bırakmak için:"
echo "aws ec2 release-address --allocation-id <allocation-id> --region <region>"
EIP ile NAT Gateway ve Load Balancer Farkı
Birçok kullanıcı bu konuda karışıklık yaşıyor. Kısa bir açıklama yapalım.
Elastic IP ile doğrudan instance erişimi:
- Doğrudan EC2 instance’ına atanır
- Instance kaynakları doğrudan internet trafiğiyle karşılaşır
- Basit web sunucuları, oyun sunucuları, VPN gateway’leri için uygun
- Tek instance için ideal
Elastic IP ile NAT Gateway:
- Private subnet’teki instance’ların internete çıkışı için kullanılır
- Instance’lara gelen trafiği değil, giden trafiği yönetir
- NAT Gateway’in kendisi bir EIP kullanır
Elastic IP ile Application Load Balancer:
- ALB’nin kendisi EIP kullanmaz, AWS yönetilen IP’ler kullanır
- Ancak Network Load Balancer (NLB) EIP destekler
- NLB üzerinden birden fazla instance’a statik IP ile trafik yönlendirilebilir
# NLB için Elastic IP oluşturma (her availability zone için bir tane)
# NLB oluştururken subnet başına EIP belirtebilirsin
# Önce iki EIP tahsis et
EIP_1=$(aws ec2 allocate-address --domain vpc --query 'AllocationId' --output text)
EIP_2=$(aws ec2 allocate-address --domain vpc --query 'AllocationId' --output text)
# NLB oluştururken bu EIP'leri kullan
aws elbv2 create-load-balancer
--name my-network-lb
--type network
--subnet-mappings
SubnetId=subnet-0a1b2c3d,AllocationId=$EIP_1
SubnetId=subnet-4e5f6g7h,AllocationId=$EIP_2
EIP ile Route 53 DNS Yönetimi
EIP kullanıyorsan DNS yönetimi de çok daha temiz hale geliyor. Route 53 üzerinde bir A kaydı oluşturup EIP’yi işaret ettiğinde, instance değişse bile DNS kaydını güncelleme ihtiyacın kalmıyor.
# Route 53'te A kaydı oluşturma veya güncelleme
EIP_ADDRESS=$(aws ec2 describe-addresses
--allocation-ids $ALLOCATION_ID
--query 'Addresses[0].PublicIp'
--output text)
# Route 53 hosted zone ID'ni al
HOSTED_ZONE_ID=$(aws route53 list-hosted-zones-by-name
--dns-name "orneksite.com"
--query 'HostedZones[0].Id'
--output text | cut -d'/' -f3)
# DNS kaydını güncelle
aws route53 change-resource-record-sets
--hosted-zone-id $HOSTED_ZONE_ID
--change-batch "{
"Changes": [{
"Action": "UPSERT",
"ResourceRecordSet": {
"Name": "www.orneksite.com",
"Type": "A",
"TTL": 300,
"ResourceRecords": [{
"Value": "$EIP_ADDRESS"
}]
}
}]
}"
echo "DNS kaydı güncellendi: www.orneksite.com -> $EIP_ADDRESS"
Sık Karşılaşılan Hatalar ve Çözümleri
AddressLimitExceeded hatası:
- AWS varsayılan olarak bölge başına 5 EIP limiti koyar
- AWS Support üzerinden limit artırım talebinde bulun
- Önce kullanılmayan EIP’leri temizlemeyi dene
AuthFailure hatası:
- IAM kullanıcının EC2 ve EIP işlemleri için gerekli izinlere sahip olup olmadığını kontrol et
- Minimum gerekli izinler:
ec2:AllocateAddress,ec2:AssociateAddress,ec2:DisassociateAddress,ec2:ReleaseAddress,ec2:DescribeAddresses
EIP’nin instance’a atanmaması:
- Instance’ın VPC içinde olduğundan emin ol (EC2-Classic artık desteklenmiyor)
- EIP ve instance’ın aynı bölgede olduğunu doğrula
- Instance’ın “running” durumunda olduğunu kontrol et
Maliyet beklenmedik şekilde artıyor:
- Durdurulmuş instance’lara atanmış EIP’ler de ücret kesilir
- Instance’ı durdururken EIP’yi de disassociate et ya da instance’ı terminate et
Sonuç
Elastic IP, AWS altyapısının temel taşlarından biri. Doğru kullanıldığında sana büyük esneklik sağlar: instance’ı değiştirebilir, yeniden başlatabilir, hatta failover yapabilirsin ve kullanıcıların bundan haberi bile olmaz. Yanlış kullanıldığında ise boşu boşuna para yakar.
Özetle şunlara dikkat etmeni öneririm:
- Production instance’larına mutlaka EIP ata, dinamik IP kullanma
- Kullanılmayan EIP’leri düzenli olarak kontrol et ve temizle
- EIP yönetimini Terraform gibi bir IaC aracıyla otomatize et
- Failover senaryoların için EIP taşıma mekanizması kur
- IAM izinlerini minimum yetki prensibine göre yapılandır
Bu yazıdaki script’leri ve Terraform konfigürasyonlarını kendi ortamınıza göre uyarlayabilir, geliştirebilirsin. Sorularını ve deneyimlerini yorumlarda paylaşmaktan çekinme!
