Exploring Infinite Possibilities on FrontEnd 🚀
Burak Sağlık
Search...

Wed Sep 23 2026

AWS Secrets Manager vs Parameter Store: Hangi Secret Aracı Seçilmeli?

AWS Secrets Manager vs Parameter Store: Hangi Secret Aracı Seçilmeli?

🎯 Giriş: Neden Doğru Araç Seçimi Kritik?

Geçen yıl bir gece yarısı Slack'ten bir mesajla uyanmıştım: "Prod'da API keylerimiz GitHub'a pushlandı, hemen rotate etmemiz lazım!" 😱

O gece 3 saatimizi secret rotation, log temizliği ve müşteri haber verme ile geçirdik. Sorun? Bir junior geliştirici .env dosyasını yanlışlıkla commit'lemişti. Ama asıl sorun aracı yanlış seçmemizdi — local geliştirme için dotenv kullanıyorduk, production'da ise hiçbir merkezi secret yönetimi yoktu.

Bu hikayenin morali basit: gizli anahtar ve yapılandırma yönetiminde yanlış araç seçimi, küçük bir hatayı felakete çevirir. 🎯

Bu rehberde ne öğreneceksin?

  • AWS Secrets Manager vs Parameter Store vs .env — hangisi ne zaman? 🤔
  • Yanlış seçimlerin maliyeti: güvenlik ihlalleri, compliance cezaları, gece uyanmaları 💸
  • Best practice'ler: local → staging → prod akışında sorunsuz secret yönetimi ✅
  • Terraform / CDK / SAM ile Infrastructure as Code entegrasyonu 🛠

Neden AWS ortamında bu kadar kritik?

Risk Ne Olur?
🔓 Hardcoded secret Git history'de kalır, herkes görür
🔄 Rotation yok Sızan key yıllarca geçerli kalır
📋 Audit trail eksik Kim ne zaman erişti? Bilemezsiniz
⚖️ Compliance ihlali SOC2, ISO, KVKK cezaları

Hazırsan hadi başlayalım — doğru aracı doğru yerde kullanarak hem güvenli hem de developer-friendly bir yapı kuracağız. 🚀


🔁 Hizmetler Arası Temel Farklar: Secrets Manager vs Parameter Store

Hadi iki hizmeti yan yana koyalım ve ne zaman hangisini seçeceğimize hızlıca karar verelim 👇

🎯 Temel Amaç Farkı

Özellik Secrets Manager Parameter Store
Birincil hedef Hassas veriler (şifreler, API key'ler, DB credential'ları) Yapılandırma verileri + basit secret'lar
Otomatik rotasyon ✅ Yerleşik (Lambda ile) ❌ Manuel / custom çözüm gerekir
Hiyerarşik yapı ❌ Flat (düzeyli değil) /prod/db/password gibi path desteği
Şifreleme Her secret ayrı KMS key ile (varsayılan AWS managed) Tek KMS key (paylaşımlı) veya AWS managed
Versiyonlama ✅ Otomatik, her rotation'da yeni versiyon ✅ Basit versiyon numaraları
Cross-account erişim ✅ Resource policy ile kolay ✅ Policy ile mümkün ama daha zordur
Maliyet Secret başına $0.40/ay + API call ücreti Ücretsiz tier (10k parametre) + Standart tier $0.05/param/ay

🔁 Ne Zaman Hangisi?

