AWS Lambda ile Sunucusuz Mikroservis Geliştirme 2026

ÖZET

AWS Lambda ile Sunucusuz Mikroservis Geliştirme: Adım Adım Rehber 2026

Modern backend API’leri oluşturmak için AWS Lambda ve Serverless Framework kullanarak sunucusuz mikroservisleri sıfırdan geliştirmeyi öğrenin.

Anahtar Kelimeler: AWS Lambda, Serverless, Mikroservis


İÇİNDEKİLER

1. Sunucusuz Mimari: Neden Önemli?

2. AWS Lambda ve Mikroservis Temelleri

3. Serverless Framework ile Gelişime Başlangıç

4. Basit Bir Lambda Fonksiyonu Oluşturma ve Dağıtma

5. Veritabanı Entegrasyonu: DynamoDB Örneği

6. Gelişmiş Konular ve En İyi Uygulamalar

7. Sıkça Sorulan Sorular

8. Sonuç ve Gelecek Öngörüsü


ARKA PLAN

Sunucusuz Mimari: Neden Önemli?


Geleneksel sunucu yönetimi, modern uygulama geliştirmenin en büyük zorluklarından biri olmaya devam ediyor. Sunucuları provizyon etmek, yamalarını yapmak, güvenlik açıklarını kapatmak, ölçeklendirmek ve bakımını yapmak, geliştiricilerin ve operasyon ekiplerinin değerli zamanını tüketiyor. Özellikle yoğunluk dalgalanmaları yaşayan uygulamalar için bu süreç, hem maliyetli hem de verimsiz olabiliyor. İşte tam bu noktada, sunucusuz (serverless) mimari, 2026 yılı itibarıyla bulut bilişim dünyasında vazgeçilmez bir trend haline gelmiştir.

Sunucusuz mimari, geliştiricilerin altyapı yönetiminden tamamen soyutlanarak yalnızca kodlarına odaklanmasını sağlar. Bu modelde, uygulamalarınızın çalışması için gerekli olan sunucuların provizyonu, ölçeklendirilmesi ve bakımı bulut sağlayıcısı (örneğin AWS) tarafından otomatik olarak yönetilir. Siz sadece kodunuzu yazarsınız ve buluta yüklersiniz; gerisini bulut sağlayıcısı halleder.

Bu yaklaşımın sunduğu temel avantajlar, işletmeler için devrim niteliğindedir:

1. Maliyet Etkinliği: Sunucusuz modelde, kodunuz yalnızca çalıştığı süre boyunca ücretlendirilirsiniz. Geleneksel sunucularda olduğu gibi, uygulamanız boşta dururken bile kaynaklar için ödeme yapmazsınız. Örneğin, bir sanal makine (VM) 7/24 çalışmak zorunda kalırken, bir AWS Lambda fonksiyonu sadece bir istek geldiğinde saniyeler veya milisaniyeler boyunca aktif olur. Bu, özellikle düşük ve değişken trafikli uygulamalar için ciddi maliyet tasarrufu sağlar. Yapılan analizlere göre, birçok durumda sunucusuz mimariye geçişle %30 ila %60 arasında altyapı maliyeti düşüşü gözlemlenebilmektedir.

2. Otomatik Ölçekleme: Uygulamanızın trafik yükü ne olursa olsun, sunucusuz platformlar talebi otomatik olarak karşılayacak şekilde ölçeklenir. Tek bir istekten binlerce eşzamanlı isteğe kadar herhangi bir manuel müdahaleye gerek kalmadan sisteminiz uyum sağlar. Bu, özellikle Kara Cuma gibi yoğun dönemlerde veya viral olan uygulamalar için kritik bir avantajdır.

3. Yönetim Yükünün Azalması: İşletim sistemi güncellemeleri, güvenlik yamaları, sunucu bakımı gibi altyapı görevleri tamamen bulut sağlayıcısının sorumluluğundadır. Geliştirme ekipleri, bu operasyonel yükten kurtularak iş mantığına, yeni özellik geliştirmeye ve inovasyona daha fazla odaklanabilir. Bu durum, “operasyonel mükemmellik” hedefine ulaşmada önemli bir adımdır.

AWS Lambda, Amazon Web Services’ın bu sunucusuz devrimin öncüsü olan “Fonksiyon Hizmet Olarak” (FaaS – Function as a Service) ürünüdür. Geliştiricilerin kodlarını küçük, bağımsız fonksiyonlar halinde çalıştırmasına olanak tanır. Serverless Framework ise, bu Lambda fonksiyonlarını ve ilişkili AWS kaynaklarını (API Gateway, DynamoDB vb.) kolayca tanımlamak, dağıtmak ve yönetmek için kullanılan açık kaynaklı bir araçtır. Bu rehberde, bu iki güçlü aracı birleştirerek, 2026’nın modern backend geliştirme standartlarına uygun, sunucusuz bir mikroservis API’si oluşturmayı adım adım öğreneceğiz.

