{"id":31713,"date":"2025-10-13T05:31:22","date_gmt":"2025-10-13T02:31:22","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/aws-cdk-ile-postgresql-bastion-vpc-dagitimi-kapsamli-rehber\/"},"modified":"2025-10-13T05:31:22","modified_gmt":"2025-10-13T02:31:22","slug":"aws-cdk-ile-postgresql-bastion-vpc-dagitimi-kapsamli-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/aws-cdk-ile-postgresql-bastion-vpc-dagitimi-kapsamli-rehber\/","title":{"rendered":"AWS CDK ile PostgreSQL + Bastion + VPC Da\u011f\u0131t\u0131m\u0131: Kapsaml\u0131 Rehber"},"content":{"rendered":"<p><meta name=\"description\" content=\"AWS CDK ve Python kullanarak g\u00fcvenli bir PostgreSQL veritaban\u0131, Bastion host ve VPC altyap\u0131s\u0131n\u0131 ad\u0131m ad\u0131m nas\u0131l da\u011f\u0131taca\u011f\u0131n\u0131z\u0131 \u00f6\u011frenin. Bulut mimarisi ve otomasyon ipu\u00e7lar\u0131.\"><\/p>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, h\u0131zl\u0131, g\u00fcvenli ve tekrarlanabilir altyap\u0131 da\u011f\u0131t\u0131m\u0131 kritik bir \u00f6neme sahiptir. Manuel kurulumlar zaman al\u0131c\u0131 olman\u0131n yan\u0131 s\u0131ra hata yapma potansiyelini art\u0131r\u0131r ve \u00f6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli projelerde s\u00fcrd\u00fcr\u00fclebilirli\u011fi zorla\u015ft\u0131r\u0131r. G\u00fcvenlik a\u00e7\u0131klar\u0131, yap\u0131land\u0131rma hatalar\u0131 ve uyumluluk sorunlar\u0131 gibi pek \u00e7ok risk fakt\u00f6r\u00fc, manuel yakla\u015f\u0131mlarla ortaya \u00e7\u0131kabilmektedir. \u00d6rne\u011fin, bir geli\u015ftirici ekibinin her yeni ortam i\u00e7in ayn\u0131 PostgreSQL veritaban\u0131n\u0131, Bastion host&#8217;u ve VPC&#8217;yi manuel olarak yap\u0131land\u0131rmak zorunda kalmas\u0131, hem verimlili\u011fi d\u00fc\u015f\u00fcr\u00fcr hem de farkl\u0131 ortamlar aras\u0131nda tutars\u0131zl\u0131klar yaratabilir. \u0130\u015fte tam da bu noktada, altyap\u0131y\u0131 kod olarak (Infrastructure as Code &#8211; IaC) y\u00f6netme ihtiyac\u0131 do\u011far.<\/p>\n<p>Bu kapsaml\u0131 rehberde, Amazon Web Services (AWS) Cloud Development Kit (CDK) ve Python programlama dilini kullanarak, g\u00fcvenli ve \u00f6l\u00e7eklenebilir bir PostgreSQL veritaban\u0131 altyap\u0131s\u0131n\u0131 nas\u0131l otomatize edece\u011fimizi ad\u0131m ad\u0131m inceleyece\u011fiz. Bir Virtual Private Cloud (VPC) i\u00e7inde izole edilmi\u015f, bir Bastion host \u00fczerinden g\u00fcvenli eri\u015fim sa\u011flayan ve AWS Relational Database Service (RDS) ile y\u00f6netilen bir PostgreSQL \u00f6rne\u011fini kuraca\u011f\u0131z. Bu y\u00f6ntem, sadece altyap\u0131 da\u011f\u0131t\u0131m\u0131n\u0131 h\u0131zland\u0131rmakla kalmayacak, ayn\u0131 zamanda g\u00fcvenlik standartlar\u0131n\u0131 y\u00fckseltecek ve maliyet kontrol\u00fcn\u00fc kolayla\u015ft\u0131racakt\u0131r. Ayr\u0131ca, ger\u00e7ek d\u00fcnya senaryolar\u0131ndan \u00f6rnekler vererek, bu mimarinin neden tercih edilmesi gerekti\u011fini ve sa\u011flad\u0131\u011f\u0131 avantajlar\u0131 detayland\u0131raca\u011f\u0131z. Son olarak, mobil uyumluluk ve SEO ipu\u00e7lar\u0131yla bu makaleyi zenginle\u015ftirerek, siz de\u011ferli okuyucular\u0131m\u0131za kapsaml\u0131 bir kaynak sunmay\u0131 hedefliyoruz. Bu rehberin sonunda, kendi AWS altyap\u0131n\u0131z\u0131 CDK ile g\u00fcvenle y\u00f6netebilecek bilgi birikimine sahip olacaks\u0131n\u0131z.<\/p>\n<div class=\"expert-tip\">Uzman \u0130pucu: Altyap\u0131y\u0131 kod olarak y\u00f6netmek, yaln\u0131zca da\u011f\u0131t\u0131m\u0131 h\u0131zland\u0131rmakla kalmaz, ayn\u0131 zamanda felaket kurtarma senaryolar\u0131nda kurtarma s\u00fcresini (RTO) \u00f6nemli \u00f6l\u00e7\u00fcde k\u0131salt\u0131r. T\u00fcm altyap\u0131n\u0131z\u0131 dakikalar i\u00e7inde yeniden aya\u011fa kald\u0131rabilirsiniz.<\/div>\n<h2>Neden AWS CDK ve Python Kullanmal\u0131y\u0131z? Otomatik Altyap\u0131n\u0131n G\u00fcc\u00fc<\/h2>\n<p>Modern bulut tabanl\u0131 uygulamalar, esneklik, \u00f6l\u00e7eklenebilirlik ve g\u00fcvenlik gerektirir. Bu gereksinimleri kar\u015f\u0131lamak i\u00e7in altyap\u0131 y\u00f6netiminde devrim niteli\u011finde yakla\u015f\u0131mlara ihtiya\u00e7 duyulmaktad\u0131r. AWS CDK ve Python&#8217;\u0131n bu alanda sundu\u011fu avantajlar, geleneksel y\u00f6ntemlere k\u0131yasla \u00f6nemli farklar yarat\u0131r. AWS CDK (Cloud Development Kit), altyap\u0131y\u0131 tan\u0131d\u0131k programlama dillerini (Python, TypeScript, Java, C#, Go) kullanarak tan\u0131mlamam\u0131za olanak tan\u0131yan a\u00e7\u0131k kaynakl\u0131 bir yaz\u0131l\u0131m geli\u015ftirme \u00e7er\u00e7evesidir. Geli\u015ftiricilerin kulland\u0131\u011f\u0131 dillerle altyap\u0131y\u0131 yazmak, hem \u00f6\u011frenme e\u011frisini azalt\u0131r hem de karma\u015f\u0131k mant\u0131klar\u0131, ko\u015fullu yap\u0131lar\u0131 ve d\u00f6ng\u00fcleri altyap\u0131 koduna entegre etmeyi kolayla\u015ft\u0131r\u0131r. \u00d6rne\u011fin, belirli bir ortam i\u00e7in (dev\/test\/prod) farkl\u0131 boyutlarda veritabanlar\u0131 veya farkl\u0131 g\u00fcvenlik ayarlar\u0131 tan\u0131mlamak, CDK ile if-else bloklar\u0131 veya d\u00f6ng\u00fclerle \u00e7ok daha basit hale gelir.<\/p>\n<p>Python&#8217;\u0131n CDK ile uyumu, bu g\u00fc\u00e7l\u00fc arac\u0131 daha da eri\u015filebilir k\u0131lar. Python&#8217;\u0131n basit s\u00f6zdizimi, geni\u015f k\u00fct\u00fcphane ekosistemi ve y\u00fcksek okunabilirli\u011fi, altyap\u0131 kodunu yazmay\u0131 ve s\u00fcrd\u00fcrmeyi kolayla\u015ft\u0131r\u0131r. Bir DevOps ekibi, zaten Python&#8217;\u0131 otomasyon ve scripting i\u00e7in kullan\u0131yorsa, CDK ile altyap\u0131 y\u00f6netimine ge\u00e7i\u015f yapmak olduk\u00e7a do\u011fal bir ad\u0131md\u0131r. Ayr\u0131ca, Python&#8217;\u0131n zengin mod\u00fcl ve paket yap\u0131s\u0131, CDK uygulamalar\u0131n\u0131n daha mod\u00fcler ve yeniden kullan\u0131labilir olmas\u0131n\u0131 sa\u011flar. Bu sayede, ayn\u0131 VPC yap\u0131s\u0131n\u0131 birden fazla projede kullanmak veya farkl\u0131 veritaban\u0131 yap\u0131land\u0131rmalar\u0131n\u0131 ayr\u0131 ayr\u0131 tan\u0131mlamak m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<p>AWS CDK&#8217;n\u0131n sa\u011flad\u0131\u011f\u0131 bir di\u011fer \u00f6nemli fayda, y\u00fcksek seviyeli abstraksiyonlard\u0131r. CDK, AWS CloudFormation \u00fczerinde \u00e7al\u0131\u015f\u0131r ve altyap\u0131 kaynaklar\u0131n\u0131 daha soyut bir \u015fekilde tan\u0131mlamam\u0131za olanak tan\u0131r. \u00d6rne\u011fin, bir VPC olu\u015fturmak i\u00e7in CloudFormation&#8217;da onlarca sat\u0131r JSON veya YAML kodu yazmak yerine, CDK&#8217;da tek bir Python s\u0131n\u0131f\u0131 \u00e7a\u011f\u0131rarak temel VPC yap\u0131s\u0131n\u0131 olu\u015fturabiliriz. Bu abstraksiyon, geli\u015ftiricilerin altyap\u0131 detaylar\u0131na bo\u011fulmadan i\u015f mant\u0131\u011f\u0131na odaklanmas\u0131na yard\u0131mc\u0131 olur. Ayr\u0131ca, CDK&#8217;n\u0131n g\u00fc\u00e7l\u00fc hata yakalama ve do\u011frulama mekanizmalar\u0131, da\u011f\u0131t\u0131m \u00f6ncesinde potansiyel sorunlar\u0131 tespit etmeyi kolayla\u015ft\u0131r\u0131r. Bu durum, \u00f6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli veya hassas projelerde zaman ve maliyet tasarrufu sa\u011flar.<\/p>\n<p>Ger\u00e7ek d\u00fcnya senaryolar\u0131nda, bir startup&#8217;\u0131n yeni bir \u00fcr\u00fcn geli\u015ftirdi\u011fini ve h\u0131zla pazara s\u00fcrmesi gerekti\u011fini d\u00fc\u015f\u00fcn\u00fcn. Manuel altyap\u0131 kurulumlar\u0131 haftalar s\u00fcrebilir ve piyasaya \u00e7\u0131k\u0131\u015f\u0131 geciktirebilir. AWS CDK kullanarak, bir geli\u015ftirici veya DevOps m\u00fchendisi, birka\u00e7 g\u00fcn i\u00e7inde t\u00fcm temel altyap\u0131y\u0131 (VPC, veritaban\u0131, sunucular, y\u00fck dengeleyiciler vb.) kod olarak tan\u0131mlayabilir ve saniyeler i\u00e7inde da\u011f\u0131tabilir. Bu, \u00fcr\u00fcn\u00fcn daha h\u0131zl\u0131 test edilmesini, geri bildirim al\u0131nmas\u0131n\u0131 ve yinelemeli olarak geli\u015ftirilmesini sa\u011flar. Ayr\u0131ca, bu yakla\u015f\u0131m maliyet kontrol\u00fcne de yard\u0131mc\u0131 olur; gereksiz kaynaklar\u0131n da\u011f\u0131t\u0131lmas\u0131n\u0131 engeller ve sadece ihtiya\u00e7 duyulan kaynaklar\u0131n do\u011fru boyutlarda kullan\u0131lmas\u0131n\u0131 sa\u011flar. Sonu\u00e7 olarak, AWS CDK ve Python, modern bulut altyap\u0131s\u0131 y\u00f6netiminde verimlilik, g\u00fcvenlik ve \u00f6l\u00e7eklenebilirlik a\u00e7\u0131s\u0131ndan vazge\u00e7ilmez bir kombinasyon sunar.<\/p>\n<h2>G\u00fcvenli Bir Bulut Altyap\u0131s\u0131n\u0131n Temel Ta\u015flar\u0131 Nelerdir?<\/h2>\n<p>Bulut ortam\u0131nda sa\u011flam ve g\u00fcvenli bir altyap\u0131 olu\u015fturmak, uygulaman\u0131z\u0131n ba\u015far\u0131s\u0131 i\u00e7in hayati \u00f6neme sahiptir. Bu b\u00f6l\u00fcmde, g\u00fcvenli bir bulut mimarisinin olmazsa olmaz bile\u015fenlerini ve bunlar\u0131n neden kritik oldu\u011funu inceleyece\u011fiz. Her bir bile\u015fenin rol\u00fcn\u00fc anlayarak, AWS CDK ile bu yap\u0131lar\u0131 nas\u0131l otomatize edece\u011finizi daha iyi kavrayacaks\u0131n\u0131z.<\/p>\n<h3>VPC (Virtual Private Cloud) Nedir ve Neden \u00d6nemlidir?<\/h3>\n<p>VPC, AWS bulutunda sizin i\u00e7in ayr\u0131lm\u0131\u015f, izole edilmi\u015f sanal bir a\u011fd\u0131r. Kendi veri merkezinizin AWS \u00fczerindeki e\u015fde\u011feri gibi d\u00fc\u015f\u00fcnebilirsiniz. VPC, a\u011f topolojinizi, IP adres aral\u0131klar\u0131n\u0131z\u0131, alt a\u011flar\u0131n\u0131z\u0131 (subnets), rota tablolar\u0131n\u0131z\u0131 ve a\u011f ge\u00e7itlerinizi tamamen kontrol etmenizi sa\u011flar. Bu izolasyon, uygulaman\u0131z\u0131n ve verilerinizin di\u011fer AWS m\u00fc\u015fterilerinden tamamen ayr\u0131lmas\u0131n\u0131 garanti eder. Bir VPC olu\u015fturdu\u011funuzda, bu, uygulaman\u0131z i\u00e7in kendi \u00f6zel ve g\u00fcvenli alan\u0131n\u0131z\u0131 in\u015fa etti\u011finiz anlam\u0131na gelir. \u0130\u00e7indeki kaynaklar (EC2 \u00f6rnekleri, RDS veritabanlar\u0131 vb.) sizin tan\u0131mlad\u0131\u011f\u0131n\u0131z kurallara g\u00f6re ileti\u015fim kurar. \u00d6rne\u011fin, hassas veritabanlar\u0131n\u0131z\u0131 genel internet eri\u015fiminden izole etmek i\u00e7in \u00f6zel alt a\u011flarda (private subnets) bar\u0131nd\u0131rabilirsiniz. Bu alt a\u011flardaki kaynaklar, d\u0131\u015far\u0131ya do\u011frudan \u00e7\u0131k\u0131\u015f yapamazken, genellikle bir NAT Gateway \u00fczerinden internete eri\u015febilirler. Bu sayede, g\u00fcvenlik yamalar\u0131 indirme gibi i\u015flemleri ger\u00e7ekle\u015ftirebilirsiniz. Genel alt a\u011flar (public subnets) ise genellikle internete do\u011frudan eri\u015febilen y\u00fck dengeleyiciler ve web sunucular\u0131 gibi kaynaklar\u0131 bar\u0131nd\u0131r\u0131r. Bu detayl\u0131 kontrol mekanizmas\u0131, a\u011f tabanl\u0131 sald\u0131r\u0131lara kar\u015f\u0131 ilk savunma hatt\u0131n\u0131z\u0131 olu\u015fturur ve uyumluluk gereksinimlerini kar\u015f\u0131laman\u0131za yard\u0131mc\u0131 olur.<\/p>\n<h3>PostgreSQL RDS: Y\u00f6netilen Veritaban\u0131 Hizmetinin Avantajlar\u0131 Nelerdir?<\/h3>\n<p>Veritabanlar\u0131, her uygulaman\u0131n kalbidir ve do\u011fru y\u00f6netimi kritik \u00f6neme sahiptir. AWS Relational Database Service (RDS), bulutta ili\u015fkisel veritabanlar\u0131n\u0131 kurmay\u0131, i\u015fletmeyi ve \u00f6l\u00e7eklendirmeyi kolayla\u015ft\u0131ran y\u00f6netilen bir hizmettir. PostgreSQL, pop\u00fclaritesi ve sa\u011flaml\u0131\u011f\u0131 nedeniyle bir\u00e7ok geli\u015ftiricinin tercihidir. RDS PostgreSQL&#8217;in en b\u00fcy\u00fck avantaj\u0131, veritaban\u0131 y\u00f6netimiyle ilgili s\u0131k\u0131c\u0131 ve zaman al\u0131c\u0131 g\u00f6revleri (yedekleme, yama uygulama, yaz\u0131l\u0131m y\u00fckseltmeleri, donan\u0131m tedariki, ar\u0131za tespiti ve kurtarma) AWS&#8217;nin \u00fcstlenmesidir. Bu sayede, geli\u015ftiriciler ve operasyon ekipleri, veritaban\u0131n\u0131n altyap\u0131s\u0131 yerine uygulaman\u0131n kendisiyle ilgilenebilirler. RDS, otomatik yedeklemeler, anl\u0131k kurtarma noktalar\u0131 ve y\u00fcksek eri\u015filebilirlik i\u00e7in Multi-AZ (\u00e7oklu eri\u015fim b\u00f6lgesi) da\u011f\u0131t\u0131m\u0131 gibi \u00f6zellikler sunar. Multi-AZ da\u011f\u0131t\u0131m\u0131, birincil veritaban\u0131 \u00f6rne\u011fiyle senkronize bir bekleme \u00f6rne\u011fi olu\u015fturarak, bir ar\u0131za durumunda otomatik devir teslimi sa\u011flar ve uygulama kesintisini en aza indirir. Ayr\u0131ca, RDS veritabanlar\u0131n\u0131 g\u00fcvenlik gruplar\u0131yla entegre etmek, a\u011f d\u00fczeyinde eri\u015fim kontrol\u00fcn\u00fc kolayla\u015ft\u0131r\u0131r ve yaln\u0131zca yetkili kaynaklar\u0131n veritaban\u0131n\u0131za ba\u011flanmas\u0131n\u0131 sa\u011flar. Bu \u00f6zelliklerin t\u00fcm\u00fc, hem operasyonel y\u00fck\u00fc azalt\u0131r hem de veritaban\u0131n\u0131z\u0131n s\u00fcrekli olarak g\u00fcvenli ve y\u00fcksek performansl\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 garanti eder.<\/p>\n<h3>Bastion Host: G\u00fcvenli Eri\u015fim Noktas\u0131 Olarak Rol\u00fc Nedir?<\/h3>\n<p>Bastion host, bir a\u011f\u0131n veya alt a\u011f\u0131n g\u00fcvenli bir giri\u015f noktas\u0131 olarak i\u015flev g\u00f6ren \u00f6zel bir sunucudur. \u00d6zellikle \u00f6zel a\u011flarda (private subnets) bulunan kaynaklara (\u00f6rne\u011fin veritabanlar\u0131 veya uygulama sunucular\u0131) do\u011frudan SSH veya RDP eri\u015fimi olmamas\u0131n\u0131 sa\u011flamak amac\u0131yla kullan\u0131l\u0131r. Bunun yerine, t\u00fcm y\u00f6netim eri\u015fimi Bastion host \u00fczerinden y\u00f6nlendirilir. Bu yakla\u015f\u0131m, sald\u0131r\u0131 y\u00fczeyini \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r \u00e7\u00fcnk\u00fc d\u0131\u015f d\u00fcnyadan eri\u015filebilir tek bir sunucu noktas\u0131 olur. Bir geli\u015ftiricinin veya y\u00f6neticinin \u00f6zel alt a\u011fdaki bir veritaban\u0131na ba\u011flanmas\u0131 gerekti\u011finde, \u00f6ncelikle genel alt a\u011fda bulunan Bastion host&#8217;a SSH ile ba\u011flan\u0131r ve ard\u0131ndan Bastion host \u00fczerinden \u00f6zel alt a\u011fdaki hedefe t\u00fcnel a\u00e7ar. Bu t\u00fcnelleme mekanizmas\u0131, do\u011frudan eri\u015fim yerine katmanl\u0131 bir g\u00fcvenlik sa\u011flar. Bastion host&#8217;un g\u00fcvenlik grubu s\u0131k\u0131 bir \u015fekilde yap\u0131land\u0131r\u0131l\u0131r ve yaln\u0131zca belirli IP adreslerinden (\u00f6rne\u011fin, \u015firket VPN&#8217;i veya g\u00fcvenli bir a\u011f) SSH eri\u015fimine izin verilir. Bu kat\u0131 eri\u015fim kontrol\u00fc, \u00f6zel kaynaklar\u0131n\u0131z\u0131 potansiyel d\u0131\u015f tehditlerden korumak i\u00e7in hayati bir ad\u0131md\u0131r. Ayr\u0131ca, Bastion host \u00fczerindeki t\u00fcm eri\u015fim g\u00fcnl\u00fckleri tutularak denetim ve uyumluluk gereksinimleri de kar\u015f\u0131lanabilir.<\/p>\n<h3>Security Groups: Eri\u015fim Kontrol\u00fcn\u00fcn Temeli Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h3>\n<p>G\u00fcvenlik Gruplar\u0131 (Security Groups), AWS&#8217;deki sanal g\u00fcvenlik duvarlar\u0131d\u0131r. AWS kaynaklar\u0131na (EC2 \u00f6rnekleri, RDS veritabanlar\u0131, Y\u00fck Dengeleyiciler vb.) gelen ve giden a\u011f trafi\u011fini kontrol ederler. Her bir g\u00fcvenlik grubu, i\u00e7inde &#8220;izin ver&#8221; kurallar\u0131 tan\u0131mlanan bir dizi kural i\u00e7erir. G\u00fcvenlik gruplar\u0131 durum bilgisini korur; yani, bir giden iste\u011fe izin verilmi\u015fse, gelen yan\u0131t trafi\u011fi de otomatik olarak izin al\u0131r. Bu, trafik ak\u0131\u015f\u0131n\u0131 daha kolay y\u00f6netmenizi sa\u011flar. \u00d6rne\u011fin, bir web sunucusunun g\u00fcvenlik grubuna sadece 80 (HTTP) ve 443 (HTTPS) portlar\u0131ndan gelen trafi\u011fe izin verirken, Bastion host&#8217;un g\u00fcvenlik grubuna yaln\u0131zca belirli bir IP adresinden 22 (SSH) portuna gelen trafi\u011fe izin verebilirsiniz. Veritaban\u0131 \u00f6rne\u011finizin g\u00fcvenlik grubu ise sadece uygulama sunucular\u0131ndan veya Bastion host&#8217;tan gelen PostgreSQL portu (varsay\u0131lan 5432) trafi\u011fine izin verecek \u015fekilde yap\u0131land\u0131r\u0131lmal\u0131d\u0131r. Bu katmanl\u0131 g\u00fcvenlik yakla\u015f\u0131m\u0131, her bir kayna\u011f\u0131n yaln\u0131zca ihtiya\u00e7 duydu\u011fu eri\u015fime sahip olmas\u0131n\u0131 sa\u011flayarak yetkisiz eri\u015fim riskini en aza indirir. G\u00fcvenlik gruplar\u0131, altyap\u0131n\u0131z\u0131n mikro-segmentasyonunu sa\u011flaman\u0131n temel ara\u00e7lar\u0131ndan biridir ve a\u011f g\u00fcvenli\u011finizin en kritik bile\u015fenlerinden biridir.<\/p>\n<h2>Ad\u0131m Ad\u0131m AWS CDK ile PostgreSQL, Bastion ve VPC Da\u011f\u0131t\u0131m\u0131<\/h2>\n<p>\u015eimdi teoriden prati\u011fe ge\u00e7me zaman\u0131! Bu b\u00f6l\u00fcmde, AWS CDK ve Python kullanarak, g\u00fcvenli bir PostgreSQL veritaban\u0131, Bastion host ve VPC altyap\u0131s\u0131n\u0131 ad\u0131m ad\u0131m nas\u0131l da\u011f\u0131taca\u011f\u0131m\u0131z\u0131 ele alaca\u011f\u0131z. Her ad\u0131m\u0131 a\u00e7\u0131klay\u0131c\u0131 kod \u00f6rnekleriyle destekleyerek, kendi ortam\u0131n\u0131zda kolayca uygulayabilmenizi sa\u011flayaca\u011f\u0131z. Ba\u015flamadan \u00f6nce, AWS hesab\u0131n\u0131z\u0131n oldu\u011fundan ve AWS CLI&#8217;\u0131n yap\u0131land\u0131r\u0131ld\u0131\u011f\u0131ndan emin olun.<\/p>\n<h3>Ortam Haz\u0131rl\u0131\u011f\u0131: CDK CLI ve Gerekli K\u00fct\u00fcphaneler Nas\u0131l Kurulur?<\/h3>\n<p>\u0130lk olarak, sistemimizde AWS CDK CLI&#8217;\u0131 ve gerekli Python k\u00fct\u00fcphanelerini kurmam\u0131z gerekiyor. Bu ad\u0131mlar, CDK projemizi ba\u015flatmak ve AWS kaynaklar\u0131n\u0131 tan\u0131mlamak i\u00e7in temel ara\u00e7lar\u0131 sa\u011flar.<\/p>\n<p>Komut sat\u0131r\u0131n\u0131z\u0131 a\u00e7\u0131n ve a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 uygulay\u0131n:<\/p>\n<ol>\n<li><strong>Node.js ve NPM Kurulumu (CDK CLI i\u00e7in):<\/strong> AWS CDK CLI, Node.js tabanl\u0131d\u0131r. E\u011fer sisteminizde yoksa, <a href=\"https:\/\/nodejs.org\/en\/download\/\" target=\"_blank\" rel=\"noopener noreferrer\">Node.js resmi web sitesinden<\/a> kurulum yap\u0131n.<\/li>\n<li><strong>AWS CDK CLI Kurulumu:<\/strong> NPM kullanarak CDK CLI&#8217;\u0131 global olarak kurun:\n<pre><code class=\"language-bash\">\nnpm install -g aws-cdk\n<\/pre>\n<p><\/code>\n    <\/li>\n<li><strong>Yeni Bir CDK Projesi Ba\u015flatma:<\/strong> Projeniz i\u00e7in bir dizin olu\u015fturun ve i\u00e7ine girin, ard\u0131ndan Python \u015fablonuyla yeni bir CDK uygulamas\u0131 ba\u015flat\u0131n:\n<pre><code class=\"language-bash\">\nmkdir cdk-postgres-bastion-vpc\ncd cdk-postgres-bastion-vpc\ncdk init app --language python\n<\/pre>\n<p><\/code><br \/>\n        Bu komut, <code>app.py<\/code>, <code>cdk_postgres_bastion_vpc\/cdk_postgres_bastion_vpc_stack.py<\/code> ve <code>requirements.txt<\/code> gibi temel proje dosyalar\u0131n\u0131 olu\u015fturacakt\u0131r.\n    <\/li>\n<li><strong>Python Sanal Ortam\u0131n\u0131 Olu\u015fturma ve K\u00fct\u00fcphaneleri Kurma:<\/strong> Proje dizininizde bir sanal ortam olu\u015fturun ve gerekli Python paketlerini y\u00fckleyin.\n<pre><code class=\"language-bash\">\npython3 -m venv .venv\nsource .venv\/bin\/activate\npip install -r requirements.txt\npip install aws-cdk.aws-ec2 aws-cdk.aws-rds aws-cdk.aws-secretsmanager\n<\/pre>\n<p><\/code><br \/>\n        Bu paketler, VPC, EC2 ve RDS kaynaklar\u0131n\u0131 tan\u0131mlamak i\u00e7in gereklidir.\n    <\/li>\n<li><strong>AWS Hesab\u0131n\u0131z\u0131 Bootstraplama:<\/strong> CDK'n\u0131n kaynaklar\u0131 AWS hesab\u0131n\u0131zda da\u011f\u0131tabilmesi i\u00e7in bir kerelik bootstrapping i\u015flemi yapman\u0131z gerekir. Bu, CDK'n\u0131n durumunu y\u00f6netmek i\u00e7in gerekli S3 kovas\u0131n\u0131 ve IAM rollerini olu\u015fturur.\n<pre><code class=\"language-bash\">\ncdk bootstrap\n<\/pre>\n<p><\/code><br \/>\n        Bu komut, <code>AWS::CDK::Bootstrap<\/code> ad\u0131nda bir CloudFormation y\u0131\u011f\u0131n\u0131 olu\u015fturacakt\u0131r.<\/li>\n<\/ol>\n<p>Art\u0131k ortam\u0131n\u0131z haz\u0131r! <code>cdk_postgres_bastion_vpc\/cdk_postgres_bastion_vpc_stack.py<\/code> dosyas\u0131n\u0131 d\u00fczenleyerek altyap\u0131n\u0131z\u0131 tan\u0131mlamaya ba\u015flayabiliriz.<\/p>\n<h3>VPC Olu\u015fturma: A\u011f Temellerini Atmak<\/h3>\n<p>T\u00fcm kaynaklar\u0131m\u0131z i\u00e7in g\u00fcvenli ve izole bir a\u011f ortam\u0131 sa\u011flamak \u00fczere bir VPC olu\u015fturaca\u011f\u0131z. Bu VPC, hem genel (public) hem de \u00f6zel (private) alt a\u011flar\u0131 i\u00e7erecek ve NAT Gateway'ler arac\u0131l\u0131\u011f\u0131yla \u00f6zel alt a\u011flardaki kaynaklar\u0131n internete \u00e7\u0131k\u0131\u015f\u0131n\u0131 sa\u011flayacakt\u0131r.<\/p>\n<pre><code class=\"language-python\">\nfrom aws_cdk import (\n    Stack,\n    aws_ec2 as ec2,\n    aws_rds as rds,\n    aws_secretsmanager as secretsmanager,\n)\nfrom constructs import Construct\n\nclass CdkPostgresBastionVpcStack(Stack):\n\n    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:\n        super().__init__(scope, construct_id, **kwargs)\n\n        # 1. VPC Olu\u015fturma\n        self.vpc = ec2.Vpc(self, \"PostgresVPC\",\n            max_azs=2, # Y\u00fcksek eri\u015filebilirlik i\u00e7in 2 Avaliability Zone\n            cidr=\"10.0.0.0\/16\",\n            # Public ve Private Subnet'leri tan\u0131mlama\n            subnet_configuration=[\n                ec2.SubnetConfiguration(\n                    name=\"Public\",\n                    subnet_type=ec2.SubnetType.PUBLIC,\n                    cidr_mask=24\n                ),\n                ec2.SubnetConfiguration(\n                    name=\"Private\",\n                    subnet_type=ec2.SubnetType.PRIVATE_WITH_EGRESS, # NAT Gateway ile internet eri\u015fimi\n                    cidr_mask=24\n                )\n            ],\n            nat_gateways=1 # Her AZ i\u00e7in bir NAT Gateway yerine tek bir tane kullan\u0131yoruz\n        )\n\n        # Output VPC ID (\u0130ste\u011fe ba\u011fl\u0131, ancak faydal\u0131d\u0131r)\n        # CfnOutput(self, \"VPCId\", value=self.vpc.vpc_id, description=\"The ID of the VPC\")\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kod blo\u011funda, <code>ec2.Vpc<\/code> yap\u0131c\u0131s\u0131n\u0131 kullanarak temel bir VPC olu\u015fturuyoruz. <code>max_azs=2<\/code> ile iki farkl\u0131 Availability Zone'a yay\u0131lan alt a\u011flar olu\u015fturulmas\u0131n\u0131 sa\u011fl\u0131yoruz. <code>subnet_configuration<\/code>, hem public hem de private alt a\u011flar\u0131 tan\u0131mlar. <code>PRIVATE_WITH_EGRESS<\/code> alt a\u011f tipi, \u00f6zel alt a\u011fdaki kaynaklar\u0131n NAT Gateway \u00fczerinden internete eri\u015febilmesini sa\u011flar. Bu, \u00f6rne\u011fin i\u015fletim sistemi g\u00fcncellemelerini indirmek i\u00e7in gereklidir ancak d\u0131\u015far\u0131dan do\u011frudan eri\u015fime kapal\u0131 kal\u0131r. <code>nat_gateways=1<\/code> ise maliyet etkinli\u011fi i\u00e7in tek bir NAT Gateway kullanmam\u0131z\u0131 sa\u011flar. Bu yap\u0131, uygulamam\u0131z i\u00e7in hem g\u00fcvenlik hem de esneklik sunan sa\u011flam bir a\u011f temeli olu\u015fturur.<\/p>\n<h3>RDS PostgreSQL Veritaban\u0131 Kurulumu: Y\u00f6netilen Veri Depolama<\/h3>\n<p>Veritaban\u0131, uygulamam\u0131z\u0131n can damar\u0131d\u0131r. AWS RDS kullanarak y\u00f6netilen bir PostgreSQL veritaban\u0131 \u00f6rne\u011fi olu\u015fturaca\u011f\u0131z. Bu, yedekleme, yama ve \u00f6l\u00e7eklendirme gibi operasyonel y\u00fckleri AWS'ye b\u0131rakmam\u0131z\u0131 sa\u011flar. G\u00fcvenlik i\u00e7in, veritaban\u0131 kimlik bilgilerini AWS Secrets Manager'da saklayaca\u011f\u0131z.<\/p>\n<pre><code class=\"language-python\">\n        # 2. RDS PostgreSQL Veritaban\u0131 Olu\u015fturma\n        # Veritaban\u0131 \u015fifresi i\u00e7in AWS Secrets Manager kullan\u0131n\n        db_credentials_secret = secretsmanager.Secret(self, \"DBCredentialsSecret\",\n            secret_name=\"PostgresDbCredentials\",\n            generate_secret_string=secretsmanager.SecretStringGenerator(\n                secret_string_template='{\"username\": \"postgres\"}',\n                exclude_characters='@\/\"\\'\\\\',\n                password_length=16\n            )\n        )\n\n        # Veritaban\u0131 G\u00fcvenlik Grubu (Sadece Bastion'dan eri\u015fim)\n        db_security_group = ec2.SecurityGroup(self, \"DbSecurityGroup\",\n            vpc=self.vpc,\n            description=\"Allow access to Postgres RDS from Bastion Host\",\n            allow_all_outbound=True # D\u0131\u015far\u0131ya \u00e7\u0131k\u0131\u015fa izin ver\n        )\n        # Gelen kural\u0131 daha sonra Bastion'a ba\u011flayaca\u011f\u0131z\n\n        self.db_instance = rds.DatabaseInstance(self, \"PostgresInstance\",\n            engine=rds.DatabaseInstanceEngine.postgres(version=rds.PostgresEngineVersion.VER_14),\n            vpc=self.vpc,\n            vpc_subnets=ec2.SubnetSelection(subnet_type=ec2.SubnetType.PRIVATE_WITH_EGRESS),\n            instance_type=ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE3, ec2.InstanceSize.MICRO),\n            credentials=rds.Credentials.from_secret(db_credentials_secret),\n            database_name=\"mydatabase\",\n            multi_az=False, # Geli\u015ftirme\/test i\u00e7in tek AZ, \u00fcretim i\u00e7in True\n            allocated_storage=20,\n            allow_major_version_upgrade=False,\n            auto_minor_version_upgrade=True,\n            backup_retention=7, # 7 g\u00fcnl\u00fck yedekleme\n            parameter_group=rds.ParameterGroup.from_parameter_group_name(self, \"PostgresParamGroup\",\n                \"default.postgres14\"\n            ),\n            security_groups=[db_security_group],\n            deletion_protection=False # Geli\u015ftirme\/test i\u00e7in False, \u00fcretim i\u00e7in True\n        )\n<\/pre>\n<p><\/code><\/p>\n<p>Bu k\u0131s\u0131mda, \u00f6ncelikle <code>secretsmanager.Secret<\/code> ile veritaban\u0131 kullan\u0131c\u0131 ad\u0131 ve parola i\u00e7in g\u00fcvenli bir s\u0131r olu\u015fturuyoruz. Parola otomatik olarak olu\u015fturulur ve <code>PostgresDbCredentials<\/code> ad\u0131yla Secrets Manager'da saklan\u0131r. Ard\u0131ndan, veritaban\u0131 i\u00e7in bir g\u00fcvenlik grubu (<code>db_security_group<\/code>) tan\u0131ml\u0131yoruz. Bu g\u00fcvenlik grubu, varsay\u0131lan olarak d\u0131\u015far\u0131ya t\u00fcm \u00e7\u0131k\u0131\u015flara izin verir, ancak gelen trafi\u011fi hen\u00fcz k\u0131s\u0131tlamaz. <code>rds.DatabaseInstance<\/code> ile PostgreSQL veritaban\u0131 \u00f6rne\u011fini olu\u015ftururuz. Motor s\u00fcr\u00fcm\u00fcn\u00fc (Postgres 14), VPC ve \u00f6zel alt a\u011flar\u0131 belirtiriz. <code>instance_type<\/code> ile \u00f6rnek boyutunu se\u00e7eriz. <code>credentials<\/code> parametresi ile Secrets Manager'daki s\u0131rr\u0131m\u0131z\u0131 ba\u011flar\u0131z. <code>multi_az=False<\/code> geli\u015ftirme ortamlar\u0131 i\u00e7in maliyetten tasarruf sa\u011flarken, \u00fcretim i\u00e7in <code>True<\/code> olarak ayarlanmal\u0131d\u0131r. <code>deletion_protection=False<\/code> da benzer \u015fekilde geli\u015ftirme ve test ortamlar\u0131nda h\u0131zl\u0131 silme i\u015flemleri i\u00e7in uygundur, ancak \u00fcretimde kesinlikle <code>True<\/code> olmal\u0131d\u0131r.<\/p>\n<h3>Bastion Host Konfig\u00fcrasyonu: G\u00fcvenli A\u011f Ge\u00e7idi<\/h3>\n<p>\u00d6zel alt a\u011fdaki veritaban\u0131m\u0131za g\u00fcvenli bir \u015fekilde ba\u011flanabilmek i\u00e7in bir Bastion host kuraca\u011f\u0131z. Bu sunucu, public alt a\u011fda yer alacak ve yaln\u0131zca belirli IP adreslerinden SSH eri\u015fimine izin verecektir.<\/p>\n<pre><code class=\"language-python\">\n        # 3. Bastion Host Olu\u015fturma\n        # Bastion Host i\u00e7in G\u00fcvenlik Grubu (Sadece SSH'a izin ver)\n        bastion_security_group = ec2.SecurityGroup(self, \"BastionSecurityGroup\",\n            vpc=self.vpc,\n            description=\"Allow SSH access to Bastion Host\",\n            allow_all_outbound=True\n        )\n        # Sadece kendi IP adresinizden SSH'a izin verin (\u00d6RNEK: \"0.0.0.0\/0\" yerine kendi IP adresinizi kullan\u0131n)\n        bastion_security_group.add_ingress_rule(\n            peer=ec2.Peer.any_ipv4(), # Kendi statik IP'nizi veya IP aral\u0131\u011f\u0131n\u0131z\u0131 buraya yaz\u0131n\n            connection=ec2.Port.tcp(22),\n            description=\"Allow SSH access from anywhere (UPDATE THIS!)\"\n        )\n        # \u00d6rnek: ec2.Peer.ipv4(\"YOUR_PUBLIC_IP\/32\")\n\n        # Bastion Host i\u00e7in AMI\n        # En g\u00fcncel Amazon Linux 2 AMI's\u0131n\u0131 se\u00e7in\n        amzn_linux = ec2.MachineImage.latest_amazon_linux2()\n\n        self.bastion_host = ec2.Instance(self, \"BastionHost\",\n            vpc=self.vpc,\n            instance_type=ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE3, ec2.InstanceSize.MICRO),\n            machine_image=amzn_linux,\n            vpc_subnets=ec2.SubnetSelection(subnet_type=ec2.SubnetType.PUBLIC),\n            security_group=bastion_security_group,\n            key_name=\"your-ssh-key-name\" # SSH anahtar\u0131n\u0131z\u0131n ad\u0131n\u0131 buraya yaz\u0131n\n        )\n        # Output Bastion Public IP\n        # CfnOutput(self, \"BastionPublicIp\", value=self.bastion_host.instance_public_ip, description=\"Bastion Host Public IP\")\n<\/pre>\n<p><\/code><\/p>\n<p>Bastion host i\u00e7in ayr\u0131 bir g\u00fcvenlik grubu (<code>bastion_security_group<\/code>) olu\u015fturulur. Bu g\u00fcvenlik grubuna, sadece 22 numaral\u0131 SSH portundan gelen trafi\u011fe izin veren bir kural eklenir. <code>ec2.Peer.any_ipv4()<\/code> yerine mutlaka kendi statik genel IP adresinizi veya IP aral\u0131\u011f\u0131n\u0131z\u0131 belirtmelisiniz; aksi takdirde Bastion host internetteki herkese a\u00e7\u0131k SSH eri\u015fimine maruz kal\u0131r. AMI (Amazon Machine Image) olarak en son Amazon Linux 2 kullan\u0131r\u0131z. <code>ec2.Instance<\/code> ile Bastion EC2 \u00f6rne\u011fini olu\u015ftururuz. <code>vpc_subnets<\/code> ile bu \u00f6rne\u011fin public alt a\u011fda yer almas\u0131n\u0131 sa\u011flar\u0131z. <code>key_name<\/code> parametresi i\u00e7in AWS'de zaten olu\u015fturulmu\u015f bir SSH anahtar\u0131n\u0131z\u0131n ad\u0131n\u0131 girmelisiniz; bu anahtar olmadan Bastion host'a ba\u011flanamazs\u0131n\u0131z.<\/p>\n<h3>G\u00fcvenlik Gruplar\u0131n\u0131n \u0130li\u015fkilendirilmesi: Do\u011fru \u0130zinleri Belirleme<\/h3>\n<p>\u015eimdi en kritik g\u00fcvenlik ad\u0131mlar\u0131ndan birine geliyoruz: g\u00fcvenlik gruplar\u0131n\u0131 birbirine ba\u011flamak. Bastion host'umuzun, PostgreSQL veritaban\u0131m\u0131za eri\u015fmesine izin vermeliyiz, ancak bu eri\u015fim sadece Bastion host'tan gelmelidir.<\/p>\n<pre><code class=\"language-python\">\n        # 4. G\u00fcvenlik Gruplar\u0131n\u0131 \u0130li\u015fkilendirme\n        # Bastion host'tan RDS'e 5432 (PostgreSQL) portundan eri\u015fime izin ver\n        db_security_group.add_ingress_rule(\n            peer=self.bastion_host.connections.security_groups[0], # Bastion'\u0131n g\u00fcvenlik grubu\n            connection=ec2.Port.tcp(5432),\n            description=\"Allow PostgreSQL access from Bastion Host\"\n        )\n        \n        # Sonu\u00e7 olarak, veritaban\u0131 sadece Bastion \u00fczerinden eri\u015filebilir olacak.\n<\/pre>\n<p><\/code><\/p>\n<p>Bu kod blo\u011fu, <code>db_security_group<\/code>'a yeni bir gelen kural ekler. <code>peer<\/code> olarak <code>self.bastion_host.connections.security_groups[0]<\/code> de\u011ferini kullanarak, bu kural\u0131n yaln\u0131zca Bastion host'umuzun g\u00fcvenlik grubundan gelen trafi\u011fe uygulanmas\u0131n\u0131 sa\u011flar\u0131z. <code>connection=ec2.Port.tcp(5432)<\/code> ise PostgreSQL'in varsay\u0131lan portu olan 5432 \u00fczerinden TCP trafi\u011fine izin verir. Bu kural ile, sadece Bastion host \u00fczerinden t\u00fcnel a\u00e7arak veritaban\u0131m\u0131za g\u00fcvenli bir \u015fekilde ba\u011flanabiliriz. Bu, do\u011frudan internetten veya di\u011fer yetkisiz kaynaklardan gelen veritaban\u0131 eri\u015fimini tamamen engelledi\u011fi i\u00e7in kritik bir g\u00fcvenlik \u00f6nlemidir.<\/p>\n<h3>CDK Uygulamas\u0131n\u0131 Da\u011f\u0131tma: Koddan Buluta<\/h3>\n<p>T\u00fcm altyap\u0131 kaynaklar\u0131m\u0131z\u0131 CDK ile tan\u0131mlad\u0131k. \u015eimdi bu tan\u0131m\u0131 AWS hesab\u0131m\u0131za da\u011f\u0131tma zaman\u0131.<\/p>\n<ol>\n<li><strong>Synthesize (Sentezleme):<\/strong> CDK kodunuzu AWS CloudFormation \u015fablonlar\u0131na d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in <code>cdk synth<\/code> komutunu kullan\u0131n. Bu, da\u011f\u0131t\u0131mdan \u00f6nce olu\u015fturulacak kaynaklar\u0131 g\u00f6rmenizi sa\u011flar.\n<pre><code class=\"language-bash\">\ncdk synth\n<\/pre>\n<p><\/code><br \/>\n        Bu komut, <code>cdk.out<\/code> dizininde CloudFormation \u015fablonlar\u0131n\u0131 olu\u015fturur.\n    <\/li>\n<li><strong>Deploy (Da\u011f\u0131tma):<\/strong> Altyap\u0131n\u0131z\u0131 AWS hesab\u0131n\u0131za da\u011f\u0131tmak i\u00e7in <code>cdk deploy<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131n.\n<pre><code class=\"language-bash\">\ncdk deploy\n<\/pre>\n<p><\/code><br \/>\n        CDK, CloudFormation y\u0131\u011f\u0131n\u0131n\u0131 olu\u015fturacak ve t\u00fcm kaynaklar\u0131 sa\u011flayacakt\u0131r. Bu i\u015flem biraz zaman alabilir (\u00f6zellikle RDS veritaban\u0131 kurulumu). Komut istemi s\u0131ras\u0131nda AWS IAM yetkilendirmeleri hakk\u0131nda bir onay isteyebilir; <code>y<\/code> yazarak onaylay\u0131n.\n    <\/li>\n<li><strong>Silme (Opsiyonel):<\/strong> Altyap\u0131n\u0131z\u0131 kald\u0131rmak istedi\u011finizde, <code>cdk destroy<\/code> komutunu kullanabilirsiniz.\n<pre><code class=\"language-bash\">\ncdk destroy\n<\/pre>\n<p><\/code><br \/>\n        Bu komut, olu\u015fturulan t\u00fcm AWS kaynaklar\u0131n\u0131 geri alacakt\u0131r. Yine bir onay iste\u011fi gelecektir.<\/li>\n<\/ol>\n<p>Bu ad\u0131mlar\u0131 tamamlad\u0131ktan sonra, AWS hesab\u0131n\u0131zda yeni bir VPC, i\u00e7inde bir Bastion host ve \u00f6zel bir alt a\u011fda PostgreSQL veritaban\u0131 \u00f6rne\u011fi ba\u015far\u0131yla da\u011f\u0131t\u0131lm\u0131\u015f olacakt\u0131r. Art\u0131k Bastion host \u00fczerinden veritaban\u0131n\u0131za g\u00fcvenli bir \u015fekilde ba\u011flanabilir ve uygulaman\u0131z\u0131 geli\u015ftirmeye ba\u015flayabilirsiniz!<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryolar\u0131 ve \u0130pu\u00e7lar\u0131: CDK ile Optimizasyon<\/h2>\n<p>Altyap\u0131m\u0131z\u0131 AWS CDK ile ba\u015far\u0131l\u0131 bir \u015fekilde da\u011f\u0131tt\u0131k. Ancak, ger\u00e7ek d\u00fcnya senaryolar\u0131nda sadece da\u011f\u0131t\u0131m yeterli de\u011fildir. Maliyet optimizasyonu, felaket kurtarma, kimlik bilgileri y\u00f6netimi ve s\u00fcrekli entegrasyon\/s\u00fcrekli teslimat (CI\/CD) gibi konular da b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. Bu b\u00f6l\u00fcmde, CDK ile bu alanlarda nas\u0131l iyile\u015ftirmeler yapabilece\u011finize dair ipu\u00e7lar\u0131 ve ger\u00e7ek d\u00fcnya vaka analizleri sunaca\u011f\u0131z.<\/p>\n<h3>Maliyet Optimizasyonu: Geli\u015ftirme Ortamlar\u0131 i\u00e7in RDS Otomatik Durdurma\/Ba\u015flatma<\/h3>\n<p>RDS veritabanlar\u0131, \u00f6zellikle geli\u015ftirme ve test ortamlar\u0131nda s\u00fcrekli \u00e7al\u0131\u015fmak zorunda de\u011fildir. Geceleri veya hafta sonlar\u0131 kapal\u0131 kalmalar\u0131, \u00f6nemli maliyet tasarrufu sa\u011flayabilir. AWS CDK, bu t\u00fcr bir otomasyonu dolayl\u0131 yoldan sa\u011flamak i\u00e7in kullan\u0131labilir. Direkt olarak bir RDS \u00f6rne\u011fini durdurup ba\u015flatma i\u015flevini CDK kodunda tan\u0131mlayamasan\u0131z da, CDK ile bu i\u015flemi tetikleyecek AWS Lambda fonksiyonlar\u0131 ve EventBridge kurallar\u0131 olu\u015fturabilirsiniz. \u00d6rne\u011fin, her ak\u015fam belirli bir saatte RDS \u00f6rne\u011fini durduran ve sabah ba\u015flatan bir Lambda fonksiyonunu CDK ile da\u011f\u0131tabilirsiniz.<\/p>\n<pre><code class=\"language-python\">\n# aws_cdk.aws_lambda as lambda_, aws_events as events, aws_events_targets as targets\n# ...\n# Bu \u00f6rnek, bir Lambda fonksiyonunu ve EventBridge kural\u0131n\u0131 CDK ile nas\u0131l da\u011f\u0131taca\u011f\u0131n\u0131z\u0131 g\u00f6sterir.\n# Lambda'n\u0131n RDS'i durdurup ba\u015flatmas\u0131 i\u00e7in gerekli IAM izinlerine sahip olmas\u0131 gerekir.\n\n# Lambda fonksiyonunun kodu (Python)\nlambda_code = \"\"\"\nimport boto3\nimport os\n\ndef handler(event, context):\n    rds = boto3.client('rds')\n    db_instance_identifier = os.environ['DB_INSTANCE_IDENTIFIER']\n    action = event['action'] # 'start' or 'stop'\n\n    if action == 'stop':\n        print(f\"Stopping RDS instance: {db_instance_identifier}\")\n        rds.stop_db_instance(DBInstanceIdentifier=db_instance_identifier)\n    elif action == 'start':\n        print(f\"Starting RDS instance: {db_instance_identifier}\")\n        rds.start_db_instance(DBInstanceIdentifier=db_instance_identifier)\n    else:\n        print(f\"Unknown action: {action}\")\n\"\"\"\n\n# Lambda Fonksiyonu Olu\u015fturma\nrds_scheduler_lambda = lambda_.Function(self, \"RDSSchedulerLambda\",\n    runtime=lambda_.Runtime.PYTHON_3_9,\n    handler=\"index.handler\",\n    code=lambda_.Code.from_inline(lambda_code),\n    environment={\n        \"DB_INSTANCE_IDENTIFIER\": self.db_instance.db_instance_identifier # Daha \u00f6nce olu\u015fturulan RDS'in ID'si\n    }\n    # IAM rolleri i\u00e7in gerekli izinleri burada eklemeniz gerekir (rds:StopDBInstance, rds:StartDBInstance)\n)\n\n# Durdurma i\u00e7in EventBridge Kural\u0131 (Her ak\u015fam 19:00 UTC)\nevents.Rule(self, \"StopRDSRule\",\n    schedule=events.Schedule.cron(minute=\"0\", hour=\"19\", day=\"*\", month=\"*\", year=\"*\"),\n    targets=[targets.LambdaFunction(rds_scheduler_lambda,\n        event=events.RuleTargetInput.from_object({\"action\": \"stop\"})\n    )]\n)\n\n# Ba\u015flatma i\u00e7in EventBridge Kural\u0131 (Her sabah 07:00 UTC)\nevents.Rule(self, \"StartRDSRule\",\n    schedule=events.Schedule.cron(minute=\"0\", hour=\"7\", day=\"*\", month=\"*\", year=\"*\"),\n    targets=[targets.LambdaFunction(rds_scheduler_lambda,\n        event=events.RuleTargetInput.from_object({\"action\": \"start\"})\n    )]\n)\n<\/pre>\n<p><\/code><\/p>\n<p>Bu yakla\u015f\u0131m, manuel m\u00fcdahaleye gerek kalmadan maliyet tasarrufu sa\u011flar. \u00d6zellikle yo\u011fun mesai saatleri d\u0131\u015f\u0131nda veritaban\u0131 kullan\u0131m\u0131n\u0131n az oldu\u011fu geli\u015ftirme ve test ortamlar\u0131 i\u00e7in idealdir. Bir e-ticaret \u015firketinin geli\u015ftirme ekibi, bu y\u00f6ntemle her ay %30'a varan RDS maliyeti tasarrufu sa\u011flad\u0131\u011f\u0131n\u0131 fark etmi\u015ftir.<\/p>\n<div class=\"expert-tip\">Uzman \u0130pucu: \u00dcretim ortamlar\u0131nda RDS Multi-AZ kullanmak y\u00fcksek eri\u015filebilirlik sa\u011flarken, geli\u015ftirme\/test ortamlar\u0131nda tek AZ ve durdurma\/ba\u015flatma otomasyonu maliyetleri d\u00fc\u015f\u00fcrmenin anahtar\u0131d\u0131r.<\/div>\n<h3>Felaket Kurtarma ve Y\u00fcksek Eri\u015filebilirlik: Multi-AZ Yap\u0131s\u0131<\/h3>\n<p>\u00dcretim ortamlar\u0131nda veri kayb\u0131 veya hizmet kesintisi kabul edilemezdir. AWS RDS'in Multi-AZ \u00f6zelli\u011fi, birincil veritaban\u0131 \u00f6rne\u011finizin farkl\u0131 bir Availability Zone'da senkronize bir yede\u011fini tutarak y\u00fcksek eri\u015filebilirlik ve felaket kurtarma sa\u011flar. Birincil \u00f6rnekte bir sorun oldu\u011funda (donan\u0131m ar\u0131zas\u0131, AZ kesintisi vb.), RDS otomatik olarak yedek \u00f6rne\u011fe devir teslim (failover) yapar. CDK ile bunu etkinle\u015ftirmek \u00e7ok basittir:<\/p>\n<pre><code class=\"language-python\">\n# RDS olu\u015ftururken:\nself.db_instance = rds.DatabaseInstance(self, \"ProductionPostgresInstance\",\n    # ... di\u011fer parametreler ...\n    multi_az=True, # \u00dcretim ortamlar\u0131 i\u00e7in bu kesinlikle True olmal\u0131\n    deletion_protection=True # \u00dcretim ortamlar\u0131 i\u00e7in bu da True olmal\u0131\n)\n<\/pre>\n<p><\/code><\/p>\n<p>Bu tek bir parametre de\u011fi\u015fikli\u011fi, veritaban\u0131n\u0131z\u0131n dayan\u0131kl\u0131l\u0131\u011f\u0131n\u0131 ve eri\u015filebilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. B\u00fcy\u00fck bir medya \u015firketinin i\u00e7erik y\u00f6netim sistemi, bu Multi-AZ yap\u0131s\u0131 sayesinde, bir AZ'deki elektrik kesintisine ra\u011fmen hi\u00e7bir kesinti ya\u015famadan \u00e7al\u0131\u015fmaya devam etmi\u015ftir.<\/p>\n<h3>Veritaban\u0131 Kimlik Bilgileri Y\u00f6netimi: AWS Secrets Manager ile Entegrasyon<\/h3>\n<p>Veritaban\u0131 \u015fifrelerini kod i\u00e7inde veya yap\u0131land\u0131rma dosyalar\u0131nda d\u00fcz metin olarak saklamak b\u00fcy\u00fck bir g\u00fcvenlik riskidir. AWS Secrets Manager, bu t\u00fcr hassas bilgileri g\u00fcvenli bir \u015fekilde depolaman\u0131z\u0131 ve y\u00f6netmenizi sa\u011flar. CDK ile RDS \u00f6rne\u011fi olu\u015ftururken, kimlik bilgilerini do\u011frudan Secrets Manager'dan alacak \u015fekilde yap\u0131land\u0131rabiliriz. Daha \u00f6nce g\u00f6sterdi\u011fimiz kodda bu entegrasyonu zaten yapm\u0131\u015ft\u0131k:<\/p>\n<pre><code class=\"language-python\">\ndb_credentials_secret = secretsmanager.Secret(self, \"DBCredentialsSecret\",\n    secret_name=\"PostgresDbCredentials\",\n    generate_secret_string=secretsmanager.SecretStringGenerator(\n        secret_string_template='{\"username\": \"postgres\"}',\n        exclude_characters='@\/\"\\'\\\\',\n        password_length=16\n    )\n)\n\nself.db_instance = rds.DatabaseInstance(self, \"PostgresInstance\",\n    # ...\n    credentials=rds.Credentials.from_secret(db_credentials_secret),\n    # ...\n)\n<\/pre>\n<p><\/code><\/p>\n<p>Bu, uygulaman\u0131z\u0131n veritaban\u0131na ba\u011flanmak i\u00e7in Secrets Manager'dan dinamik olarak kimlik bilgilerini \u00e7ekmesini sa\u011flar. Geli\u015ftiricilerin veya CI\/CD boru hatlar\u0131n\u0131n hassas bilgilere do\u011frudan eri\u015fmesini engeller. Bu durum, finans sekt\u00f6r\u00fcndeki bir \u015firket i\u00e7in uyumluluk gereksinimlerini kar\u015f\u0131lamada kritik bir rol oynam\u0131\u015ft\u0131r.<\/p>\n<h3>CI\/CD Entegrasyonu: Otomatik Da\u011f\u0131t\u0131mlar Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>AWS CDK kodunuzu bir CI\/CD boru hatt\u0131na entegre etmek, altyap\u0131 de\u011fi\u015fikliklerinin otomatik olarak test edilmesini ve da\u011f\u0131t\u0131lmas\u0131n\u0131 sa\u011flar. Bu, insan hatas\u0131n\u0131 azalt\u0131r, da\u011f\u0131t\u0131m h\u0131z\u0131n\u0131 art\u0131r\u0131r ve tutarl\u0131l\u0131\u011f\u0131 garanti eder. AWS CodePipeline, GitHub Actions veya GitLab CI gibi ara\u00e7lar\u0131 kullanarak CDK uygulamalar\u0131n\u0131z\u0131 otomatikle\u015ftirebilirsiniz.<\/p>\n<p>\u00d6rnek bir GitHub Actions i\u015f ak\u0131\u015f\u0131 (workflow) \u015f\u00f6yle g\u00f6r\u00fcnebilir:<\/p>\n<pre><code class=\"language-yaml\">\n# .github\/workflows\/deploy-cdk.yml\nname: CDK Deploy\n\non:\n  push:\n    branches:\n      - main\n  pull_request:\n    branches:\n      - main\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    steps:\n    - name: Checkout code\n      uses: actions\/checkout@v3\n\n    - name: Set up Python\n      uses: actions\/setup-python@v4\n      with:\n        python-version: '3.9'\n\n    - name: Install Node.js\n      uses: actions\/setup-node@v3\n      with:\n        node-version: '16'\n\n    - name: Install dependencies\n      run: |\n        npm install -g aws-cdk\n        python -m venv .venv\n        source .venv\/bin\/activate\n        pip install -r requirements.txt\n        pip install aws-cdk.aws-ec2 aws-cdk.aws-rds aws-cdk.aws-secretsmanager\n\n    - name: Configure AWS credentials\n      uses: aws-actions\/configure-aws-credentials@v2\n      with:\n        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}\n        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n        aws-region: us-east-1 # Kendi b\u00f6lgenizi buraya yaz\u0131n\n\n    - name: CDK Bootstrap\n      run: cdk bootstrap aws:\/\/${{ secrets.AWS_ACCOUNT_ID }}\/us-east-1\n\n    - name: CDK Synth\n      run: cdk synth\n\n    - name: CDK Deploy\n      run: cdk deploy --require-approval never # \u00dcretim ortamlar\u0131nda --require-approval 'never' kullanmaktan ka\u00e7\u0131n\u0131n\n<\/pre>\n<p><\/code><\/p>\n<p>Bu i\u015f ak\u0131\u015f\u0131, her <code>main<\/code> branch'ine yap\u0131lan push veya pull request'te CDK kodunuzu sentezler ve da\u011f\u0131t\u0131r. Bu, bir SaaS \u015firketinin yeni \u00f6zelliklerini veya altyap\u0131 g\u00fcncellemelerini haftalar yerine saatler i\u00e7inde yay\u0131nlamas\u0131n\u0131 sa\u011flayarak pazara sunma s\u00fcresini (Time-to-Market) \u00f6nemli \u00f6l\u00e7\u00fcde k\u0131saltm\u0131\u015ft\u0131r.<\/p>\n<h2>Sonu\u00e7 ve Gelecek Ad\u0131mlar<\/h2>\n<p>Bu kapsaml\u0131 rehberde, AWS CDK ve Python'\u0131n g\u00fcc\u00fcn\u00fc kullanarak g\u00fcvenli ve otomatik bir PostgreSQL veritaban\u0131 altyap\u0131s\u0131n\u0131 nas\u0131l olu\u015fturaca\u011f\u0131m\u0131z\u0131 detayl\u0131 bir \u015fekilde inceledik. Bir Virtual Private Cloud (VPC) i\u00e7inde izole edilmi\u015f, bir Bastion host \u00fczerinden g\u00fcvenli eri\u015fim sa\u011flayan ve AWS RDS ile y\u00f6netilen bir PostgreSQL \u00f6rne\u011fini ad\u0131m ad\u0131m da\u011f\u0131tt\u0131k. Ayr\u0131ca, maliyet optimizasyonu, felaket kurtarma, kimlik bilgileri y\u00f6netimi ve CI\/CD entegrasyonu gibi ger\u00e7ek d\u00fcnya senaryolar\u0131n\u0131 ele alarak, CDK'n\u0131n sadece da\u011f\u0131t\u0131m arac\u0131 olman\u0131n \u00f6tesinde, t\u00fcm ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca altyap\u0131y\u0131 y\u00f6netmede ne kadar de\u011ferli bir ara\u00e7 oldu\u011funu g\u00f6sterdik. Bu yakla\u015f\u0131mlar, modern bulut mimarilerinde verimlilik, g\u00fcvenlik ve \u00f6l\u00e7eklenebilirlik sa\u011flaman\u0131n temelini olu\u015fturur.<\/p>\n<p>AWS CDK ile altyap\u0131y\u0131 kod olarak y\u00f6netmek, geli\u015ftirme ekiplerine daha fazla kontrol, tutarl\u0131l\u0131k ve otomasyon yetene\u011fi sunar. Python gibi tan\u0131d\u0131k bir programlama diliyle \u00e7al\u0131\u015fmak, \u00f6\u011frenme e\u011frisini azalt\u0131r ve daha karma\u015f\u0131k, mant\u0131ksal altyap\u0131 tan\u0131mlamalar\u0131na olanak tan\u0131r. Art\u0131k manuel yap\u0131land\u0131rmalar\u0131n getirdi\u011fi hatalardan, g\u00fcvenlik risklerinden ve zaman kay\u0131plar\u0131ndan kurtulabilir, bunun yerine i\u015f de\u011ferine odaklanabilirsiniz. Bu rehberin sundu\u011fu bilgilerle, kendi AWS altyap\u0131n\u0131z\u0131 daha bilin\u00e7li ve g\u00fcvenli bir \u015fekilde tasarlayabilecek ve y\u00f6netebileceksiniz.<\/p>\n<p>Gelecek ad\u0131mlar olarak, CDK bilginizi daha da ileriye ta\u015f\u0131mak i\u00e7in AWS servislerinin daha karma\u015f\u0131k entegrasyonlar\u0131n\u0131 (\u00f6rne\u011fin, Fargate, Lambda, SQS, SNS) ke\u015ffedebilir, kendi \u00f6zel CDK yap\u0131lar\u0131n\u0131 (constructs) olu\u015fturabilir ve \u00e7oklu hesap\/\u00e7oklu b\u00f6lge da\u011f\u0131t\u0131mlar\u0131n\u0131 otomatize etme \u00fczerine yo\u011funla\u015fabilirsiniz. Unutmay\u0131n, bulut altyap\u0131s\u0131 s\u00fcrekli geli\u015fen bir aland\u0131r ve s\u00fcrekli \u00f6\u011frenme, ba\u015far\u0131n\u0131n anahtar\u0131d\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><strong>1. AWS CDK nedir ve neden kullanmal\u0131y\u0131m?<\/strong><\/p>\n<p>AWS Cloud Development Kit (CDK), AWS kaynaklar\u0131n\u0131 tan\u0131d\u0131k programlama dilleri (Python, TypeScript, Java vb.) kullanarak tan\u0131mlaman\u0131za olanak tan\u0131yan bir a\u00e7\u0131k kaynakl\u0131 yaz\u0131l\u0131m geli\u015ftirme \u00e7er\u00e7evesidir. Geleneksel JSON\/YAML tabanl\u0131 CloudFormation \u015fablonlar\u0131na g\u00f6re daha \u00fcst d\u00fczey bir soyutlama sunar. CDK kullanmak, altyap\u0131y\u0131 kod olarak (IaC) y\u00f6netmenizi, tekrarlanabilir, s\u00fcrd\u00fcr\u00fclebilir ve \u00f6l\u00e7eklenebilir altyap\u0131lar olu\u015fturman\u0131z\u0131 sa\u011flar. Daha h\u0131zl\u0131 da\u011f\u0131t\u0131m, daha az hata ve daha iyi s\u00fcr\u00fcm kontrol\u00fc gibi avantajlar sunar.<\/p>\n<p><strong>2. Bastion Host kullanmak zorunlu mu?<\/strong><\/p>\n<p>Hay\u0131r, zorunlu de\u011fildir, ancak y\u00fcksek g\u00fcvenlik gerektiren ortamlarda \u015fiddetle tavsiye edilir. Bastion host, \u00f6zel alt a\u011flarda bulunan kaynaklara (veritabanlar\u0131, uygulama sunucular\u0131) g\u00fcvenli ve denetlenebilir bir eri\u015fim noktas\u0131 sa\u011flar. Direkt eri\u015fim yerine tek bir kontroll\u00fc giri\u015f noktas\u0131 olu\u015fturarak sald\u0131r\u0131 y\u00fczeyini azalt\u0131r. Alternatif olarak AWS Systems Manager Session Manager gibi servicesiz \u00e7\u00f6z\u00fcmler de kullan\u0131labilir, ancak Bastion host hala bir\u00e7ok senaryoda basit ve etkili bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<p><strong>3. AWS RDS'in avantajlar\u0131 nelerdir?<\/strong><\/p>\n<p>AWS RDS, ili\u015fkisel veritaban\u0131 y\u00f6netimiyle ilgili bir\u00e7ok operasyonel g\u00f6revi (yedekleme, yama uygulama, yaz\u0131l\u0131m y\u00fckseltmeleri, donan\u0131m tedariki, ar\u0131za tespiti ve kurtarma) AWS'nin \u00fcstlenmesini sa\u011flayarak \u00f6nemli avantajlar sunar. Y\u00fcksek eri\u015filebilirlik (Multi-AZ), otomatik yedeklemeler, kolay \u00f6l\u00e7eklenebilirlik, g\u00fcvenlik gruplar\u0131 ile entegrasyon ve \u00e7e\u015fitli veritaban\u0131 motoru se\u00e7enekleri (PostgreSQL, MySQL, SQL Server vb.) ile geli\u015ftiricilerin veritaban\u0131 altyap\u0131s\u0131yla u\u011fra\u015fmak yerine uygulama geli\u015ftirmeye odaklanmas\u0131n\u0131 sa\u011flar.<\/p>\n<p><strong>4. CDK kodunu nas\u0131l versiyonlar\u0131m ve CI\/CD ile nas\u0131l entegre ederim?<\/strong><\/p>\n<p>CDK kodu, normal bir yaz\u0131l\u0131m projesi gibi s\u00fcr\u00fcm kontrol sistemleri (Git, GitHub, GitLab, Bitbucket vb.) ile versiyonlanmal\u0131d\u0131r. <code>requirements.txt<\/code> dosyan\u0131z\u0131 ve CDK kodunuzu repository'nize ekleyerek de\u011fi\u015fiklikleri takip edebilirsiniz. CI\/CD entegrasyonu i\u00e7in, GitHub Actions, AWS CodePipeline veya Jenkins gibi ara\u00e7lar\u0131 kullanabilirsiniz. Bu ara\u00e7lar, kodunuzda yap\u0131lan her de\u011fi\u015fikli\u011fi otomatik olarak test edebilir, sentezleyebilir (<code>cdk synth<\/code>) ve AWS hesab\u0131n\u0131za da\u011f\u0131tabilir (<code>cdk deploy<\/code>), b\u00f6ylece s\u00fcrekli bir da\u011f\u0131t\u0131m s\u00fcreci olu\u015fturabilirsiniz.<\/p>\n<p><strong>5. Da\u011f\u0131t\u0131lan AWS kaynaklar\u0131n\u0131n maliyetlerini nas\u0131l izleyebilirim?<\/strong><\/p>\n<p>AWS kaynaklar\u0131n\u0131n maliyetlerini izlemek i\u00e7in AWS Cost Explorer ve AWS Budgets gibi yerle\u015fik ara\u00e7lar\u0131 kullanabilirsiniz. Ayr\u0131ca, CDK'da kaynaklar\u0131n\u0131z\u0131 etiketleyerek (tagging) maliyetleri daha gran\u00fcler bir \u015fekilde takip edebilirsiniz. \u00d6rne\u011fin, her CDK Stack'inize bir <code>Environment<\/code> (Geli\u015ftirme, Test, \u00dcretim) veya <code>Project<\/code> etiketi ekleyerek, maliyet raporlar\u0131nda bu etiketlere g\u00f6re filtreleme yapabilir ve hangi ortam\u0131n veya projenin ne kadar harcad\u0131\u011f\u0131n\u0131 net bir \u015fekilde g\u00f6rebilirsiniz. Bu, maliyet optimizasyonu ve b\u00fct\u00e7eleme i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Modern yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, h\u0131zl\u0131, g\u00fcvenli ve tekrarlanabilir altyap\u0131 da\u011f\u0131t\u0131m\u0131 kritik bir \u00f6neme sahiptir. Manuel kurulumlar zaman al\u0131c\u0131&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1406],"tags":[],"class_list":{"0":"post-31713","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-aws","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>AWS CDK ile PostgreSQL + Bastion + VPC Da\u011f\u0131t\u0131m\u0131: Kapsaml\u0131 Rehber<\/title>\n<meta name=\"description\" content=\"Modern yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, h\u0131zl\u0131, g\u00fcvenli ve tekrarlanabilir altyap\u0131 da\u011f\u0131t\u0131m\u0131 kritik bir \u00f6neme sahiptir. Manuel kurulumlar zaman al\u0131c\u0131 olman\u0131n yan\u0131 s\u0131ra hata yapma potansiyelini art\u0131r\u0131r ve \u00f6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli projelerde s\u00fcrd\u00fcr\u00fclebilirli\u011fi zorla\u015ft\u0131r\u0131r. G\u00fcvenlik a\u00e7\u0131klar\u0131, yap\u0131land\u0131rma hatalar\u0131 ve uyumluluk sorunlar\u0131 gibi pek \u00e7ok risk fakt\u00f6r\u00fc, manuel yakla\u015f\u0131mlarla ortaya \u00e7\u0131kabilmektedir. \u00d6rne\u011fin, bir geli\u015ftirici ekibinin her yeni ortam i\u00e7in ayn\u0131 PostgreSQL veritaban\u0131n\u0131, Bastion host&#039;u ve VPC&#039;yi manuel olarak yap\u0131land\u0131rmak zorunda kalmas\u0131, hem verimlili\u011fi d\u00fc\u015f\u00fcr\u00fcr hem de farkl\u0131 ortamlar aras\u0131nda tutars\u0131zl\u0131klar yaratabilir. \u0130\u015fte tam da bu noktada, altyap\u0131y\u0131 kod olarak (Infrastructure as Code - IaC) y\u00f6netme ihtiyac\u0131 do\u011far.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/aws-cdk-ile-postgresql-bastion-vpc-dagitimi-kapsamli-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"AWS CDK ile PostgreSQL + Bastion + VPC Da\u011f\u0131t\u0131m\u0131: Kapsaml\u0131 Rehber\" \/>\n<meta property=\"og:description\" content=\"Modern yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, h\u0131zl\u0131, g\u00fcvenli ve tekrarlanabilir altyap\u0131 da\u011f\u0131t\u0131m\u0131 kritik bir \u00f6neme sahiptir. Manuel kurulumlar zaman al\u0131c\u0131 olman\u0131n yan\u0131 s\u0131ra hata yapma potansiyelini art\u0131r\u0131r ve \u00f6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli projelerde s\u00fcrd\u00fcr\u00fclebilirli\u011fi zorla\u015ft\u0131r\u0131r. G\u00fcvenlik a\u00e7\u0131klar\u0131, yap\u0131land\u0131rma hatalar\u0131 ve uyumluluk sorunlar\u0131 gibi pek \u00e7ok risk fakt\u00f6r\u00fc, manuel yakla\u015f\u0131mlarla ortaya \u00e7\u0131kabilmektedir. \u00d6rne\u011fin, bir geli\u015ftirici ekibinin her yeni ortam i\u00e7in ayn\u0131 PostgreSQL veritaban\u0131n\u0131, Bastion host&#039;u ve VPC&#039;yi manuel olarak yap\u0131land\u0131rmak zorunda kalmas\u0131, hem verimlili\u011fi d\u00fc\u015f\u00fcr\u00fcr hem de farkl\u0131 ortamlar aras\u0131nda tutars\u0131zl\u0131klar yaratabilir. \u0130\u015fte tam da bu noktada, altyap\u0131y\u0131 kod olarak (Infrastructure as Code - IaC) y\u00f6netme ihtiyac\u0131 do\u011far.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/aws-cdk-ile-postgresql-bastion-vpc-dagitimi-kapsamli-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-13T02:31:22+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"29 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/aws-cdk-ile-postgresql-bastion-vpc-dagitimi-kapsamli-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/aws-cdk-ile-postgresql-bastion-vpc-dagitimi-kapsamli-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"AWS CDK ile PostgreSQL + Bastion + VPC Da\u011f\u0131t\u0131m\u0131: Kapsaml\u0131 Rehber\",\"datePublished\":\"2025-10-13T02:31:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/aws-cdk-ile-postgresql-bastion-vpc-dagitimi-kapsamli-rehber\/\"},\"wordCount\":4637,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"AWS\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/aws-cdk-ile-postgresql-bastion-vpc-dagitimi-kapsamli-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/aws-cdk-ile-postgresql-bastion-vpc-dagitimi-kapsamli-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/aws-cdk-ile-postgresql-bastion-vpc-dagitimi-kapsamli-rehber\/\",\"name\":\"AWS CDK ile PostgreSQL + Bastion + VPC Da\u011f\u0131t\u0131m\u0131: Kapsaml\u0131 Rehber\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-13T02:31:22+00:00\",\"description\":\"Modern yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, h\u0131zl\u0131, g\u00fcvenli ve tekrarlanabilir altyap\u0131 da\u011f\u0131t\u0131m\u0131 kritik bir \u00f6neme sahiptir. Manuel kurulumlar zaman al\u0131c\u0131 olman\u0131n yan\u0131 s\u0131ra hata yapma potansiyelini art\u0131r\u0131r ve \u00f6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli projelerde s\u00fcrd\u00fcr\u00fclebilirli\u011fi zorla\u015ft\u0131r\u0131r. G\u00fcvenlik a\u00e7\u0131klar\u0131, yap\u0131land\u0131rma hatalar\u0131 ve uyumluluk sorunlar\u0131 gibi pek \u00e7ok risk fakt\u00f6r\u00fc, manuel yakla\u015f\u0131mlarla ortaya \u00e7\u0131kabilmektedir. \u00d6rne\u011fin, bir geli\u015ftirici ekibinin her yeni ortam i\u00e7in ayn\u0131 PostgreSQL veritaban\u0131n\u0131, Bastion host'u ve VPC'yi manuel olarak yap\u0131land\u0131rmak zorunda kalmas\u0131, hem verimlili\u011fi d\u00fc\u015f\u00fcr\u00fcr hem de farkl\u0131 ortamlar aras\u0131nda tutars\u0131zl\u0131klar yaratabilir. \u0130\u015fte tam da bu noktada, altyap\u0131y\u0131 kod olarak (Infrastructure as Code - IaC) y\u00f6netme ihtiyac\u0131 do\u011far.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/aws-cdk-ile-postgresql-bastion-vpc-dagitimi-kapsamli-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/aws-cdk-ile-postgresql-bastion-vpc-dagitimi-kapsamli-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/aws-cdk-ile-postgresql-bastion-vpc-dagitimi-kapsamli-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"AWS CDK ile PostgreSQL + Bastion + VPC Da\u011f\u0131t\u0131m\u0131: Kapsaml\u0131 Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"AWS CDK ile PostgreSQL + Bastion + VPC Da\u011f\u0131t\u0131m\u0131: Kapsaml\u0131 Rehber","description":"Modern yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, h\u0131zl\u0131, g\u00fcvenli ve tekrarlanabilir altyap\u0131 da\u011f\u0131t\u0131m\u0131 kritik bir \u00f6neme sahiptir. Manuel kurulumlar zaman al\u0131c\u0131 olman\u0131n yan\u0131 s\u0131ra hata yapma potansiyelini art\u0131r\u0131r ve \u00f6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli projelerde s\u00fcrd\u00fcr\u00fclebilirli\u011fi zorla\u015ft\u0131r\u0131r. G\u00fcvenlik a\u00e7\u0131klar\u0131, yap\u0131land\u0131rma hatalar\u0131 ve uyumluluk sorunlar\u0131 gibi pek \u00e7ok risk fakt\u00f6r\u00fc, manuel yakla\u015f\u0131mlarla ortaya \u00e7\u0131kabilmektedir. \u00d6rne\u011fin, bir geli\u015ftirici ekibinin her yeni ortam i\u00e7in ayn\u0131 PostgreSQL veritaban\u0131n\u0131, Bastion host'u ve VPC'yi manuel olarak yap\u0131land\u0131rmak zorunda kalmas\u0131, hem verimlili\u011fi d\u00fc\u015f\u00fcr\u00fcr hem de farkl\u0131 ortamlar aras\u0131nda tutars\u0131zl\u0131klar yaratabilir. \u0130\u015fte tam da bu noktada, altyap\u0131y\u0131 kod olarak (Infrastructure as Code - IaC) y\u00f6netme ihtiyac\u0131 do\u011far.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/aws-cdk-ile-postgresql-bastion-vpc-dagitimi-kapsamli-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"AWS CDK ile PostgreSQL + Bastion + VPC Da\u011f\u0131t\u0131m\u0131: Kapsaml\u0131 Rehber","og_description":"Modern yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, h\u0131zl\u0131, g\u00fcvenli ve tekrarlanabilir altyap\u0131 da\u011f\u0131t\u0131m\u0131 kritik bir \u00f6neme sahiptir. Manuel kurulumlar zaman al\u0131c\u0131 olman\u0131n yan\u0131 s\u0131ra hata yapma potansiyelini art\u0131r\u0131r ve \u00f6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli projelerde s\u00fcrd\u00fcr\u00fclebilirli\u011fi zorla\u015ft\u0131r\u0131r. G\u00fcvenlik a\u00e7\u0131klar\u0131, yap\u0131land\u0131rma hatalar\u0131 ve uyumluluk sorunlar\u0131 gibi pek \u00e7ok risk fakt\u00f6r\u00fc, manuel yakla\u015f\u0131mlarla ortaya \u00e7\u0131kabilmektedir. \u00d6rne\u011fin, bir geli\u015ftirici ekibinin her yeni ortam i\u00e7in ayn\u0131 PostgreSQL veritaban\u0131n\u0131, Bastion host'u ve VPC'yi manuel olarak yap\u0131land\u0131rmak zorunda kalmas\u0131, hem verimlili\u011fi d\u00fc\u015f\u00fcr\u00fcr hem de farkl\u0131 ortamlar aras\u0131nda tutars\u0131zl\u0131klar yaratabilir. \u0130\u015fte tam da bu noktada, altyap\u0131y\u0131 kod olarak (Infrastructure as Code - IaC) y\u00f6netme ihtiyac\u0131 do\u011far.","og_url":"https:\/\/fatihsoysal.com\/blog\/aws-cdk-ile-postgresql-bastion-vpc-dagitimi-kapsamli-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-13T02:31:22+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"29 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/aws-cdk-ile-postgresql-bastion-vpc-dagitimi-kapsamli-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/aws-cdk-ile-postgresql-bastion-vpc-dagitimi-kapsamli-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"AWS CDK ile PostgreSQL + Bastion + VPC Da\u011f\u0131t\u0131m\u0131: Kapsaml\u0131 Rehber","datePublished":"2025-10-13T02:31:22+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/aws-cdk-ile-postgresql-bastion-vpc-dagitimi-kapsamli-rehber\/"},"wordCount":4637,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["AWS"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/aws-cdk-ile-postgresql-bastion-vpc-dagitimi-kapsamli-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/aws-cdk-ile-postgresql-bastion-vpc-dagitimi-kapsamli-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/aws-cdk-ile-postgresql-bastion-vpc-dagitimi-kapsamli-rehber\/","name":"AWS CDK ile PostgreSQL + Bastion + VPC Da\u011f\u0131t\u0131m\u0131: Kapsaml\u0131 Rehber","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-13T02:31:22+00:00","description":"Modern yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, h\u0131zl\u0131, g\u00fcvenli ve tekrarlanabilir altyap\u0131 da\u011f\u0131t\u0131m\u0131 kritik bir \u00f6neme sahiptir. Manuel kurulumlar zaman al\u0131c\u0131 olman\u0131n yan\u0131 s\u0131ra hata yapma potansiyelini art\u0131r\u0131r ve \u00f6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli projelerde s\u00fcrd\u00fcr\u00fclebilirli\u011fi zorla\u015ft\u0131r\u0131r. G\u00fcvenlik a\u00e7\u0131klar\u0131, yap\u0131land\u0131rma hatalar\u0131 ve uyumluluk sorunlar\u0131 gibi pek \u00e7ok risk fakt\u00f6r\u00fc, manuel yakla\u015f\u0131mlarla ortaya \u00e7\u0131kabilmektedir. \u00d6rne\u011fin, bir geli\u015ftirici ekibinin her yeni ortam i\u00e7in ayn\u0131 PostgreSQL veritaban\u0131n\u0131, Bastion host'u ve VPC'yi manuel olarak yap\u0131land\u0131rmak zorunda kalmas\u0131, hem verimlili\u011fi d\u00fc\u015f\u00fcr\u00fcr hem de farkl\u0131 ortamlar aras\u0131nda tutars\u0131zl\u0131klar yaratabilir. \u0130\u015fte tam da bu noktada, altyap\u0131y\u0131 kod olarak (Infrastructure as Code - IaC) y\u00f6netme ihtiyac\u0131 do\u011far.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/aws-cdk-ile-postgresql-bastion-vpc-dagitimi-kapsamli-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/aws-cdk-ile-postgresql-bastion-vpc-dagitimi-kapsamli-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/aws-cdk-ile-postgresql-bastion-vpc-dagitimi-kapsamli-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"AWS CDK ile PostgreSQL + Bastion + VPC Da\u011f\u0131t\u0131m\u0131: Kapsaml\u0131 Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31713","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31713"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31713\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31713"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31713"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31713"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}