Secrets Manager seç 👇

  • Veritabanı şifreleri, JWT secret'ları, OAuth token'ları gibi kritik credential'lar
  • Otomatik rotasyon istiyorsun (RDS, DocumentDB, Redshift için hazır Lambda'lar var)
  • Her secret için izole şifreleme ve denetim (audit) gerekiyorsa
  • Compliance (SOC, PCI, HIPAA) için detaylı erişim logları lazımsa

Parameter Store seç 👇

  • Uygulama ayarları: feature flag'ler, endpoint URL'leri, timeout değerleri
  • Hiyerarşik organizasyon istiyorsun: /prod/api/timeout, /staging/api/timeout
  • Maliyet hassas projelerde binlerce parametre varsa (Free tier yetebilir)
  • Basit secret'lar için ek maliyet istemiyorsan

🛠 Pratik Kural

Secret mi, config mi?

  • Secret → Secrets Manager
  • Config → Parameter Store
  • İkisi bir arada → Parameter Store (SecureString) başlangıç için yeterli olabilir, sonra büyürse migrate et

⚡ Hızlı Özet

  • Secrets Manager = "Benim şifrelerimi yönet, döndür, koru" 🛡️
  • Parameter Store = "Ayarlarımı düzenle, versiyonla, ucuza getir" 📦

Her ikisi de IAM policy ile erişim kontrolü destekler, her ikisi de KMS ile şifreler. Fark odak noktasında ve ek özelliklerde yatar.

Hazırsan sıradaki bölümde Secrets Manager'ı nasıl kurup ilk secret'ımızı oluşturacağımızı görelim 🚀


❗️ Maliyet Tuzağı: Hangisi Daha Uygun?

Serverless dünyasına adım attığında ilk karşılaştığın sürpriz genelde fatura olur 😅 "Ücretsiz katman var ya, neden ödüyorum?" diye soruyorsun kendine. Gelin beraber katman katman açalım bu onion'ı, neye para verdiğimizi anlayalım.

🎯 Temel Fiyatlandırma Bileşenleri

Her üç büyük sağlayıcı (AWS Lambda, Google Cloud Functions, Azure Functions) temelde aynı üç metrik üzerinde faturalandırır:

Bileşen Ne Anlama Gelir? Ölçü Birimi
İstek Sayısı Fonksiyonun kaç kez tetiklendiği Milyon istek başına $
Süre (Duration) Kodun ne kadar çalıştığı GB-saniye (GB-s)
Hafıza (Memory) Fonksiyona ayırdığın RAM miktarı GB (süre ile çarpılır)

Küçük bir not: Azure'da "Execution Time" olarak geçer, AWS'de "GB-seconds", GCP'de "GHz-seconds" — isimler farklı, mantık aynı ✅


🔁 Örnek Senaryolarla Maliyet Karşılaştırması

Hadi üç farklı ölçekte bir HTTP API fonksiyonu varsayalım:

  • Hafıza: 512 MB (0.5 GB)
  • Ortalama çalışma süresi: 200 ms (0.2 saniye)
  • Kod boyutu / cold start etkisi: Hesaba katılmıyor (ayrı bir dert 😅)

1️⃣ Küçük Ölçek — Ayda 100.000 İstek

İstek maliyeti (AWS Lambda örneği):
- İlk 1M istek: $0.00 (ücretsiz katman)
- Kalan: 0 istek → $0.00

Süre maliyeti:
- 100.000 × 0.2 s × 0.5 GB = 10.000 GB-s
- İlk 400.000 GB-s: $0.00 (ücretsiz katman)
- Toplam: $0.00 🎉

Sonuç: Küçük projelerde hiç para ödemezsin. Ücretsiz katmanlar harika bir "deneme ve öğren" alanı sunar.


2️⃣ Orta Ölçek — Ayda 5.000.000 İstek

İstek maliyeti:
- İlk 1M: $0.00
- Kalan 4M × $0.20/M = $0.80

Süre maliyeti:
- 5.000.000 × 0.2 s × 0.5 GB = 500.000 GB-s
- İlk 400.000 GB-s: $0.00
- Kalan 100.000 GB-s × $0.0000166667 = $1.67

💰 Toplam: ~$2.47 / ay

Ne oluyor burada? İstek maliyeti artıyor ama hâlâ kafe bir kahve fiyatında kalıyorsun ☕


3️⃣ Büyük Ölçek — Ayda 50.000.000 İstek

İstek maliyeti:
- İlk 1M: $0.00
- Kalan 49M × $0.20/M = $9.80

Süre maliyeti:
- 50.000.000 × 0.2 s × 0.5 GB = 5.000.000 GB-s
- İlk 400.000 GB-s: $0.00
- Kalan 4.600.000 GB-s × $0.0000166667 = $76.67

💰 Toplam: ~$86.47 / ay

Dikkat! Burada süre maliyeti istek maliyetini geride bırakıyor. Hafıza artırırsan (ör. 1024 MB) süre maliyeti 2 katına çıkar ama kodun daha hızlı çalışabilir — bu bir optimizasyon oyunu 🎮


🛠 Kendi Hesabını Yap: Basit Formül

Kendine bir Excel/Google Sheets hücresi yapıştır, parametreleri değiştir, anında gör:

# Değişkenler
ISTEK_SAYISI     = 5_000_000      # ayda kaç istek?
ORTALAMA_SURE_SN = 0.2            # saniye cinsinden
HAZIFA_GB        = 0.5            # GB cinsinden (512 MB = 0.5)

# Sabitler (AWS Lambda 2024 fiyatları - bölgeye göre değişir)
UCRETSIZ_ISTEK   = 1_000_000
UCRETSIZ_GB_S    = 400_000
ISTEK_FIYATI     = 0.20 / 1_000_000   # $ per istek
GB_S_FIYATI      = 0.0000166667       # $ per GB-s

# Hesaplama
ucretli_istek    = max(0, ISTEK_SAYISI - UCRETSIZ_ISTEK)
toplam_gb_s      = ISTEK_SAYISI * ORTALAMA_SURE_SN * HAZIFA_GB
ucretli_gb_s     = max(0, toplam_gb_s - UCRETSIZ_GB_S)

aylik_maliyet = (ucretli_istek * ISTEK_FIYATI) + (ucretli_gb_s * GB_S_FIYATI)

Bu formülle ne kazanırsın?

  • Hafıza artırırsan HAZIFA_GB değişir → süre azalabilir (daha fazla CPU) → ORTALAMA_SURE_SN düşer
  • Hangi kombinasyon en ucuz? Deneme yanılma yap, grafik çiz 📊

⚡️ Kural Parça Kural (Rule of Thumb)

Ayda 10M+ istek ve/veya ortalama süre > 500ms ise: Serverless hâlâ ucuzdur ama dedicated container (Cloud Run, Fargate, App Service) veya reserved instances ile %30-50 tasarruf edebilirsin.

Senaryo Tavsiye
< 1M istek/ay, kısa süre Serverless — ücretsiz katman yeter ✅
1M–10M istek, değişken trafik Serverless — ödeme yaptığın kadar kullanırsın 👍
> 10M istek, sabit/yüksek trafik Container / VM — reserved capacity al 💡
Çok uzun süreli işler (dakikalar) Serverless değil — timeout ve maliyet riski ⛔

💡 Pro İpucu: "Provisioned Concurrency" Tuzağı

AWS Lambda'da Provisioned Concurrency açarsan cold start gider ama saniyede $0.0000041667/GB ek maliyet getirir. 512 MB için ayda ~$1.50 boşta bile yakar. Küçük/orta projelerde açma, trafik öngörülebilir hale gelene kadar bekle ⏳


Özetle: Küçük başla, ücretsiz katmanı tüket, metriklerini izle (CloudWatch / Cloud Monitoring / Azure Monitor). Maliyet grafiğin doğrusal artıyorsa serverless uygun. Eğrisel (üstel) artmaya başladığında alternatifleri değerlendirmeye başla 🎯


🛠 Entegrasyon Kolaylığı: SDK, CLI ve IaC Örnekleri

İki hizmeti (Secrets Manager & Parameter Store) yan yana koyalım ve hangi yöntemle daha az kod / yapılandırma gerektiğini görelim 🎯


1️⃣ SDK Kullanımı (Python, Node.js, Go)

Hizmet Python (boto3) Node.js (AWS SDK v3) Go (plaintext)
Secrets Manager python<br>import boto3<br>client = boto3.client('secretsmanager')<br>resp = client.get_secret_value(SecretId='prod/db/password')<br>secret = resp['SecretString']<br> javascript<br>const { SecretsManagerClient, GetSecretValueCommand } = require('@aws-sdk/client-secrets-manager');<br>const client = new SecretsManagerClient({ region: 'us-east-1' });<br>const data = await client.send(new GetSecretValueCommand({ SecretId: 'prod/db/password' }));<br>const secret = data.SecretString;<br> plaintext<br>svc := secretsmanager.New(session.New())<br>out, _ := svc.GetSecretValue(&secretsmanager.GetSecretValueInput{SecretId: aws.String("prod/db/password")})<br>secret := *out.SecretString<br>
Parameter Store python<br>import boto3<br>ssm = boto3.client('ssm')<br>param = ssm.get_parameter(Name='/prod/db/password', WithDecryption=True)<br>value = param['Parameter']['Value']<br> javascript<br>const { SSMClient, GetParameterCommand } = require('@aws-sdk/client-ssm');<br>const client = new SSMClient({ region: 'us-east-1' });<br>const data = await client.send(new GetParameterCommand({ Name: '/prod/db/password', WithDecryption: true }));<br>const value = data.Parameter.Value;<br> plaintext<br>svc := ssm.New(session.New())<br>out, _ := svc.GetParameter(&ssm.GetParameterInput{Name: aws.String("/prod/db/password"), WithDecryption: aws.Bool(true)})<br>value := *out.Parameter.Value<br>

Ne oluyor burada?

  • Her iki hizmet de benzer bir API yapısı sunar.
  • Parameter Store için WithDecryption parametresi zorunlu (Secrets Manager’da varsayılan şifreli döner).
  • Kod satırı sayısı neredeyse aynı; fark hizmet seçiminde yatar, dilde değil.

2️⃣ AWS CLI Komutları 🔧

Hizmet Komut (bash)
Secrets Manager bash<br>aws secretsmanager get-secret-value --secret-id prod/db/password --query SecretString --output text<br>
Parameter Store bash<br>aws ssm get-parameter --name /prod/db/password --with-decryption --query Parameter.Value --output text<br>

İpucu: --query ile sadece değeri alıp pipeline’larda temiz çıktı elde edersiniz ✅


3️⃣ IaC – Terraform Örnekleri 🛠 (Plaintext)

Secrets Manager gizli anahtarı oluşturma

resource "aws_secretsmanager_secret" "db_password" {
  name        = "prod/db/password"
  description = "Veritabanı şifresi"
}

resource "aws_secretsmanager_secret_version" "db_password_version" {
  secret_id     = aws_secretsmanager_secret.db_password.id
  secret_string = var.db_password   # CI/CD'den gelen gizli değer
}

Parameter Store parametresi oluşturma (SecureString)

resource "aws_ssm_parameter" "db_password" {
  name        = "/prod/db/password"
  type        = "SecureString"
  value       = var.db_password
  description = "Veritabanı şifresi (Parameter Store)"
}

Ne fark var?

  • Secrets Manager: iki kaynak (secret + secret_version) → daha fazla blok.
  • Parameter Store: tek kaynak (aws_ssm_parameter) → daha az yapılandırma.
  • Her ikisi de şifreleme (KMS) varsayılan olarak destekler.

4️⃣ CloudFormation (Kısa Not) 📄

  • Secrets ManagerAWS::SecretsManager::Secret + AWS::SecretsManager::SecretTargetAttachment (isteğe bağlı).
  • Parameter StoreAWS::SSM::Parameter (tek kaynak).
  • Parameter Store yine daha az YAML/JSON satırı gerektirir.

5️⃣ Pratik İpuçları 💡

  • Küçük projeler / geliştirme ortamları için Parameter Store (Standard tier) ücretsiz ve yeterli.
  • Üretimde rotasyon, çoklu bölge, çapraz hesap erişim lazımsa Secrets Manager tercih edin.
  • SDK’larda GetSecretValue / GetParameter çağrılarını yeniden deneme (retry) ve önbellekleme ile sarmalayın ❗️
  • Terraform’da secret_string / value alanlarına değişken (var.xxx) verin, hard‑code etmeyin.
  • CLI çıktısını --output text ile alıp export DB_PASS=$(aws ...) şeklinde ortam değişkenine atayın 🚀

Özet:

  • Kod miktarı: SDK’larda benzer, CLI’da Parameter Store biraz daha kısa.
  • IaC: Parameter Store tek kaynak, Secrets Manager iki kaynakdaha az yapılandırma.
  • Seçim kriteri: Maliyet, rotasyon ihtiyacı, güvenlik politikası.

Hangi yöntem sizin işinize gelirse onu seçin, ikisi de production‑ready


🔁 Güvenlik ve Uyumluluk: Şifreleme, Rotasyon, Erişim Kontrolü

Hazırsan bu konuyu üç ana başlık altında hızlıca özetleyelim: şifreleme seçenekleri, anahtar rotasyonu ve ince taneli IAM kontrolü. Sonunda da PCI‑DSS ve HIPAA gibi standartlar için hangi servisin avantajlı olduğunu göreceksin. 🎯


1️⃣ Şifreleme Seçenekleri

Sağlayıcı KMS Yönetimi (Managed) Müşteri Yönetili Anahtar (CMK / Customer‑Managed Key)
AWS KMS Varsayılan AWS‑owned anahtarlar, şeffaf şifreleme. Kendi CMK oluşturursun, Key Policy ve Grants ile tam kontrol.
Azure Key Vault Microsoft‑managed anahtarlar, otomatik şifreleme. Customer‑managed keys (CMK) – HSM‑backed (Premium) veya software‑backed (Standard).
GCP Cloud KMS Google‑managed anahtarlar, varsayılan şifreleme. Customer‑managed encryption keys (CMEK) – proje/bölge bazında oluşturulur.

Ne zaman hangisini seçmelisin?

  • Hızlı başlangıç / düşük operasyonel yük → Managed anahtarlar yeterli.
  • Denetim, loglama, kendi HSM gereksinimi → CMK / CMEK yoluna git.

2️⃣ Otomatik Anahtar Rotasyonu 🔁

Sağlayıcı Varsayılan Rotasyon Manuel / Özel Rotasyon Desteği
AWS KMS Yıllık (365 gün) otomatik – etkinleştirilebilir. EnableKeyRotation API ile aç/kapat; özel dönem için CreateKey + ScheduleKeyDeletion kombinasyonu.
Azure Key Vault 90 gün (Premium HSM) / 365 gün (Standard) – otomatik. Rotation Policy (JSON) ile özel aralık (ör. 30 gün) tanımlanabilir.
GCP Cloud KMS 90 gün varsayılan – otomatik. RotationSchedule (cron‑style) ile gün/hafta/ay bazında özelleştirme.

Pratik ipucu: Rotasyon politikasını IaC (Terraform, Bicep, Deployment Manager) ile kodla; böylece auditörler “rotasyon etkin mi?” sorusuna tek bir dosya ile cevap verebilirsin. ✅


3️⃣ İncе Tanеli Erişim Kontrolü (IAM) 🛠

  • AWSKey Policy + IAM Policy + Grants.

    • Key Policy anahtara kim erişebileceğini resource‑level tanımlar.
    • Grants geçici, kısıtlı yetkiler (ör. Encrypt, Decrypt sadece belirli bir rol için).
  • AzureRBAC rolleri (Key Vault Crypto User, Key Vault Secrets User) + Access Policies (eski model) + Azure Policy ile zorunlu şifreleme.

  • GCPIAM Roles (roles/cloudkms.cryptoKeyEncrypterDecrypter, roles/cloudkms.admin) + Conditions (ör. request.time < timestamp('2025-12-31T00:00:00Z')).

Örnek: AWS Key Policy (JSON)

{
  "Version": "2012-10-17",
  "Id": "key-policy-example",
  "Statement": [
    {
      "Sid": "AllowAdmin",
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::123456789012:role/AdminRole" },
      "Action": "kms:*",
      "Resource": "*"
    },
    {
      "Sid": "AllowAppEncrypt",
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::123456789012:role/AppRole" },
      "Action": [ "kms:Encrypt", "kms:GenerateDataKey" ],
      "Resource": "*"
    }
  ]
}

Nasıl çalışıyor?

  • AdminRole anahtar yaşam döngüsü yönetimini (oluşturma, silme, rotasyon) yapabilir.
  • AppRole sadece veri şifreleme/anahtar üretme yetkisine sahip; Decrypt yetkisi yok → veri sızıntısı riski azalır.

4️⃣ Uyumluluk Açısından Değerlendirme (PCI‑DSS / HIPAA) ❗️

Kriter AWS KMS Azure Key Vault GCP Cloud KMS
FIPS 140‑2 Level 2/3 ✅ (HSM‑backed CMK) ✅ (Premium HSM) ✅ (Cloud HSM)
Otomatik Rotasyon + Audit Log ✅ (CloudTrail) ✅ (Azure Monitor / Log Analytics) ✅ (Cloud Audit Logs)
İnce Taneli IAM + Condition ✅ (Key Policy + IAM Conditions) ✅ (RBAC + Azure Policy) ✅ (IAM Conditions)
PCI‑DSS 3.2.1 Req. 3.5/3.6 Avantajlı – yönetilen HSM + rotasyon + loglama tek konsolda. Avantajlı – Azure Policy ile “şifreleme zorunlu” kuralı merkezi. Avantajlı – CMEK + VPC Service Controls ile veri sızıntısı engelleme.
HIPAA “Encryption at Rest & In Transit” ✅ (TLS 1.2+ + KMS) ✅ (TLS + Managed HSM) ✅ (TLS + CMEK)

Özet:

  • AWSEn geniş ekosistem ve CloudTrail entegrasyonu sayesinde PCI‑DSS raporlaması kolay.
  • AzureAzure Policy ile “tüm depolama hesapları şifreli olmalı” kuralını tek tıkla zorlayabilirsin; HIPAA için Azure Confidential Computing ekstra katman sunar.
  • GCPVPC Service Controls + CMEK kombinasyonu veri sızıntısını ağ seviyesinde engeller; özellikle veri yerleşimi (data residency) gerektiren HIPAA projelerde güçlü.

🎯 Kısa Çözüm Haritası

  1. Başlangıç: Managed anahtarlar + varsayılan rotasyon → hızlı MVP.
  2. Büyüme: CMK / CMEK oluştur → Key Policy / IAM Conditions ile least‑privilege.
  3. Uyumluluk: Rotasyon politikasını IaC’ye ekle, audit log’ları merkezi bir SIEM’e (Splunk, Elastic, CloudWatch, Sentinel, Chronicle) akışla.
  4. Denetim: Yıllık PCI‑DSS / HIPAA değerlendirmesinde “şifreleme, rotasyon, erişim kontrolü” maddelerini tek bir dashboard üzerinden kanıtla.

Hadi şimdi terraform / bicep / deployment manager şablonlarınızda bu politikaları kodlayalım ve gece rahat uyuyalım! 🚀


🎯 Karar Matrisi: Senaryo Bazlı Seçim Rehberi

Hazırsan başlayalım 🚀
Aşağıdaki tabloda satırlar = yaygın kullanım senaryoları, sütunlar = popüler secret/konfig yönetim hizmetleri.
Her hücrede senin ihtiyacına en uygun seçeneği bir bakışta görebilirsin.

Senaryo \ Hizmet HashiCorp Vault AWS Secrets Manager Azure Key Vault GCP Secret Manager Kubernetes Secrets .env / Dosya ConfigMap
Veritabanı şifreleri Önerilen Önerilen Önerilen Önerilen 🔄 Alternatif (sadece cluster içi) Uygun Değil Uygun Değil
API anahtarları (3rd‑party) Önerilen Önerilen Önerilen Önerilen 🔄 Alternatif Uygun Değil Uygun Değil
Özellik bayrakları (feature flags) 🔄 Alternatif (dynamic secrets) 🔄 Alternatif 🔄 Alternatif 🔄 Alternatif Önerilen (ConfigMap/CRD) 🔄 Alternatif (basit projeler) Önerilen
Ortam değişkenleri (env vars) 🔄 Alternatif (inject via sidecar) 🔄 Alternatif 🔄 Alternatif 🔄 Alternatif Önerilen (pod env) Önerilen (local/dev) Önerilen (non‑secret)
Sertifika / TLS anahtarları Önerilen (PKI engine) 🔄 Alternatif (import) 🔄 Alternatif (import) 🔄 Alternatif (import) 🔄 Alternatif (secret type tls) Uygun Değil Uygun Değil
Kısa ömürlü token / OTP Önerilen (dynamic secrets) Uygun Değil Uygun Değil Uygun Değil Uygun Değil Uygun Değil Uygun Değil

📌 Hızlı notlar

  • Vault → Gelişmiş dinamik secret, lease, audit log istiyorsan ilk seçim 🎯
  • Bulut sağlayıcı yönetimleri (AWS/Azure/GCP) → İlgili bulutta zatenysen, entegrasyon sıfır maliyet → Önerilen
  • Kubernetes Secrets → Cluster içi workload’ler için yeterli, ama şifreleme at-rest ekstra ayar gerektirir 🔐
  • .env / Dosya → Sadece local geliştirme veya CI/CD pipeline’da geçici kullanım için 🛠
  • ConfigMapHassas olmayan konfig (feature flag, URL, timeout) için tam anlamıyla Önerilen

Nasıl kullanacaksın?

  1. Kendi senaryonu tabloda bul 👆
  2. İlgili sütundaki etikete bak → Önerilen ise o hizmeti kurmaya başla.
  3. Alternatif ise ikinci bir seçenek olarak aklında bulundur, Uygun Değil ise o yolu kapat ⛔

Bu matrisle karar verme süren dakikadan saniyeye düşer ⚡️
Kolay gelsin! 🚀


🛠 Pratik Uygulama: Python ile Secrets Manager Kullanımı

Hazırsan boto3 ile AWS Secrets Manager'a nasıl bağlanıp, gizli anahtar oluşturup, okur ve rotasyon tetikleriz buna birlikte bakalım 🚀

🎯 Senaryo

Üretim ortamında veritabanı şifrelerini, API anahtarlarını veya herhangi bir hassas veriyi kodda saklamak büyük risk. Secrets Manager bunu merkezi, şifreli ve denetlenebilir hale getirir.

🛠 Gereksinimler

pip install boto3

AWS kimlik bilgileriniz ~/.aws/credentials veya ortam değişkenlerinde tanımlı olmalı.


📝 Tam Çalıştırılabilir Python Betiği

Aşağıdaki script tek dosyada üç temel operasyonu gösterir:

  1. create_secret → yeni gizli anahtar oluşturur
  2. get_secret_value → gizli anahtarı okur (önbellekleme ile)
  3. rotate_secret → rotasyonu manuel tetikler
import os
import json
import time
import logging
from functools import lru_cache
from typing import Optional, Dict, Any

import boto3
from botocore.exceptions import ClientError, BotoCoreError

# ------------------------------------------------------------
# Loglama ayarı — üretimde JSON formatter tercih edin
# ------------------------------------------------------------
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s | %(levelname)-8s | %(message)s",
)
logger = logging.getLogger(__name__)