ÖNEMLİ NOKTA

Sunucusuz mimari, altyapı yönetim yükünü ortadan kaldırarak geliştiricilerin ana iş mantığına odaklanmasını sağlar. Bu sayede maliyetler düşer, ölçeklenebilirlik artar ve pazara çıkış süresi kısalır. 2026 yılında modern uygulamaların belkemiğini oluşturmaktadır.

Sunucusuz mimari diyagramı: Olay kaynakları, Lambda fonksiyonları ve veritabanları


TEMELLER

AWS Lambda ve Mikroservis Temelleri


Sunucusuz mimarinin kalbinde yer alan AWS Lambda, geliştiricilerin kodlarını sunucuları provizyon etme veya yönetme ihtiyacı olmadan çalıştırmasına olanak tanıyan bir bilgi işlem hizmetidir. Lambda, olay tabanlı bir modelle çalışır; yani kodunuz yalnızca belirli bir olay (örneğin, bir HTTP isteği, bir S3 nesnesinin yüklenmesi, bir veritabanı kaydının değişmesi) gerçekleştiğinde tetiklenir. Bu, kaynak kullanımını optimize ederek maliyetleri düşürür ve verimliliği artırır.

Lambda fonksiyonları, Node.js, Python, Java, C#, Go, Ruby ve PowerShell gibi çeşitli programlama dillerini destekler. Ayrıca, özel çalışma zamanları (custom runtimes) sayesinde istediğiniz herhangi bir dilde kod yazıp Lambda üzerinde çalıştırabilirsiniz. Her bir Lambda fonksiyonu, bağımsız bir yürütme ortamında çalışır ve kendi bellek, CPU ve ağ kaynaklarına sahiptir.

Peki, mikroservisler nedir ve AWS Lambda ile ilişkisi nasıl kurulur? Mikroservis mimarisi, büyük ve karmaşık bir uygulamayı, her biri kendi iş sorumluluğuna sahip, bağımsız olarak geliştirilebilen, dağıtılabilen ve ölçeklenebilen küçük, hafif hizmetlere bölme yaklaşımıdır. Geleneksel monolitik mimarilerin aksine, mikroservisler daha çevik bir geliştirme süreci, daha kolay bakım ve daha iyi hata izolasyonu sunar.

AWS Lambda, mikroservis mimarisini doğal bir şekilde tamamlar. Her bir Lambda fonksiyonu, tek bir iş sorumluluğuna odaklanan küçük bir mikroservis olarak düşünülebilir. Örneğin, bir e-ticaret uygulamasında “ürünleri listele”, “sipariş oluştur” veya “kullanıcıyı doğrula” gibi her bir işlem için ayrı bir Lambda fonksiyonu oluşturulabilir. Bu fonksiyonlar, API Gateway aracılığıyla dış dünyaya açılır ve birbirleriyle güvenli bir şekilde iletişim kurabilir. Bu sayede, uygulamanın farklı parçaları birbirinden bağımsız olarak geliştirilebilir, test edilebilir ve dağıtılabilir.

AWS Lambda’nın Temel Özellikleri

Olay Tetikleyiciler — HTTP istekleri, veritabanı değişiklikleri, dosya yüklemeleri gibi çeşitli AWS hizmetleri tarafından tetiklenebilir.

Çoklu Dil Desteği — Node.js, Python, Java, C#, Go, Ruby ve PowerShell dahil birçok programlama dilini destekler.

Otomatik Ölçeklendirme — Gelen talebe göre fonksiyon örneklerini otomatik olarak başlatır ve sonlandırır.

Maliyet Optimizasyonu — Yalnızca kodunuzun çalıştığı süre için ödeme yaparsınız (milisaniye bazında).

Yönetimsiz Sunucular — Sunucu provizyonu, yamalama, bakım ve işletim sistemi yönetimi AWS tarafından yapılır.

Birden çok Lambda fonksiyonunun API Gateway üzerinden iletişim kurduğu mikroservis mimarisi diyagramı


KURULUM

Serverless Framework ile Gelişime Başlangıç


Serverless Framework, AWS Lambda gibi sunucusuz platformlarda uygulama geliştirmeyi, dağıtmayı ve yönetmeyi inanılmaz derecede kolaylaştıran güçlü bir CLI (Komut Satırı Arayüzü) aracıdır. Bu framework, karmaşık AWS CloudFormation şablonlarını manuel olarak yazmak yerine, daha basit ve okunabilir bir YAML dosyası (serverless.yml) kullanarak tüm altyapınızı kod olarak (Infrastructure as Code – IaC) tanımlamanıza olanak tanır.

