ders_03 / aws_deployment
// Konteyner Teknolojileri Eğitimi

Buluta Çıkış:
AWS ile Canlıya Alma

ECR · ECS · Fargate · ALB · Canlı Test

03 / AWS Deployment
docker build
ECR push
ECS Task
ALB
Canlı!

AWS Konteyner Ekosistemi

AWS ServisiNe Yapar?Docker Karşılığı
ECR
Elastic Container Registry
Private image deposuDocker Hub (özel)
ECS
Elastic Container Service
Container çalıştırma ve yönetimidocker run otomatik
Fargate Sunucu yönetmeden container çalıştırEC2 olmadan Docker
ALB
Application Load Balancer
İstekleri container'lara dağıtNginx (yönetilen)
EKS
Elastic Kubernetes Service
Yönetilen KubernetesK8s cluster
Bugün kullanacağımız yol: ECR → ECS + Fargate → ALB → Public URL
Fargate seçiyoruz: EC2 yönetmek zorunda kalmıyoruz. AWS her şeyi halleder.

ECR — Elastic Container Registry

AWS'nin özel image deposudur. Kodunuz güvende kalır, public Docker Hub'a gitmez.

Docker Hub vs ECR

Docker HubECR
ErişimPublic/PrivatePrivate (IAM)
EntegrasyonGenelAWS native
GüvenlikStandartKMS şifreleme
MaliyetÜcretsiz (public)0.10$/GB/ay

ECR'ye Push

# 1. Repository oluştur
aws ecr create-repository \
  --repository-name image-classifier-api \
  --region eu-central-1

# 2. Login
aws ecr get-login-password \
  --region eu-central-1 | \
  docker login --username AWS \
  --password-stdin \
  $ACCOUNT.dkr.ecr.eu-central-1.amazonaws.com

# 3. Tag & Push
docker tag image-classifier-api:latest \
  $ACCOUNT.dkr.ecr.eu-central-1.amazonaws.com/image-classifier-api:latest

docker push \
  $ACCOUNT.dkr.ecr.eu-central-1.amazonaws.com/image-classifier-api:latest

ECS + Fargate

ECS Kavramları

  • Cluster — Container'ların çalışacağı ortam
  • Task Definition — Container ayarları (image, CPU, RAM, port)
  • Task — Task Definition'dan çalışan örnek
  • Service — Kaç Task çalışmalı? (desired count)

Neden Fargate?

  • EC2 sunucu yönetmek zorunda değilsin
  • Patch, update, scale → AWS halleder
  • Kullandığın kadar öde (vCPU + RAM)
  • Demo için ideal: hızlı kur, hızlı sil
Kullanıcı — internet üzerinden
↓ HTTPS
ALB — Application Load Balancer
myapp.eu-central-1.elb.amazonaws.com
↓ Round Robin
ECS Task 1
ECS Task 2
ECS Task 3
↑ Fargate (sunucusuz)
ECR — image buradan çekilir

Deployment Adımları

1
Image build et ve ECR'ye push et
docker builddocker push
2
ECS Cluster oluştur
AWS Console → ECS → Create Cluster → Fargate
3
Task Definition oluştur
Container image URL, port 8080, 1 vCPU, 2 GB RAM
4
Service oluştur
Desired count: 2, ALB ekle
5
Security Group ayarla
Inbound: port 80 (ALB) ve port 8080 (container)
6
ALB DNS alınır — erişim açılır!
Tarayıcıda test, öğrencilere paylaş

Ön Koşullar

  • AWS CLI kurulu
  • aws configure tamamlandı
  • IAM: ECR + ECS izinleri var
  • ECR repository oluşturuldu
  • Image push edildi
İpucu: Cluster ve Task Definition'ı önceden oluşturun. Demo sırasında sadece Service oluşturma adımını canlı yapın.

CLI ile ECR Push

## Değişkenleri ayarla
REGION="eu-central-1"
ACCOUNT_ID="$(aws sts get-caller-identity --query Account --output text)"
REPO="image-classifier-api"
TAG="latest"
ECR_URI="$ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com"

## ECR'ye login
aws ecr get-login-password --region $REGION | \
  docker login --username AWS --password-stdin $ECR_URI

## Tag & push
docker tag $REPO:$TAG $ECR_URI/$REPO:$TAG
docker push $ECR_URI/$REPO:$TAG

## Doğrula
aws ecr list-images --repository-name $REPO --region $REGION
Push başarılıysa AWS Console → ECR → Repositories'de görünür. ECS artık bu URL'den image'ı çekebilir.

ECS Task Definition

Task Definition Ayarları

Launch typeAWS Fargate
OSLinux/X86_64
CPU1 vCPU
Memory2 GB
Image URI$ECR_URI/image-classifier-api:latest
Container port8080 / TCP
Environment Variables:
MODEL_PATH = /app/classifier_model.h5
AWS_REGION = eu-central-1
S3_BUCKET = my-images-bucket

AWS CLI ile Task Definition