# ------------------------------------------------------------
# Sabitler — ortam değişkeninden almak en iyisidir
# ------------------------------------------------------------
SECRET_NAME = os.getenv("SECRET_NAME", "prod/db/credentials")
REGION_NAME = os.getenv("AWS_REGION", "eu-central-1")
DESCRIPTION = "Veritabanı bağlantı bilgileri — otomatik rotasyonlu"
KMS_KEY_ID = os.getenv("KMS_KEY_ID")  # None → AWS managed key

# ------------------------------------------------------------
# Secrets Manager client — singleton pattern
# ------------------------------------------------------------
_session = boto3.session.Session()
_client = _session.client(service_name="secretsmanager", region_name=REGION_NAME)


# ------------------------------------------------------------
# 1️⃣ Gizli anahtar oluşturma (idempotent)
# ------------------------------------------------------------
def create_secret(
    name: str = SECRET_NAME,
    secret_value: Optional[Dict[str, str]] = None,
    description: str = DESCRIPTION,
    kms_key_id: Optional[str] = KMS_KEY_ID,
) -> Dict[str, Any]:
    """
    Secret yoksa oluşturur, varsa güncellemez.
    `secret_value` dict olarak verilir; JSON string'e dönüştürülür.
    """
    if secret_value is None:
        secret_value = {
            "username": "admin",
            "password": "SuperSecretPass123!",  # Gerçekte güvenli üretilmeli
            "host": "db.example.com",
            "port": "5432",
            "dbname": "appdb",
        }

    try:
        logger.info("Secret oluşturuluyor → %s", name)
        response = _client.create_secret(
            Name=name,
            Description=description,
            SecretString=json.dumps(secret_value),
            KmsKeyId=kms_key_id,
            Tags=[
                {"Key": "Environment", "Value": "production"},
                {"Key": "ManagedBy", "Value": "python-script"},
            ],
        )
        logger.info("✅ Secret oluşturuldu: %s", response["ARN"])
        return response

    except _client.exceptions.ResourceExistsException:
        logger.warning("⚠️ Secret zaten mevcut: %s", name)
        return {"ARN": _client.describe_secret(SecretId=name)["ARN"]}

    except (ClientError, BotoCoreError) as exc:
        logger.exception("❌ Secret oluşturulamadı: %s", exc)
        raise