1. Ön Gereksinimler ve Kurulum

Serverless Framework’ü kullanmaya başlamadan önce sisteminizde Node.js (tercihen LTS sürümü) ve npm’in yüklü olması gerekmektedir. Eğer yüklü değillerse, resmi Node.js web sitesinden indirip kurabilirsiniz. Daha sonra, Serverless Framework’ü global olarak yüklemek için aşağıdaki komutu çalıştırın:

KOD AÇIKLAMASI

Bu komut, Serverless Framework CLI’yı sisteminize global olarak kurar. Bu sayede serverless veya kısaca sls komutlarını doğrudan terminalinizden çalıştırabilirsiniz.


npm install -g serverless

Kurulumdan sonra, AWS hesabınızla Serverless Framework’ün iletişim kurabilmesi için AWS kimlik bilgilerinizi yapılandırmanız gerekir. Bu genellikle AWS CLI kullanılarak yapılır:

aws configure
AWS Access Key ID [None]: AKIA...
AWS Secret Access Key [None]: wJalr...
Default region name [None]: us-east-1
Default output format [None]: json

Eğer yoksa, AWS Yönetim Konsolu’ndan bir IAM kullanıcısı oluşturup ona programatik erişim için bir Erişim Anahtarı Kimliği ve Gizli Erişim Anahtarı atamanız gerekecektir. Bu kullanıcının Lambda, API Gateway, S3 gibi ilgili servislere tam erişim izni olduğundan emin olun.

2. Yeni Bir Proje Oluşturma

Şimdi, Serverless Framework kullanarak yeni bir proje oluşturalım. Biz Node.js tabanlı bir Lambda fonksiyonu kullanacağımız için aws-nodejs şablonunu kullanacağız:

KOD AÇIKLAMASI

Bu komut, “my-microservice” adında yeni bir dizin oluşturur ve içine temel bir Serverless projesi şablonunu kopyalar. Bu şablon, serverless.yml yapılandırma dosyası ve örnek bir handler.js Lambda fonksiyonunu içerir.


serverless create --template aws-nodejs --path my-microservice
cd my-microservice

3. serverless.yml Yapısı

Proje dizinine girdikten sonra, serverless.yml dosyasını açın. Bu dosya, sunucusuz uygulamanızın kalbidir ve tüm AWS kaynaklarınızın (Lambda fonksiyonları, API Gateway, DynamoDB tabloları vb.) nasıl yapılandırılacağını tanımlar. İşte başlangıçtaki içeriği:

KOD AÇIKLAMASI

Bu serverless.yml dosyası, uygulamanızın adını (service), AWS sağlayıcısını (provider) ve ilk Lambda fonksiyonunu (functions) tanımlar. runtime Node.js sürümünü, region ise AWS bölgesini belirtir.


# serverless.yml
service: my-microservice

provider:
  name: aws
  runtime: nodejs18.x
  region: us-east-1 # Kendi bölgenizi seçebilirsiniz (örn. eu-central-1)
  stage: dev
  memorySize: 128 # MB
  timeout: 30 # Saniye

functions:
  hello:
    handler: handler.hello

Bu temel yapılandırma, Serverless Framework’ün AWS üzerinde uygulamanızı nasıl oluşturacağını ve çalıştıracağını belirler. service anahtar kelimesi uygulamanızın genel adını, provider ise kullanılacak bulut sağlayıcısını (bu durumda AWS) ve genel ayarları (çalışma zamanı, bölge, aşama vb.) tanımlar. functions bölümü ise dağıtılacak her bir Lambda fonksiyonunu ve bunların özelliklerini listeler.

ÖNEMLİ NOKTA

Serverless Framework, serverless.yml dosyası aracılığıyla altyapınızı kod olarak tanımlamanızı sağlar. Bu, tekrarlanabilir dağıtımlar, versiyon kontrolü ve ekipler arası işbirliği için kritik öneme sahiptir.


UYGULAMA

Basit Bir Lambda Fonksiyonu Oluşturma ve Dağıtma


Şimdi, Serverless Framework’ün gücünü kullanarak ilk basit Lambda fonksiyonumuzu oluşturalım ve onu bir HTTP endpoint’i olarak dünyaya açalım. Bu bölüm, temel bir “Hello World” API’sinin nasıl kodlandığını, yapılandırıldığını ve AWS’ye nasıl dağıtıldığını gösterecektir.

1. Lambda Fonksiyonu Kodu (handler.js)

Örnek projemizin içinde zaten bir handler.js dosyası bulunmaktadır. Bu dosyayı açıp içeriğini aşağıdaki gibi güncelleyelim. Bu fonksiyon, basitçe bir HTTP isteğini karşılayacak ve bir JSON cevabı dönecektir.

KOD AÇIKLAMASI