aws ecs register-task-definition \
  --family image-classifier-api \
  --network-mode awsvpc \
  --requires-compatibilities FARGATE \
  --cpu "1024" \
  --memory "2048" \
  --container-definitions '[{
    "name": "image-classifier-api",
    "image": "'$ECR_URI'/image-classifier-api:latest",
    "portMappings": [
      {"containerPort": 8080, "protocol": "tcp"}
    ],
    "environment": [
      {"name":"MODEL_PATH","value":"/app/classifier_model.h5"},
      {"name":"AWS_REGION","value":"eu-central-1"},
      {"name":"S3_BUCKET","value":"my-images-bucket"}
    ]
  }]'

ECS Service ve Load Balancer

Service Ayarları

Launch typeFargate
Task Definitionimage-classifier-api
Desired count2
VPCDefault VPC
SubnetsMin 2 farklı AZ
Public IPEnabled

Load Balancer

  • Type: Application Load Balancer
  • Listener: port 80 (HTTP)
  • Target: container port 8080
  • Health check path: /health
ALB
myapp-alb.eu-central-1.elb.amazonaws.com
↓ Round Robin
Task 1
eu-central-1a
● Healthy
Task 2
eu-central-1b
● Healthy
Service oluştuktan ~3-5 dakika sonra ALB DNS aktif olur.

AWS'de Ölçekleme

2. derste sormuştuk: 500 kişi gelince ne olur?
AWS'de cevap tek komut:
# 5 container'a ölçekle
aws ecs update-service \
  --cluster image-classifier-api-cluster \
  --service image-classifier-api-service \
  --desired-count 5

# Maliyet kontrolü için 2'ye düşür
aws ecs update-service \
  --cluster image-classifier-api-cluster \
  --service image-classifier-api-service \
  --desired-count 2

Auto Scaling (Otomatik)

CPU %70'i geçince otomatik ölçekle:

  • Min: 1 task, Max: 10 task
  • CPU > %70 → +1 task ekle
  • CPU < %30 → -1 task çıkar
  • CloudWatch alarmları tetikler

Lokal vs AWS

Ölçekleme1 komut / otomatik
Yük dağıtımıALB (yönetilen)
Hata toleransıMulti-AZ, auto-restart
ErişimDünya geneli

Canlı Test

$ curl -X POST ALB_DNS/predict -F "file=@gorsel.jpg"
Image classifier modelimiz — canlıda.
QR — henüz oluşturulmadı
python generate_qrcode.py <URL>
çalıştırın
Telefon ile tara

Nasıl Test Edersiniz?

1. QR kodu okutun (telefon)
2. Upload paneli açılır
3. Herhangi bir görsel yükleyin
4. Model sınıflandırma sonucu → skor
5. Hepiniz aynı anda deneyin!
{
  "result": true,
  "skor": 0.94,
  "s3_key": "uploads/..."
}

Neler Gözlemleyin

  • ALB 2 container'a dağıtıyor
  • Görsel S3'e otomatik kaydediliyor
  • CloudWatch → CPU / istek metrikleri
  • Bir container çökse ALB yönlendirir
Kendi geliştirdiğimiz model — production'a taşınmış hali bu.

Maliyet ve Temizlik

Demo Maliyeti

Fargate (1 vCPU, 2GB) × 2~$0.10/saat
ALB~$0.02/saat
ECR (500MB)~$0.05/ay
Toplam demo~$0.12/saat

3 saatlik demo ≈ $0.40. Bırakırsanız birikir!

Demo Sonrası — Mutlaka Silin

# 1. Service'i durdur
aws ecs update-service \
  --cluster image-classifier-api-cluster \
  --service image-classifier-api-service \
  --desired-count 0

# 2. Service & Cluster sil
aws ecs delete-service \
  --cluster image-classifier-api-cluster \
  --service image-classifier-api-service

aws ecs delete-cluster \
  --cluster image-classifier-api-cluster

# 3. ALB: Console → EC2 → Load Balancers

# 4. ECR (opsiyonel)
aws ecr delete-repository \
  --repository-name image-classifier-api --force

Tüm Yolculuk

main.py
Dockerfile
docker build
ECR push
ECS Task
ALB
Dünya

Sonraki Adımlar

  • CI/CD: GitHub Actions → ECR push
  • HTTPS: ACM + Route53
  • Monitoring: CloudWatch
  • Kubernetes: EKS'e geçiş

Öğrendikleriniz

  • VM vs Container farkı
  • Dockerfile yazmak
  • docker build & run
  • ECR, ECS, Fargate, ALB
  • AWS'ye canlı deployment

Neden Önemli?

  • Her ML modeli bu akışla yayınlanır
  • Ortam farkı sorunu çözülür
  • Ölçekleme otomatik hale gelir
  • CI/CD entegrasyon kolaylaşır
[ tamamlandı ]

Tebrikler!

3 derste bir ML modelini lokal geliştirmeden
dünya genelinde erişilebilir bir servise taşıdınız.
Kod → Container → Bulut
Bu döngüyü bilen herkes modern yazılım dünyasında güçlüdür.
>_ Sorularınız var mı?