# ------------------------------------------------------------
# 2️⃣ Gizli anahtarı okuma — LRU önbellek ile
# ------------------------------------------------------------
@lru_cache(maxsize=4)
def get_secret_value(name: str = SECRET_NAME, version_stage: str = "AWSCURRENT") -> Dict[str, str]:
    """
    Secrets Manager'dan gizli anahtarı çeker ve **dict** döner.
    `lru_cache` sayesinde aynı secret tekrar istenirse ağ çağrısı yapmaz.
    ⚠️ Rotasyon sonrası cache'i temizlemek için `get_secret_value.cache_clear()` çağrın.
    """
    try:
        logger.info("Secret okunuyor → %s (stage: %s)", name, version_stage)
        response = _client.get_secret_value(SecretId=name, VersionStage=version_stage)
        secret_string = response["SecretString"]
        logger.debug("Ham secret string: %s", secret_string)
        return json.loads(secret_string)

    except _client.exceptions.ResourceNotFoundException:
        logger.error("❌ Secret bulunamadı: %s", name)
        raise

    except (ClientError, BotoCoreError, json.JSONDecodeError) as exc:
        logger.exception("❌ Secret okunamadı: %s", exc)
        raise


# ------------------------------------------------------------
# 3️⃣ Rotasyon tetikleme (manuel)
# ------------------------------------------------------------
def rotate_secret(name: str = SECRET_NAME) -> Dict[str, Any]:
    """
    Secrets Manager'ın **rotation lambda**'sını manuel tetikler.
    Otomatik rotasyon zamanlaması (örn. 30 günde bir) ayrı ayarlanır.
    """
    try:
        logger.info("🔁 Rotasyon tetikleniyor → %s", name)
        response = _client.rotate_secret(SecretId=name)
        logger.info("✅ Rotasyon başlatıldı: VersionId=%s", response["VersionId"])

        # Cache'i temizle ki sonraki okuma yeni versiyonu alsın
        get_secret_value.cache_clear()
        logger.debug("🗑️ LRU cache temizlendi")
        return response

    except _client.exceptions.ResourceNotFoundException:
        logger.error("❌ Secret bulunamadı, rotasyon yapılamaz: %s", name)
        raise

    except (ClientError, BotoCoreError) as exc:
        logger.exception("❌ Rotasyon hatası: %s", exc)
        raise