Bu Node.js Lambda fonksiyonu, bir HTTP isteği aldığında tetiklenir. event objesi gelen isteğin tüm detaylarını (HTTP metodu, path, query parametreleri vb.) içerir. Fonksiyon, basit bir statusCode ve JSON formatında bir body ile cevap verir.


// handler.js
'use strict';

module.exports.hello = async (event) => {
  return {
    statusCode: 200,
    headers: {
      'Content-Type': 'application/json',
      'Access-Control-Allow-Origin': '*', // CORS için gerekli
    },
    body: JSON.stringify(
      {
        message: 'Merhaba Kwontrol okuyucuları! Bu sizin ilk sunucusuz API\'niz!',
        input: event,
        timestamp: new Date().toISOString(),
      },
      null,
      2
    ),
  };
};

2. serverless.yml‘i Güncelleme

Bu Lambda fonksiyonunu bir HTTP endpoint’i olarak dış dünyaya açmak için serverless.yml dosyasını güncellememiz gerekiyor. functions.hello altına bir events bölümü ekleyerek API Gateway tetikleyicisini tanımlayacağız.

KOD AÇIKLAMASI

Bu yapılandırma, hello fonksiyonunun bir HTTP isteği ile tetikleneceğini belirtir. path: hello, API Gateway’de /hello URL’ine yapılan isteklere yanıt vereceğini, method: get ise sadece GET isteklerini kabul edeceğini gösterir.


# serverless.yml (güncellenmiş bölüm)

functions:
  hello:
    handler: handler.hello
    events:
      - http:
          path: hello
          method: get
          cors: true # Tarayıcıdan erişim için CORS'u etkinleştirir

3. Dağıtım ve Test Etme

Artık fonksiyonumuzu AWS’ye dağıtmaya hazırız. Proje dizininizde aşağıdaki komutu çalıştırın:

KOD AÇIKLAMASI

Bu komut, Serverless Framework’ün serverless.yml dosyasını okuyarak gerekli AWS kaynaklarını (Lambda fonksiyonu, IAM rolleri, API Gateway endpoint’i) oluşturmasını ve kodunuzu AWS S3’e yükleyip Lambda’ya dağıtmasını sağlar. İlk dağıtım biraz zaman alabilir.


sls deploy

Dağıtım tamamlandığında, terminalinizde API Gateway tarafından oluşturulan bir endpoint URL’si göreceksiniz. Bu URL’yi kopyalayın ve tarayıcınızda veya curl gibi bir araçla test edin:

curl https://YOUR_API_GATEWAY_ID.execute-api.us-east-1.amazonaws.com/dev/hello

Cevap olarak, handler.js dosyasında tanımladığımız JSON mesajını görmelisiniz. Tebrikler, ilk sunucusuz mikroservis API’nizi başarıyla dağıttınız!

ADIM ADIM DAĞITIM

Sunucusuz Mikroservis Dağıtım Adımları

1. Gerekli Node.js bağımlılıklarını kurun (npm install).

2. serverless.yml dosyasını uygulamanızın gereksinimlerine göre yapılandırın.

3. Lambda fonksiyon kodunuzu (handler.js veya benzeri) geliştirin.

4. Terminalde sls deploy komutunu çalıştırarak kaynakları AWS’ye dağıtın.

5. Dağıtım çıktısındaki API Gateway URL’sini kullanarak fonksiyonunuzu test edin.

AWS Lambda konsolunda dağıtılmış bir fonksiyonun genel görünümünü gösteren ekran görüntüsü


ENTEGRASYON

Veritabanı Entegrasyonu: DynamoDB Örneği


Çoğu mikroservis uygulaması, verileri depolamak ve almak için bir veritabanına ihtiyaç duyar. Sunucusuz mimaride, veritabanı seçimi de sunucusuz prensiplere uygun olmalıdır. AWS DynamoDB, bu ihtiyacı karşılamak için mükemmel bir seçenektir. DynamoDB, AWS’nin tam olarak yönetilen, sunucusuz, NoSQL bir veritabanıdır. Yüksek performans, otomatik ölçeklenebilirlik ve sıfır yönetim yükü sunar, bu da onu Lambda tabanlı uygulamalar için ideal kılar.

1. DynamoDB Tablosu Tanımlama

Serverless Framework ile DynamoDB tablosunu serverless.yml dosyasının resources bölümünde tanımlayabiliriz. Bu, tablonun dağıtımını da uygulamanızla birlikte yönetmenizi sağlar.

KOD AÇIKLAMASI

Bu yapılandırma, products adında bir DynamoDB tablosu oluşturur. AttributeDefinitions ve KeySchema, tablonun birincil anahtarını (id) tanımlar. BillingMode: PAY_PER_REQUEST, sunucusuz kullanım için ideal olan isteğe bağlı faturalandırmayı etkinleştirir.


