Serverless Framework'ten AWS CDK'ya Geçiş: Bölüm 1 - Neden Geçiş Yapalım?
Serverless Framework'ten AWS CDK'ya geçiş rehberinin ilk bölümü. Neden geçiş yapmalı, temel kavramlar ve ilk adımlar.
Geçen Kasım ayında, CTO'muz tüm şirket toplantısında bomba gibi bir açıklama yaptı: "Serverless Framework lisansları için ayda 2.400 dolar harcıyoruz ve büyüme projeksiyonlarımıza göre bu rakam üçe katlanacak. Karar vermemiz gerekiyor."
Serverless Framework'ü dört yıldır kullanıyordum. Rahat, tanıdık geliyordu ve 12 kişilik ekibimiz onu çok iyi biliyordu. Ama deployment tooling için projektif 7.200 dolar/ay faturaya - tüm AWS altyapımıza harcadığımızdan fazlasına - bakarken bir sorunumuz olduğunu anladım.
Bu, 47 Lambda fonksiyonu, 12 DynamoDB tablosu ve 2.8M$ ARR platformumuzu Serverless Framework'ten AWS CDK'ya neden migrate ettiğimizin hikayesi. Teorik bir karşılaştırma değil, altyapı tooling maliyetlerimiz gerçek AWS harcamamızı aşmaya başladığında karşılaştığımız gerçek karar alma süreci, finansal analiz ve teknik trade-off'lar.
Bu altı bölümlük seri, 4 aylık tam migration yolculuğunu anlatıyor:
- Bölüm 1: Neden migrate? Trade-off'ları anlama (bu yazı)
- Bölüm 2: CDK environment ve proje yapısı kurulumu
- Bölüm 3: Lambda fonksiyonları ve API Gateway migrate etme
- Bölüm 4: Veritabanı kaynakları ve environment yönetimi
- Bölüm 5: Authentication, authorization ve IAM
- Bölüm 6: Migration stratejileri ve Best Practice'ler
2.4M Dolarlık Karar Framework'ü#
2.8M$ ARR'ye hizmet veren altyapıdan sorumlu olduğunuzda, her karar ROI analizi gerektiriyor. İşte board'u migration'ı onaylamaya ikna eden spreadsheet:
Gerçek Maliyet Analizi (Kasım 2024)#
Mevcut Serverless Framework maliyetleri:
- 4 environment × 12 servis = günde 48 deployment
- Ayda 1.440 deployment,
$2.880/ay
- Projektif büyüme: Q2 2025'e kadar 150% = $7.200/ay
Keşfettiğimiz gizli maliyetler:
- Plugin bakımı: 15 saat/ay ($3.250 mühendislik zamanı)
- YAML sorunları debugging: 8 saat/ay ($1.200 mühendislik zamanı)
- Cross-team dependency blokerleri: 12 saat/ay ($1.800 mühendislik zamanı)
- Toplam aylık maliyet: $12.450
CDK alternatifi:
- AWS CDK: Ücretsiz (AWS CLI'nın parçası)
- Migration maliyeti: $45.000 (3 ay × 3 mühendis × $5K/ay)
- Devam eden maintenance: 5 saat/ay ($750 mühendislik zamanı)
- Break-even noktası: 4.2 ay
Rakamlar netti, ama rakamlar hikayenin tamamını anlatmıyor. Bu kararı gerçekten neyin yönlendirdiğini paylaşayım.
Deal'i Mühürleyen Üç Production Incident'ı#
Finansal durum ikna ediciyken, üç spesifik production incident'ı migration için teknik durumu oluşturdu:
Incident #1: 12K Dolara Mal Olan YAML Typo'su (Eylül 2024)#
Senior mühendisimiz rutin konfigürasyon değişikliği gibi görünen şeyi deploy etti:
# serverless.yml - 12K dolarlık typo
provider:
environment:
STRIPE_API_KEY: ${env:STRIPE_API_KEY}
STRIPE_WEBHOOK_SECRET: ${env:STRIPE_WEBHOOK_SECRE} # 'T' eksik
Typo payment webhook'larımızın 6 saat boyunca sessizce başarısız olmasına neden oldu. Yakaladığımızda, başarısız abonelik yenilemelerinde 12.000 dolar kaybetmiştik ve payment state'ini reconcile etmek için 8 saat daha harcadık.
CDK eşdeğeri bunu compile time'da yakalardı:
// Bu compile olmaz
const webhookSecret = process.env.STRIPE_WEBHOOK_SECRE; // Error: undefined
Incident #2: Plugin Dependency Hell (Ekim 2024)#
Node.js 18'den 20'ye basit version upgrade'i deployment pipeline'ımızı bozdu. Sorun? serverless-webpack
plugin'imiz yeni Node versiyonuyla uyumlu değildi, ama error mesajı anlaşılmazdı:
Serverless Error: Cannot read property 'compilation' of undefined
Ekibimizin root cause'u bulması 3 gün boyunca 16 saat aldı. Bu süre boyunca hiç fix veya feature deploy edemedik. Hızımız sıfıra düştü.
CDK ile tüm toolchain'i kontrol ediyoruz:
// Plugin dependency yok, sadece standart Node.js
const bundling = {
target: 'node20',
minify: true,
sourceMap: true,
};
Incident #3: Cross-Stack Reference Kabusu (Kasım 2024)#
Authentication servisimizin database stack'imizden çıktıları reference etmesi gerekiyordu. Serverless Framework yaklaşımı bu kırılgan kurulumu gerektiriyordu:
# auth-service/serverless.yml
provider:
environment:
USER_TABLE_ARN: ${cf:database-stack-${opt:stage}.UserTableArn}
Daha iyi organizasyon için database stack'ini yeniden adlandırdığımızda, 4 farklı servis aynı anda bozuldu. Deployment sırası kritik hale geldi ve yeni mühendisler sürekli bu implicit dependency'lere takılıyordu.
CDK dependency'leri explicit ve type-safe yapar:
// Doğrudan object reference'ları, string interpolation yok
const authStack = new AuthStack(this, 'AuthStack', {
userTable: databaseStack.userTable, // TypeScript bunun var olduğunu zorunlu kılar
});
TypeScript Infrastructure Her Şeyi Neden Değiştiriyor#
# serverless.yml
provider:
name: aws
runtime: nodejs20.x
environment:
TABLE_NAME: ${self:service}-${opt:stage}-users
functions:
createUser:
handler: src/handlers/users.create
events:
- http:
path: users
method: post
cors: true
CDK hem infrastructure hem application kodu için TypeScript'i kullanır:
// lib/api-stack.ts
import { RestApi, LambdaIntegration } from 'aws-cdk-lib/aws-apigateway';
import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';
const createUserFn = new NodejsFunction(this, 'CreateUserFunction', {
entry: 'src/handlers/users.ts',
handler: 'create',
environment: {
TABLE_NAME: userTable.tableName,
},
});
// Type-safe integration
const api = new RestApi(this, 'UserApi');
api.root.addResource('users').addMethod('POST',
new LambdaIntegration(createUserFn)
);
Faydalar şunları içeriyor:
- Compile-time error tespiti
- IDE autocompletion
- Refactoring desteği
- Type-safe environment variable'lar
2. Native AWS Servis Entegrasyonu#
Serverless Framework gelişmiş AWS servisleri için plugin'ler gerektiriyor:
plugins:
- serverless-step-functions
- serverless-appsync-plugin
- serverless-plugin-aws-alerts
custom:
alerts:
stages:
- production
topics:
alarm:
topic: ${self:service}-${opt:stage}-alerts
CDK tüm AWS servisleri için native construct'lar sağlıyor:
import { StateMachine } from 'aws-cdk-lib/aws-stepfunctions';
import { LambdaInvoke } from 'aws-cdk-lib/aws-stepfunctions-tasks';
import { GraphqlApi } from 'aws-cdk-lib/aws-appsync';
import { Alarm } from 'aws-cdk-lib/aws-cloudwatch';
// Plugin olmadan doğrudan servis entegrasyonu
const workflow = new StateMachine(this, 'UserWorkflow', {
definition: new LambdaInvoke(this, 'ProcessUser', {
lambdaFunction: processUserFn,
}),
});
const api = new GraphqlApi(this, 'UserGraphQL', {
name: 'user-api',
schema: SchemaFile.fromAsset('schema.graphql'),
});
3. Infrastructure Composition ve Reusability#
Serverless Framework include'lar ve variable'lar kullanır:
# serverless.yml
custom:
userTableConfig: ${file(./config/tables.yml):userTable}
resources:
Resources:
UserTable: ${self:custom.userTableConfig}
CDK gerçek object-oriented infrastructure sağlar:
// lib/constructs/serverless-api.ts
export class ServerlessApi extends Construct {
public readonly api: RestApi;
public readonly functions: Map<string, NodejsFunction>;
constructor(scope: Construct, id: string, props: ServerlessApiProps) {
super(scope, id);
// Encapsulated, reusable infrastructure pattern'leri
this.api = new RestApi(this, 'Api', {
restApiName: props.apiName,
deployOptions: this.createDeployOptions(props.stage),
});
this.functions = this.createFunctions(props.routes);
this.setupRoutes(props.routes);
this.setupAlarms(props.monitoring);
}
}
// Birden fazla stack'te kullanım
new ServerlessApi(this, 'UserApi', {
apiName: 'users',
routes: userRoutes,
monitoring: productionMonitoring,
});
4. Infrastructure Testing#
Serverless Framework testi tipik olarak şunları içeriyor:
- Framework davranışını mock'lama
- Deploy edilmiş kaynakları test etme
- Sınırlı unit testing seçenekleri
CDK kapsamlı infrastructure test'i sağlıyor:
// test/api-stack.test.ts
import { Template } from 'aws-cdk-lib/assertions';
test('API Gateway has CORS enabled', () => {
const template = Template.fromStack(stack);
template.hasResourceProperties('AWS::ApiGateway::Method', {
Integration: {
IntegrationResponses: [{
ResponseParameters: {
'method.response.header.Access-Control-Allow-Origin': "'*'",
},
}],
},
});
});
test('Lambda has correct environment variables', () => {
template.hasResourceProperties('AWS::Lambda::Function', {
Environment: {
Variables: {
TABLE_NAME: { Ref: Match.anyValue() },
STAGE: 'production',
},
},
});
});
Ne Zaman Migrate Etmeli#
CDK Şunlar Gerektiğinde Üstün:#
- Karmaşık AWS servis entegrasyonu - Step Functions, EventBridge, AppSync
- Paylaşılan infrastructure pattern'leri - Ekipler arası reusable construct'lar
- Fine-grained kontrol - Custom CloudFormation kaynakları
- Strong typing - Stack'iniz boyunca TypeScript
- Infrastructure testing - IaC için unit ve integration testleri
Şu Durumlarda Serverless Framework'te Kalın:#
- Basit Lambda + API Gateway - Temel CRUD API'lar
- Mevcut plugin ekosistemi - Community plugin'lere yoğun bağımlılık
- Ekip YAML tercihi - TypeScript'te rahat olmayan developer'lar
- Hızlı prototipler - Hızlı proof-of-concept'ler
Migration Complexity Assessment#
Migrate etmeden önce mevcut kurulumunuzu değerlendirin:
interface MigrationComplexity {
functionCount: number;
customResources: boolean;
plugins: string[];
environments: number;
cicdIntegration: boolean;
}
function assessMigrationEffort(current: MigrationComplexity): string {
const pluginComplexity = current.plugins.filter(p =>
!['serverless-offline', 'serverless-webpack'].includes(p)
).length;
const score =
current.functionCount * 0.5 +
(current.customResources ? 20 : 0) +
pluginComplexity * 10 +
current.environments * 5 +
(current.cicdIntegration ? 15 : 0);
if (score <30) return 'Low - 1-2 hafta';
if (score <60) return 'Medium - 2-4 hafta';
return 'High - 1-2 ay';
}
Migration Karar Framework'ü#
15 yıllık infrastructure kararlarından sonra, büyük migration'ları nasıl değerlendirdiğim:
Finansal Etki Analizi#
Her şeyi ölçün:
- Doğrudan lisans maliyetleri (bariz)
- Gizli operasyonel maliyetler (debugging, maintenance, blocker'lar)
- Migration yatırımı (mühendislik zamanı, opportunity cost)
- Uzun vadeli TCO (5 yıllık projeksiyon)
Sonuçlarımız: 4.2 aylık geri ödeme, 2. yılda yıllık 140K$ tasarruf.
Teknik Risk Assessment#
Zor soruları sorun:
- Migration yarım kalırsa ne olur?
- İşler yanlış giderse hızlıca rollback yapabilir miyiz?
- Başarılı olmak için ekip uzmanlığımız var mı?
- Bir şey bozulursa blast radius ne?
Yaklaşımımız: Tam rollback capability ile blue-green migration stratejisi.
Ekip Hazırlık Değerlendirmesi#
Yeteneklerin dürüst değerlendirmesi:
- TypeScript yeterliliği: 12'de 8 mühendis rahat
- CDK deneyimi: 12'de 2 mühendis önceki deneyimle
- Mevcut kapasite: 3 ay için 3 mühendis
- Öğrenme eğrisi kabulü: Yüksek (ekip modern tooling konusunda heyecanlı)
Business Alignment#
Teknik kararları business sonuçlarına bağlayın:
- Daha hızlı feature delivery (daha iyi developer experience)
- Azaltılmış operasyonel overhead (daha az deployment sorunu)
- Gelişmiş güvenilirlik (compile-time error yakalama)
- Daha iyi güvenlik posture'ı (explicit IAM izinleri)
Ne Zaman Migrate ETMEMELİ#
Deneyimimize göre, şu durumlarda Serverless Framework'te kalın:
- TypeScript deneyimi olmayan küçük ekip - Öğrenme eğrisi hızınızı öldürür
- Seyrek deployment'lı basit uygulamalar - Tooling maliyetleri önemli olmayabilir
- Community plugin'lere yoğun bağımlılık - CDK ekosistemi daha küçük
- Riskten kaçan organizasyon - Endüstrinizdeki daha fazla CDK adoption'ı bekleyin
Go/No-Go Kararı#
Final karar kriterlerimiz:
- ✅ Finansal durum: 4.2 aylık geri ödeme
- ✅ Teknik faydalar: Compile-time safety, daha iyi testing
- ✅ Ekip yeteneği: 12'de 8 mühendis TypeScript-ready
- ✅ Business alignment: Daha hızlı development, daha az incident
- ✅ Risk mitigation: Blue-green deployment stratejisi
Sonuç: Migration'a devam etmek için oybirliği ekip kararı.
Sırada Ne Var#
Karar verildi. Şimdi zor kısım geldi: 2.8M$ ARR'ye hizmet veren production sisteminin zero-downtime migration'ını gerçekten execute etmek.
2. Bölüm'de, 47 Lambda fonksiyonunu tek bir production incident'ı olmadan migrate etmemizi sağlayan CDK proje yapısının kurulumunu anlatacağım. Bu migration'ı başarılı kılan proje mimarisi kararları, ekip workflow'ları ve development environment kurulumunu ele alacağız.
Spoiler alert: En zor kısım kod değildi - 12 mühendisi yönetmek, feature velocity'yi korumak ve 4 aylık infrastructure overhaul sırasında herkesi align tutmaktı.
The#
Yorumlar (0)
Sohbete katıl
Düşüncelerini paylaşmak ve toplulukla etkileşim kurmak için giriş yap
Henüz yorum yok
Bu yazı hakkında ilk düşüncelerini paylaşan sen ol!
Yorumlar (0)
Sohbete katıl
Düşüncelerini paylaşmak ve toplulukla etkileşim kurmak için giriş yap
Henüz yorum yok
Bu yazı hakkında ilk düşüncelerini paylaşan sen ol!