# ------------------------------------------------------------
# 🎬 Demo / CLI entry point
# ------------------------------------------------------------
if __name__ == "__main__":
    print("\n" + "=" * 60)
    print("🛠  Secrets Manager Demo Başlıyor")
    print("=" * 60 + "\n")

    # 1️⃣ Oluştur / zaten varsa atla
    create_secret()

    # 2️⃣ Oku (ilk çağrı ağa gider)
    secret = get_secret_value()
    print(f"\n🔐 Okunan secret (ilk çağrı):\n{json.dumps(secret, indent=2, ensure_ascii=False)}")

    # 3️⃣ Tekrar oku (cache'den gelir — loglarda ağ çağrısı yok)
    _ = get_secret_value()
    logger.info("📦 İkinci okuma cache'den servis edildi")

    # 4️⃣ Rotasyon tetikle (isteğe bağlı — Lambda hazırsa)
    # rotate_secret()  # Yorum satırından kaldırın eğer rotation lambda'nız varsa

    print("\n" + "=" * 60)
    print("✅ Demo tamamlandı")
    print("=" * 60 + "\n")

🧠 Kodun Önemli Noktaları

Konu Ne Yapıyor?
Singleton client _client bir kere oluşturulur, her çağrıda yeniden bağlanmaz 🚀
create_secret idempotent ResourceExistsException yakalanır, script tekrar çalıştırılabilir
@lru_cache Aynı secret tekrar istenirse ağ çağrısı yapmaz — latency & cost düşer 💰
cache_clear() Rotasyon sonrası eski cache temizlenir, yeni versiyon okunur 🔁
Hata yakalama ClientError, BotoCoreError, ResourceNotFoundException ayrı ayrı loglanır 🛡
Tip ipuçları Dict[str, str] dönüş tipi sayesinde IDE autocomplete çalışır ✨