# serverless.yml (resources bölümü ekleniyor)

resources:
  Resources:
    ProductsTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: products-${self:provider.stage}
        AttributeDefinitions:
          - AttributeName: id
            AttributeType: S
        KeySchema:
          - AttributeName: id
            KeyType: HASH
        BillingMode: PAY_PER_REQUEST

2. IAM İzinleri

Lambda fonksiyonunuzun DynamoDB tablosuna erişebilmesi için gerekli izinlere sahip olması gerekir. Bu izinler, serverless.yml dosyasındaki provider.iamRoleStatements altına eklenir.

KOD AÇIKLAMASI

Bu IAM rol beyanı, Lambda fonksiyonuna products-${self:provider.stage} tablosunda dynamodb:GetItem, dynamodb:PutItem, dynamodb:UpdateItem ve dynamodb:DeleteItem işlemleri için izin verir. Fn::GetAtt, dağıtım sırasında tablo adını dinamik olarak almak için kullanılır.


# serverless.yml (provider bölümüne ekleniyor)

provider:
  name: aws
  runtime: nodejs18.x
  region: us-east-1
  stage: dev
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:UpdateItem
        - dynamodb:DeleteItem
        - dynamodb:Scan
      Resource:
        - Fn::GetAtt: [ProductsTable, Arn]
        - Fn::Join:
            - ':'
            -
              - 'arn:aws:dynamodb'
              - Ref: AWS::Region
              - Ref: AWS::AccountId
              - 'table/products-${self:provider.stage}/*'
SORUN 01

Yetersiz IAM İzinleri

Lambda fonksiyonunuzun DynamoDB’ye erişmek için gerekli izinlere sahip olmaması, AccessDeniedException hatalarına yol açar. Bu, genellikle iamRoleStatements bölümünün eksik veya yanlış yapılandırılmasıyla ortaya çıkar.

ÇÖZÜM — En Az Yetki Prensibi ile İzinleri Yapılandırma

# serverless.yml'deki provider bölümü altına ekleyin:
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:Scan
      Resource:
        - Fn::GetAtt: [ProductsTable, Arn]
        - Fn::Join:
            - ':'
            -
              - 'arn:aws:dynamodb'
              - Ref: AWS::Region
              - Ref: AWS::AccountId
              - 'table/products-${self:provider.stage}/*'

3. Lambda Kodu ile DynamoDB Etkileşimi

Şimdi, handler.js dosyamızı güncelleyerek DynamoDB’ye ürün ekleyen ve ürünleri listeleyen iki yeni fonksiyon ekleyelim. AWS SDK’sını kullanarak DynamoDB ile etkileşime geçeceğiz.

KOD AÇIKLAMASI

Bu kod, AWS SDK’sını kullanarak DynamoDB ile etkileşim kurar. createProduct fonksiyonu gelen HTTP POST isteğindeki verileri alır ve PutCommand ile DynamoDB’ye kaydeder. getProducts fonksiyonu ise ScanCommand kullanarak tüm ürünleri getirir. Her iki fonksiyon da process.env.DYNAMODB_TABLE ortam değişkenini kullanarak tablo adını alır.


// handler.js (güncellenmiş)
'use strict';

const { DynamoDBClient } = require('@aws-sdk/client-dynamodb');
const { DynamoDBDocumentClient, PutCommand, ScanCommand } = require('@aws-sdk/lib-dynamodb');
const { v4: uuid } = require('uuid');

const client = new DynamoDBClient({});
const ddbDocClient = DynamoDBDocumentClient.from(client);

module.exports.hello = async (event) => {
  return {
    statusCode: 200,
    headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' },
    body: JSON.stringify(
      {
        message: 'Merhaba Kwontrol okuyucuları! Bu sizin ilk sunucusuz API\'niz!',
        input: event,
        timestamp: new Date().toISOString(),
      },
      null,
      2
    ),
  };
};

module.exports.createProduct = async (event) => {
  try {
    const reqBody = JSON.parse(event.body);
    const { name, description, price } = reqBody;
    const id = uuid();
    const createdAt = new Date().toISOString();

    const params = {
      TableName: process.env.DYNAMODB_TABLE,
      Item: {
        id,
        name,
        description,
        price,
        createdAt,
      },
    };

    await ddbDocClient.send(new PutCommand(params));

    return {
      statusCode: 201,
      headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' },
      body: JSON.stringify({ message: 'Product created successfully', product: params.Item }),
    };
  } catch (error) {
    console.error(error);
    return {
      statusCode: 500,
      headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' },
      body: JSON.stringify({ message: 'Could not create product', error: error.message }),
    };
  }
};

