DevOps & Cloud
AWS Bulut Altyapısı: EC2, S3, CloudFront ve Lambda Rehberi
AWS (Amazon Web Services), modern uygulamalarin olceklenebilir ve guvenilir bir sekilde barindirilmasi icin kapsamli bir bulut altyapisi sunar. EC2 ile sanal sunucular, S3 ile nesne depolama, CloudFront ile CDN, Lambda ile sunucusuz fonksiyonlar ve VPC ile izole ag yapilari olusturabilirsiniz. Bu yazida AWS bulut altyapisini production ortamlarinda nasil etkin kullandigimi ve her servisin hangi senaryolarda kritik rol oynadigini detayli olarak ele alacagim.
Kendi projelerimde AWS deployment sureclerini otomatize ederken edindigim deneyimler, altyapi kararlarini hizlandirmamda buyuk rol oynadi. Dogru servis kombinasyonu ile hem maliyet hem de performans acisindan optimum sonuclara ulasmak mumkun.
EC2: Sanal Sunucu Yonetimi
Instance Tipleri ve Secim Kriterleri
EC2 instance secimi, uygulamanizin CPU, bellek ve ag gereksinimlerine gore yapilmalidir:
- t3.micro/t3.small: Gelistirme ortamlari ve dusuk trafikli uygulamalar
- t3.medium/t3.large: Orta olcekli API sunuculari ve web uygulamalari
- c5/c6i serisi: CPU-yogun islemler (video encoding, veri isleme)
- r5/r6i serisi: Bellek-yogun uygulamalar (in-memory cache, veritabanlari)
- m5/m6i serisi: Genel amacli dengeli is yukleri
AWS CLI ile hizlica bir EC2 instance baslatabilirsiniz:
# Security group olustur
aws ec2 create-security-group \
--group-name api-server-sg \
--description "API Server Security Group" \
--vpc-id vpc-0abc123def456
# HTTP ve SSH portlarini ac
aws ec2 authorize-security-group-ingress \
--group-id sg-0abc123 \
--protocol tcp --port 80 --cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress \
--group-id sg-0abc123 \
--protocol tcp --port 22 --cidr 203.0.113.0/24
# EC2 instance baslat
aws ec2 run-instances \
--image-id ami-0abcdef1234567890 \
--instance-type t3.medium \
--key-name my-key-pair \
--security-group-ids sg-0abc123 \
--subnet-id subnet-0abc123 \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=api-server},{Key=Environment,Value=production}]'Auto Scaling ile Yuksek Erisilebilirlik
Production ortamlarinda tek bir EC2 instance yeterli degildir. Auto Scaling Group (ASG) ile trafik artislarina otomatik yanit veren bir yapi kurulmalidir. Launch Template tanimlayarak AMI, instance tipi ve user data ayarlarini standartlastirir, ASG ise minimum, maksimum ve istenilen instance sayisini yonetir.
ASG yapilandirirken target tracking scaling policy tercih etmenizi oneririm. Ornegin CPU kullanimi %70'i astiginda yeni instance eklenmesini, %30'un altina dustugunde instance cikarilmasini saglayabilirsiniz. Bu yaklasim, hem gereksiz maliyetlerin onune gecer hem de trafik artislarinda kullanici deneyimini korur.
IAM: Kimlik ve Erisim Yonetimi
En Az Yetki Prensibi
AWS IAM (Identity and Access Management), kaynaklariniza kimin hangi kosullarda erisebilecegini kontrol eder. Production ortaminda en az yetki prensibini uygulamak kritik guvenlik gereksinimidir. Her servis ve kullanici yalnizca gorevini yerine getirmek icin ihtiyac duydugu izinlere sahip olmalidir.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowS3ReadOnly",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-app-assets-prod",
"arn:aws:s3:::my-app-assets-prod/*"
]
},
{
"Sid": "AllowCloudWatchLogs",
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:eu-central-1:123456789:log-group:/app/myapi:*"
}
]
}EC2 instance'lariniza IAM role atayarak access key kullanmadan AWS servislerine guvenli erisim saglayabilirsiniz. Bu yontem, hardcoded credential riskini ortadan kaldirir ve credential rotation sorununu cozer.
S3: Nesne Depolama ve Statik Hosting
S3, sinirsiz olceklenebilir nesne depolama servisidir. Statik dosyalar, medya icerikleri, yedeklemeler ve log dosyalari icin idealdir.
# S3 bucket olustur
aws s3 mb s3://my-app-assets-prod --region eu-central-1
# Bucket policy ayarla - CloudFront erisimi icin
aws s3api put-bucket-policy --bucket my-app-assets-prod --policy '{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCloudFrontAccess",
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-app-assets-prod/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::123456789:distribution/E1234"
}
}
}
]
}'
# Lifecycle policy - 90 gun sonra Glacier'a tasi
aws s3api put-bucket-lifecycle-configuration \
--bucket my-app-assets-prod \
--lifecycle-configuration '{
"Rules": [
{
"ID": "MoveToGlacier",
"Status": "Enabled",
"Filter": { "Prefix": "backups/" },
"Transitions": [
{ "Days": 90, "StorageClass": "GLACIER" }
]
}
]
}'S3 Depolama Siniflari
Maliyet optimizasyonu icin dogru depolama sinifini secmek kritiktir:
- S3 Standard: Sik erisilen veriler (API response cache, aktif medya dosyalari)
- S3 Intelligent-Tiering: Erisim deseni belirsiz veriler
- S3 Glacier: Arsiv verileri (log yedekleri, eski raporlar)
- S3 Glacier Deep Archive: Uzun sureli arsiv (compliance verileri)
S3 Lifecycle ile Otomatik Maliyet Yonetimi
Lifecycle policy'leri sadece depolama sinifi gecisleri icin degil, eski versiyonlarin ve tamamlanmamis multipart upload'larin temizlenmesi icin de kullanilmalidir:
# Gelismis lifecycle policy
aws s3api put-bucket-lifecycle-configuration \
--bucket my-app-assets-prod \
--lifecycle-configuration '{
"Rules": [
{
"ID": "CleanupOldVersions",
"Status": "Enabled",
"Filter": {},
"NoncurrentVersionExpiration": {
"NoncurrentDays": 30
},
"AbortIncompleteMultipartUpload": {
"DaysAfterInitiation": 7
}
},
{
"ID": "ArchiveLogs",
"Status": "Enabled",
"Filter": { "Prefix": "logs/" },
"Transitions": [
{ "Days": 30, "StorageClass": "STANDARD_IA" },
{ "Days": 90, "StorageClass": "GLACIER" }
],
"Expiration": { "Days": 365 }
}
]
}'Bu yapilandirma ile log dosyalari 30 gun sonra Infrequent Access sinifina, 90 gun sonra Glacier'a tasinir ve 365 gun sonra otomatik silinir. Bu tur kademelendirilmis gecisler, buyuk olcekli projelerde aylik yuzlerce dolar tasarruf saglayabilir.
Lambda: Sunucusuz Fonksiyonlar
AWS Lambda, sunucu yonetimi olmadan kod calistirmaniza olanak tanir. Event-driven mimariler, API Gateway entegrasyonu ve zamanlanmis gorevler icin idealdir.
// Lambda function - S3 event ile tetiklenen resim isleme
const { S3Client, GetObjectCommand, PutObjectCommand } = require('@aws-sdk/client-s3');
const sharp = require('sharp');
const s3 = new S3Client({ region: 'eu-central-1' });
exports.handler = async (event) => {
const bucket = event.Records[0].s3.bucket.name;
const key = event.Records[0].s3.object.key;
// Orijinal resmi al
const original = await s3.send(new GetObjectCommand({ Bucket: bucket, Key: key }));
const imageBuffer = await streamToBuffer(original.Body);
// Farkli boyutlarda thumbnail olustur
const sizes = [
{ width: 150, suffix: 'thumb' },
{ width: 600, suffix: 'medium' },
{ width: 1200, suffix: 'large' }
];
for (const size of sizes) {
const resized = await sharp(imageBuffer)
.resize(size.width)
.webp({ quality: 80 })
.toBuffer();
const outputKey = key.replace(/\.[^.]+$/, `-${size.suffix}.webp`);
await s3.send(new PutObjectCommand({
Bucket: bucket,
Key: `processed/${outputKey}`,
Body: resized,
ContentType: 'image/webp'
}));
}
return { statusCode: 200, body: 'Resimler islendi' };
};Lambda fonksiyonlarinin cold start sorununu minimize etmek icin Provisioned Concurrency kullanabilir veya fonksiyon boyutunu kucuk tutarak baslangic suresini kisaltabilirsiniz. Ayrica Lambda Layers ile ortak kutuphaneleri paylasarak deployment paketlerini kucultmek etkili bir yontemdir.
VPC: Ag Izolasyonu ve Guvenlik
VPC (Virtual Private Cloud), AWS kaynaklarinizi izole bir ag ortaminda calistirmanizi saglar. Public ve private subnet'ler ile guvenlik katmanlari olusturabilirsiniz:
- Public Subnet: Load Balancer ve bastion host gibi internete acik kaynaklar
- Private Subnet: API sunuculari, veritabanlari gibi disaridan erisilmemesi gereken kaynaklar
- NAT Gateway: Private subnet'teki kaynaklarin internete cikis yapabilmesi icin
- Security Groups: Instance seviyesinde firewall kurallari
- Network ACL: Subnet seviyesinde ek guvenlik katmani
Production ortaminda en az iki Availability Zone'da subnet olusturmanizi ve veritabanlarinizi private subnet icinde tutmanizi siddetle oneririm. Bu yapi hem guvenlik hem de yuksek erisilebilirlik acisindan temel gereksinimdir.
CloudFront: CDN ile Global Dagitim
CloudFront, statik ve dinamik iceriklerinizi dunya genelindeki edge location'lardan sunarak gecikmeyi minimize eder. S3 bucket'larinizin onune CloudFront dagitimi ekleyerek hem performans kazanir hem de S3 maliyetlerinizi dusurebilirsiniz. Origin Access Control (OAC) ile S3 bucket'a dogrudan erisimi engelleyip tum trafigi CloudFront uzerinden yonlendirmek en iyi guvenlik pratigi dir.
# CloudFront dagitimi olustur (AWS CLI)
aws cloudfront create-distribution \
--distribution-config '{
"CallerReference": "my-app-dist-2025",
"Origins": {
"Quantity": 1,
"Items": [
{
"Id": "S3Origin",
"DomainName": "my-app-assets-prod.s3.eu-central-1.amazonaws.com",
"S3OriginConfig": {
"OriginAccessIdentity": ""
},
"OriginAccessControlId": "E2QWRUHAPOMQZL"
}
]
},
"DefaultCacheBehavior": {
"TargetOriginId": "S3Origin",
"ViewerProtocolPolicy": "redirect-to-https",
"CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6",
"Compress": true,
"AllowedMethods": { "Quantity": 2, "Items": ["GET", "HEAD"] }
},
"Enabled": true,
"Comment": "Production CDN"
}'CloudFront cache invalidation islemlerini deployment sonrasinda otomatik olarak tetiklemek, kullanicilarin her zaman guncel icerigi gormesini saglar. Ancak invalidation maliyeti oldugu icin, dosya isimlendirmesinde versiyon hash'i kullanarak cache busting yapmak daha maliyet-etkin bir yaklasimdir.
Maliyet Optimizasyonu
AWS maliyetlerini kontrol altinda tutmak icin su stratejileri uygulayabilirsiniz:
- Reserved Instances / Savings Plans: Tahmin edilebilir is yukleri icin on-demand fiyatin %30-60 altinda kaynak edinin
- Spot Instances: Kesintiye toleransi olan is yukleri (batch processing, CI/CD) icin %90'a varan indirim
- Right-sizing: CloudWatch metriklerini inceleyerek over-provisioned instance'lari kucultun
- S3 Intelligent-Tiering: Erisim deseni belirsiz verilerde otomatik maliyet optimizasyonu
- NAT Gateway alternatifi: Dusuk trafikli ortamlarda NAT Instance kullanarak aylık NAT Gateway maliyetinden tasarruf edin
AWS Cost Explorer ile aylık harcamalarinizi servis bazinda analiz edin ve Budget alarmları kurarak beklenmeyen maliyet artislarinda aninda bilgilendirilmenizi saglayin.
Pratik Oneriler ve Ozet
AWS bulut altyapisini etkin kullanmak icin su noktalara dikkat edin:
- Infrastructure as Code: CloudFormation veya Terraform ile altyapinizi kod olarak yonetin
- Maliyet Izleme: AWS Cost Explorer ve Budget alarmlari ile maliyetleri kontrol altinda tutun
- Guvenlik: IAM rollerini en az yetki prensibiyle yapilandirin, root hesabi asla gunluk islemler icin kullanmayin
- Monitoring: CloudWatch ile metrikler, loglar ve alarmlar kurarak proaktif izleme yapin
- Multi-AZ: Kritik servislerinizi birden fazla Availability Zone'da calistirarak yuksek erisilebilirlik saglayin
AWS servislerini dogru kombine etmek, uygulamanizin hem olceklenebilirligini hem de guvenilirligini dogrudan etkiler. Kucuk baslayip ihtiyaca gore buyutmek, en saglikli AWS deployment stratejisidir.
İlgili Makaleler
Docker Konteyner Rehberi: Dockerfile, Compose ve Multi-Stage Build
Docker ile konteynerleştirme rehberi. Dockerfile yazma, Docker Compose ile çoklu servis, multi-stage build optimizasyonu ve production deployment.
CI/CD Pipeline: GitHub Actions ile Otomatik Test ve Deployment
GitHub Actions ile CI/CD pipeline kurulumu. Otomatik test, build, Docker image oluşturma ve AWS'e deployment.
Kubernetes ile Mikroservis Mimarisi: Pod, Service ve Deployment
Kubernetes ile mikroservis mimarisi. Pod yönetimi, Service discovery, Deployment stratejileri, Ingress ve Helm chart'lar.
Flutter Projeniz mi Var?
iOS, Android ve web için yüksek performanslı Flutter uygulamaları geliştiriyorum.
İletişime Geç