✅ En İyi Uygulamalar (Checklist)

  • Secret değeri asla loglama — yukarıdaki logger.debug sadece demo içindir, prod'da kapatın ⛔
  • KMS CMK kullanınKMS_KEY_ID vererek kendi anahtarınızla şifreleyin 🔐
  • IAM least privilege — Lambda/EC2 role'üne sadece secretsmanager:GetSecretValue + DescribeSecret verin 🎯
  • Otomatik rotasyonRotationRules ile 30/60/90 günlük zamanlama ayarlayın ⏰
  • Cache TTLlru_cache sonsuzdur; prod'da cachetools.TTLCache veya custom wrapper ile TTL (örn. 5 dk) ekleyin ⏱
  • Secret versioningAWSCURRENT / AWSPREVIOUS stage'leri ile rollback kolaydır 🔙

🚀 Hadi Deniyelim

export SECRET_NAME="prod/db/credentials"
export AWS_REGION="eu-central-1"
python secrets_demo.py

Çıktıda ilk okuma ağa gider, ikinci okuma cache'den gelir. Rotasyon lambda'nız hazırsa rotate_secret() satırını açın ve versiyon değişimini izleyin 🎉


Kısa özet: boto3 + lru_cache + doğru hata yakalama = güvenli, hızlı ve tekrar denetlenebilir secret yönetimi. Bir sonraki bölümde bu yapıyı FastAPI / Django içine nasıl entegre edeceğimize bakacağız 😉