module.exports.getProducts = async (event) => {
  try {
    const params = {
      TableName: process.env.DYNAMODB_TABLE,
    };

    const result = await ddbDocClient.send(new ScanCommand(params));

    return {
      statusCode: 200,
      headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' },
      body: JSON.stringify({ products: result.Items }),
    };
  } catch (error) {
    console.error(error);
    return {
      statusCode: 500,
      headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' },
      body: JSON.stringify({ message: 'Could not retrieve products', error: error.message }),
    };
  }
};

4. serverless.yml Fonksiyon Tanımları

Yeni fonksiyonları ve DynamoDB tablosunu kullanmak için serverless.yml dosyamızı daha da güncellememiz gerekiyor. functions bölümüne yeni Lambda’ları ekleyecek ve provider bölümüne DynamoDB tablo adını bir ortam değişkeni olarak tanımlayacağız.

KOD AÇIKLAMASI

Bu güncellenmiş serverless.yml, iki yeni Lambda fonksiyonunu (createProduct ve getProducts) tanımlar ve her birine API Gateway endpoint’leri atar. Ayrıca, DYNAMODB_TABLE ortam değişkenini belirterek fonksiyonların doğru DynamoDB tablosuna erişmesini sağlar.


# serverless.yml (tamamlanmış hali)
service: my-microservice

frameworkVersion: '3'

provider:
  name: aws
  runtime: nodejs18.x
  region: us-east-1
  stage: dev
  environment:
    DYNAMODB_TABLE: products-${self:provider.stage}
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:UpdateItem
        - dynamodb:DeleteItem
        - dynamodb:Scan
      Resource:
        - Fn::GetAtt: [ProductsTable, Arn]
        - Fn::Join:
            - ':'
            -
              - 'arn:aws:dynamodb'
              - Ref: AWS::Region
              - Ref: AWS::AccountId
              - 'table/products-${self:provider.stage}/*'

functions:
  hello:
    handler: handler.hello
    events:
      - http:
          path: hello
          method: get
          cors: true
  createProduct:
    handler: handler.createProduct
    events:
      - http:
          path: products
          method: post
          cors: true
  getProducts:
    handler: handler.getProducts
    events:
      - http:
          path: products
          method: get
          cors: true

resources:
  Resources:
    ProductsTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: products-${self:provider.stage}
        AttributeDefinitions:
          - AttributeName: id
            AttributeType: S
        KeySchema:
          - AttributeName: id
            KeyType: HASH
        BillingMode: PAY_PER_REQUEST

Bu değişiklikleri yaptıktan sonra, projenizin kök dizininde npm install @aws-sdk/client-dynamodb @aws-sdk/lib-dynamodb uuid komutunu çalıştırarak gerekli bağımlılıkları yüklemeyi unutmayın. Daha sonra sls deploy komutuyla güncel projeyi tekrar dağıtın.

ÖNEMLİ NOKTA

DynamoDB gibi sunucusuz veritabanları, Lambda ile mükemmel bir uyum içindedir. serverless.yml üzerinden hem Lambda fonksiyonlarını hem de veritabanı tablolarını tek bir dağıtım birimi olarak yönetmek, Infrastructure as Code (IaC) prensibini tam olarak benimsemenizi sağlar.

Lambda, API Gateway ve DynamoDB arasındaki veri akışını gösteren diyagram


EN İYİ UYGULAMALAR

Gelişmiş Konular ve En İyi Uygulamalar


Sunucusuz mikroservis geliştirme sadece fonksiyon yazmaktan ibaret değildir. Üretim ortamında stabil, güvenli ve performanslı çalışan uygulamalar oluşturmak için bazı gelişmiş konuları ve en iyi uygulamaları göz önünde bulundurmak gerekir. 2026 itibarıyla bu pratikler, sunucusuz sistemlerin olgunlaşmasıyla daha da önem kazanmıştır.

1. Hata Yönetimi ve İzleme

Lambda fonksiyonlarında hataları tespit etmek ve gidermek, geleneksel sunucu tabanlı uygulamalardan farklı bir yaklaşım gerektirir. AWS, bu konuda güçlü araçlar sunar:

CloudWatch Logs: Her Lambda fonksiyonu, varsayılan olarak tüm konsol çıktılarını (console.log, console.error vb.) CloudWatch Logs’a gönderir. Bu logları izleyerek fonksiyonlarınızdaki hataları ve performans sorunlarını görebilirsiniz. Serverless Framework, dağıtım sonrası sls logs -f functionName komutuyla bu loglara kolayca erişmenizi sağlar.

AWS X-Ray: Dağıtılmış izleme hizmeti olan X-Ray, isteklerin uygulamanızdaki farklı bileşenler arasında nasıl aktığını gösterir. Lambda fonksiyonlarından API Gateway’e, DynamoDB’den diğer AWS hizmetlerine kadar tüm çağrıları görselleştirerek performans darboğazlarını ve hataları hızlıca tespit etmenize yardımcı olur. serverless.yml dosyasında provider.tracing: Active ayarını yaparak X-Ray izlemeyi etkinleştirebilirsiniz.