🛠 Pratik Uygulama: Parameter Store ile Yapılandırma Alma

Hazırsan başlayalım 🚀
AWS Systems Manager Parameter Store, hiyerarşik yapıda (ör. /prod/db/password) parametre tutmamızı sağlar.
İki ana tür vardır:

  • String → düz metin, herkes görebilir
  • SecureString → KMS ile şifrelenmiş, sadece yetkili roller çözer 🔐

Uygulama ayağa kalkarken bu parametreleri tek seferde çekip ortam değişkenlerine atmak en pratik yoludur.

AWS CLI ile hızlı test 🎯

aws ssm get-parameters-by-path \
  --path "/prod/" \
  --recursive \
  --with-decryption
  • --recursive → alt yolları da getirir
  • --with-decryption → SecureString’leri çözerek döner

Python (boto3) ile üretim kodu 🛠

import os
import boto3

def load_config(path: str = "/prod/") -> None:
    """
    Parameter Store'dan hiyerarşik parametreleri çeker,
    SecureString'leri çözer ve os.environ'a yazar.
    """
    client = boto3.client("ssm")
    paginator = client.get_paginator("get_parameters_by_path")

    for page in paginator.paginate(Path=path, Recursive=True, WithDecryption=True):
        for param in page["Parameters"]:
            # Parametre adı: /prod/db/password -> ortam değişkeni: PROD_DB_PASSWORD
            env_key = param["Name"].lstrip("/").replace("/", "_").upper()
            os.environ[env_key] = param["Value"]
            print(f"✅ {env_key} ayarlandı")