2. Ortam Değişkenleri

Veritabanı bağlantı dizeleri, API anahtarları veya diğer yapılandırma parametreleri gibi hassas veya ortama özel bilgileri kod içine gömmek yerine ortam değişkenleri olarak tanımlamak en iyi uygulamadır. Serverless Framework, serverless.yml dosyasında bu değişkenleri kolayca yönetmenizi sağlar:

# serverless.yml
provider:
  # ... diğer ayarlar ...
  environment:
    DYNAMODB_TABLE: products-${self:provider.stage}
    API_KEY: ${ssm:/aws/reference/secretsmanager/my-secret-key~true} # SSM veya Secrets Manager kullanımı

Kodunuzda bu değişkenlere process.env.DYNAMODB_TABLE gibi erişebilirsiniz. Hassas bilgileri doğrudan YAML dosyasına yazmak yerine AWS Systems Manager Parameter Store veya AWS Secrets Manager gibi hizmetlerden çekmek güvenlik açısından daha iyidir.

3. Cold Start (Soğuk Başlangıç) Optimizasyonu

Lambda fonksiyonları, bir süre kullanılmadığında “boşta” duruma geçer. Bir istek geldiğinde, AWS yeni bir kapsayıcı başlatmalı, kodunuzu yüklemeli ve çalıştırmalıdır. Bu süreç, “cold start” veya “soğuk başlangıç” olarak adlandırılır ve ilk isteğe yanıt süresini artırabilir (genellikle milisaniyelerden birkaç saniyeye kadar). Cold start’ları hafifletmek için:

Küçük Paket Boyutları: Fonksiyonunuzun dağıtım paketini (kod ve bağımlılıklar) mümkün olduğunca küçük tutun. Daha küçük paketler daha hızlı yüklenir.

Provisioned Concurrency: Kritik iş yükleri için belirli sayıda Lambda fonksiyon örneğinin her zaman “sıcak” kalmasını sağlayabilirsiniz. Bu, ek maliyet getirse de cold start’ları tamamen ortadan kaldırır.

Optimize Edilmiş Çalışma Zamanları: Node.js ve Python gibi diller genellikle Java veya .NET’e göre daha hızlı cold start sürelerine sahiptir. Uygulamanızın performans gereksinimlerine göre dil seçimi yapın.

4. API Gateway Detayları ve Güvenlik

API Gateway, Lambda fonksiyonlarınızı HTTP/HTTPS üzerinden dış dünyaya açmanın birincil yoludur. Gelişmiş özellikleri şunları içerir:

Proxy Entegrasyonu: Lambda’nın tüm isteği işlemesine ve yanıtı döndürmesine izin verir. Bu, basitleştirilmiş yapılandırma ve daha esnek bir geliştirme deneyimi sağlar.

Özel Alan Adları (Custom Domains): Kendi alan adınızı (örneğin api.kwontrol.com) API Gateway’inizle ilişkilendirebilirsiniz.

Yetkilendirme (Authorization): Lambda Authorizer (eski adıyla Custom Authorizer), Cognito User Pools veya IAM gibi yöntemlerle API’lerinize erişimi kontrol edebilirsiniz. Bu, API güvenliği için hayati öneme sahiptir.

Artılar

Maliyet Optimizasyonu: Yalnızca kullanılan süreye göre ödeme yapıldığı için boşta kalan kaynak maliyeti yoktur.

Otomatik Ölçeklendirme: Talep artışlarına anında ve otomatik olarak adapte olur, manuel müdahale gerektirmez.

Daha Az Operasyonel Yük: Sunucu yönetimi, yamalama ve güvenlik güncellemeleri AWS tarafından sağlanır.

Daha Hızlı Geliştirme: Geliştiriciler altyapı yerine iş mantığına odaklanabilir, pazara çıkış süresi kısalır.

Yüksek Erişilebilirlik ve Hata Toleransı: Dahili olarak yüksek erişilebilirlik ve hata toleransı ile tasarlanmıştır.


Eksiler

Cold Start: Fonksiyonlar bir süre kullanılmadığında ilk istekte gecikme yaşanabilir.

Vendor Lock-in: Belirli bir bulut sağlayıcısına (AWS gibi) bağımlılık oluşabilir.

Karmaşık İzleme ve Hata Ayıklama: Dağıtık sistemler olduğu için izleme ve hata ayıklama daha zorlayıcı olabilir.

Kaynak Sınırlamaları: Bellek, çalışma süresi gibi Lambda fonksiyonları için belirli limitler bulunur.