if __name__ == "__main__":
    load_config()

Ne oluyor burada?

  1. get_parameters_by_path + Recursive=True/prod/ altındaki tüm parametreleri getirir.
  2. WithDecryption=True → SecureString’ler otomatik çözülür (KMS yetkisi varsa).
  3. Parametre isimlerini PROD_DB_PASSWORD gibi ortam değişkeni formatına çevirip os.environ’a atarız.
  4. Uygulama başladığında load_config() çağrılır → kodun her yerinden os.getenv("PROD_DB_PASSWORD") ile erişiriz.

Güvenlik notu ❗️

  • IAM politikası: ssm:GetParametersByPath + kms:Decrypt (SecureString için) izni verilmeli.
  • En az yetki: Sadece /prod/ yoluna erişim verin, * vermeyin.

Artık konfigürasyon merkezi, güvenli ve tek noktadan yönetilebilir 🎉


🎯 Bonus Tavsiye: İleri Seviye İpuçları ve Son Söz

Hazırsan bu aşamada bir adım ileri gidelim 🚀. Basit yapılandırmadan çıkıp, production‑ready ve güvenli bir mimari kurmak için şu stratejileri deneyebilirsin:

  • Secrets Manager + Parameter Store kombinasyonu 🔐

    • Hassas veriler (API anahtarları, veritabanı şifreleri) → Secrets Manager (otomatik rotasyon, şifreleme).
    • Uygulama ayarları, feature flag’ler, ortak yapılandırma → Parameter Store (hızlı okuma, versiyonlama).
    • İkisini bir arada kullanmak, ayrımcılığı netleştirir ve denetim kolaylaşır.
  • Cost Explorer ile etiket tabanlı maliyet takibi 💰

    • Her kaynak için Environment, Team, Project etiketleri ekle.
    • Cost Explorer’da Tag‑based reports oluştur → hangi servis ne kadar harcıyor, anında gör.
    • Bütçe alarmları koyarak sürpriz faturalardan kurtul.
  • CloudTrail entegrasyonu ile güvenlik denetimi 🛡️

    • Tüm API çağrılarını merkezi bir S3 bucket’ına logla.
    • EventBridge ile anomali tespiti (ör. beklenmeyen DeleteSecret çağrısı) yap ve Slack/e‑posta bildirimi gönder.
    • Denetim raporları için Athena sorguları hazırla → compliance süreci keyifli hale gelsin.
  • Infrastructure as Code (IaC) ile tekrarlanabilir dağıtımlar 🛠️

    • Terraform / AWS CDK şablonlarında yukarıdaki servisleri modül halinde tanımla.
    • CI/CD pipeline’ında plan → apply adımlarını otomatikleştir, manuel hata riskini sıfırla.
  • Gözlemleme ve alarm 📈

    • CloudWatch Metric Filters ile Secrets Manager/Parameter Store erişim hatalarını yakala.
    • Composite Alarms kur → hem maliyet hem hata oranı eşiği aşıldığında tek bildirim al.

Son söz 🎉

Bu yolculukta küçük adımlarla büyük farklar yarattık. Şimdi sıra sende: bir proje seç, yukarıdaki ipuçlarından en az ikisini uygula ve farkı kendin hisset. Hata yapmaktan korkma — her hata bir öğrenme fırsatıdır. Keşfet, dene, paylaş! 🚀✨


Bu içerik tamamen yapay zeka destekli otomasyon sistemi ile üretilmiştir.

Burak Sağlık

Burak Saglik

©2024 Desing and Developed by @Burak Sağlık

All rights reserved