Sunucusuz fonksiyonlarla entegre CloudWatch ve X-Ray gibi izleme araçlarını gösteren kavramsal diyagram


Sıkça Sorulan Sorular

Q. AWS Lambda kullanmak maliyetleri nasıl etkiler?

AWS Lambda, yalnızca kodunuzun çalıştığı süre boyunca sizi ücretlendirir, bu da boşta duran sunucu maliyetlerini ortadan kaldırır. Özellikle değişken veya düşük trafikli uygulamalar için önemli ölçüde maliyet tasarrufu sağlayabilir.

Q. Serverless Framework’ün AWS Lambda geliştirmedeki rolü nedir?

Serverless Framework, AWS Lambda fonksiyonları ve ilişkili AWS kaynaklarını (API Gateway, DynamoDB vb.) tek bir YAML dosyası (serverless.yml) kullanarak tanımlamanızı, dağıtmanızı ve yönetmenizi kolaylaştıran bir araçtır. Bu, “altyapı kod olarak” (IaC) prensibini benimsemenize yardımcı olur.

Q. Sunucusuz mikroservisler için hangi veritabanları tercih edilmelidir?

Sunucusuz mimaride, otomatik ölçeklenebilirlik ve yönetim kolaylığı sunan veritabanları tercih edilir. AWS DynamoDB (NoSQL) ve Amazon Aurora Serverless (ilişkisel) gibi tam olarak yönetilen ve isteğe bağlı ölçeklenen veritabanları ideal seçeneklerdir.

Q. Cold start nedir ve nasıl optimize edilir?

Cold start, bir Lambda fonksiyonunun uzun süre boşta kaldıktan sonra ilk kez çağrıldığında yaşanan ek gecikmedir. AWS’nin yeni bir yürütme ortamı başlatması ve kodunuzu yüklemesi gerektiğinden kaynaklanır. Optimize etmek için kod paket boyutunu küçültmek, Node.js gibi daha hızlı başlangıç dilleri kullanmak veya Provisioned Concurrency özelliğini kullanmak gibi yöntemler mevcuttur.

Q. Gelişmiş API Gateway özellikleri nelerdir?

API Gateway, Lambda fonksiyonlarınız için özel alan adları (custom domains) yapılandırmanıza, Lambda Authorizer veya Cognito User Pools ile gelişmiş yetkilendirme sağlamanıza, API anahtarları ile erişimi kısıtlamanıza ve API isteklerini önbelleğe almanıza olanak tanır.


SONUÇ

Sonuç ve Gelecek Öngörüsü


Bu rehber boyunca, AWS Lambda ve Serverless Framework kullanarak sıfırdan sunucusuz bir mikroservis API’si oluşturmanın temel adımlarını inceledik. Modern backend geliştirmenin vazgeçilmez bir parçası haline gelen sunucusuz mimarinin sunduğu avantajları, Lambda’nın olay tabanlı yapısını ve Serverless Framework’ün geliştirme sürecini nasıl basitleştirdiğini gördük. Basit bir “Hello World” fonksiyonundan DynamoDB entegrasyonuna kadar pratik örneklerle konuyu derinleştirdik.

2026 yılı ve sonrasında, sunucusuz teknolojilerin benimsenmesi hızla artmaya devam edecektir. Şirketler, operasyonel maliyetleri düşürmek, ölçeklenebilirliği artırmak ve geliştirme ekiplerinin inovasyona daha fazla odaklanmasını sağlamak için sunucusuz çözümlere yönelmektedir. AWS Lambda gibi FaaS hizmetleri ve Serverless Framework gibi yönetim araçları, bu dönüşümün temel taşlarıdır. Gelecekte, daha fazla otomasyon, daha akıllı hata ayıklama araçları ve daha entegre geliştirme deneyimleri bekleyebiliriz.

Bu rehber, sunucusuz dünyaya adım atmanız için sağlam bir temel sunmaktadır. Ancak unutmayın, gerçek ustalık pratikle gelir. Kendi projeleriniz üzerinde çalışmaya devam edin, farklı AWS hizmetlerini entegre etmeyi deneyin ve sunucusuz topluluğun sunduğu kaynakları keşfedin. Unutmayın, geleceğin backend geliştirme paradigması sunucusuzdur ve siz bu yolculuğa şimdiden çıktınız!


Okuduğunuz için teşekkürler!

Kwontrol olarak, modern teknoloji trendlerini anlaşılır bir dille sizlere sunmaya devam edeceğiz. Sunucusuz mimarinin potansiyelini keşfetmeye devam edin ve projelerinizi bir üst seviyeye taşıyın.

Bu rehber hakkında sorularınız mı var, yoksa kendi deneyimlerinizi mi paylaşmak istersiniz? Aşağıya yorum bırakın!.