{"id":31741,"date":"2025-10-13T12:32:03","date_gmt":"2025-10-13T09:32:03","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/awste-uretim-seviyesi-cok-katmanli-web-altyapisi-olusturmak-cdk-ve-cli-ile-adim-adim-rehber\/"},"modified":"2025-10-13T12:32:03","modified_gmt":"2025-10-13T09:32:03","slug":"awste-uretim-seviyesi-cok-katmanli-web-altyapisi-olusturmak-cdk-ve-cli-ile-adim-adim-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/awste-uretim-seviyesi-cok-katmanli-web-altyapisi-olusturmak-cdk-ve-cli-ile-adim-adim-rehber\/","title":{"rendered":"AWS&#8217;te \u00dcretim Seviyesi \u00c7ok Katmanl\u0131 Web Altyap\u0131s\u0131 Olu\u015fturmak: CDK ve CLI ile Ad\u0131m Ad\u0131m Rehber"},"content":{"rendered":"<p><body><\/p>\n<p>AWS CDK ve CLI kullanarak \u00fcretim seviyesinde, g\u00fcvenilir ve \u00f6l\u00e7eklenebilir \u00e7ok katmanl\u0131 web altyap\u0131s\u0131 nas\u0131l in\u015fa edilir? Bu makale, s\u0131f\u0131rdan ileri d\u00fczeye detayl\u0131 bir rehber sunuyor ve bulut altyap\u0131n\u0131z\u0131 otomatize etmenizi sa\u011fl\u0131yor.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz dijital d\u00fcnyas\u0131nda, bir web uygulamas\u0131n\u0131n ba\u015far\u0131s\u0131 sadece sundu\u011fu \u00f6zelliklerle de\u011fil, ayn\u0131 zamanda temelini olu\u015fturan altyap\u0131n\u0131n sa\u011flaml\u0131\u011f\u0131yla da \u00f6l\u00e7\u00fcl\u00fcr. Hen\u00fcz yeni ba\u015flayan bir proje i\u00e7in basit bir sunucu yeterli olabilirken, kullan\u0131c\u0131 trafi\u011fi artt\u0131\u011f\u0131nda, i\u015f y\u00fck\u00fc \u00e7e\u015fitlendi\u011finde veya uygulaman\u0131n kritiklik d\u00fczeyi y\u00fckseldi\u011finde, &#8220;basit&#8221; altyap\u0131lar h\u0131zla darbo\u011faz haline gelebilir. Peki, uygulaman\u0131z\u0131n milyonlarca kullan\u0131c\u0131ya hizmet vermesini, kesintisiz \u00e7al\u0131\u015fmas\u0131n\u0131 ve veri g\u00fcvenli\u011fini sa\u011flamas\u0131n\u0131 nas\u0131l garantilersiniz?<\/p>\n<p>\u0130\u015fte tam bu noktada, &#8220;\u00fcretim seviyesi&#8221; \u00e7ok katmanl\u0131 bir web altyap\u0131s\u0131 kurman\u0131n \u00f6nemi ortaya \u00e7\u0131kar. Bu, sadece bir veya iki sunucuyu \u00e7al\u0131\u015ft\u0131rmakla ilgili de\u011fildir; ayn\u0131 zamanda \u00f6l\u00e7eklenebilirlik, y\u00fcksek eri\u015filebilirlik, g\u00fcvenlik, maliyet etkinli\u011fi ve y\u00f6netilebilirlik gibi kritik fakt\u00f6rleri ba\u015ftan sona d\u00fc\u015f\u00fcnerek tasarlanm\u0131\u015f bir sistemdir. Bir e-ticaret sitesi d\u00fc\u015f\u00fcn\u00fcn: Black Friday indirimlerinde anl\u0131k trafik patlamalar\u0131n\u0131 kald\u0131rabilmeli, m\u00fc\u015fteri verilerini en \u00fcst d\u00fczeyde koruyabilmeli ve herhangi bir sunucu ar\u0131zas\u0131nda bile \u00e7al\u0131\u015fmaya devam edebilmelidir. Bu beklentiler, tek bir sunucunun kapasitesini a\u015far ve daha sofistike bir mimari gerektirir.<\/p>\n<p>AWS (Amazon Web Services) gibi bulut platformlar\u0131, bu karma\u015f\u0131k gereksinimleri kar\u015f\u0131lamak i\u00e7in geni\u015f bir hizmet yelpazesi sunar. Ancak bu hizmetleri manuel olarak y\u00f6netmek veya her de\u011fi\u015fiklikte ba\u015ftan yap\u0131land\u0131rmak hem zaman al\u0131c\u0131 hem de hataya a\u00e7\u0131kt\u0131r. Burada devreye altyap\u0131n\u0131n kod olarak y\u00f6netilmesi (Infrastructure as Code &#8211; IaC) kavram\u0131 girer. AWS CDK (Cloud Development Kit) ve AWS CLI (Command Line Interface), IaC felsefesini benimseyerek, bulut altyap\u0131n\u0131z\u0131 programatik olarak tan\u0131mlaman\u0131za ve otomatikle\u015ftirmenize olanak tan\u0131r. Bu ara\u00e7lar sayesinde, altyap\u0131n\u0131z\u0131n versiyon kontrol\u00fcn\u00fc yapabilir, tekrarlanabilir da\u011f\u0131t\u0131mlar ger\u00e7ekle\u015ftirebilir ve geli\u015ftirme, test ve \u00fcretim ortamlar\u0131 aras\u0131nda tutarl\u0131l\u0131\u011f\u0131 sa\u011flayabilirsiniz. Bu makale boyunca, bu g\u00fc\u00e7l\u00fc ara\u00e7lar\u0131 kullanarak, uygulaman\u0131z\u0131n gelecekteki b\u00fcy\u00fcme ve zorluklara haz\u0131r, g\u00fcvenilir bir temel \u00fczerine nas\u0131l oturtulaca\u011f\u0131n\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. \u0130\u015fte bu heyecan verici yolculu\u011fa \u015fimdi \u00e7\u0131kal\u0131m!<\/p>\n<h2>Temel Kavramlar: AWS CDK, AWS CLI ve \u00c7ok Katmanl\u0131 Mimariyi Anlamak<\/h2>\n<p>Bulut altyap\u0131s\u0131 olu\u015fturma ser\u00fcvenimize ba\u015flamadan \u00f6nce, temel ta\u015flar\u0131 iyi anlamam\u0131z gerekiyor. AWS CDK, AWS CLI ve \u00e7ok katmanl\u0131 mimari, \u00fcretim seviyesi bir yap\u0131 in\u015fa etmek i\u00e7in vazge\u00e7ilmez kavramlard\u0131r. Gelin bu temel bile\u015fenleri birlikte inceleyelim.<\/p>\n<h3>AWS CDK Nedir ve Neden Kullanmal\u0131y\u0131z?<\/h3>\n<p>Geleneksel olarak, bulut altyap\u0131s\u0131 kaynaklar\u0131 (sunucular, veritabanlar\u0131, a\u011f yap\u0131land\u0131rmalar\u0131) genellikle AWS y\u00f6netim konsolu \u00fczerinden manuel olarak veya karma\u015f\u0131k YAML\/JSON \u015fablonlar\u0131 (AWS CloudFormation gibi) arac\u0131l\u0131\u011f\u0131yla tan\u0131mlan\u0131rd\u0131. Ancak bu yakla\u015f\u0131mlar, b\u00fcy\u00fck ve dinamik projelerde h\u0131zl\u0131ca y\u00f6netilemez hale gelebilir. \u0130\u015fte AWS CDK&#8217;n\u0131n parlad\u0131\u011f\u0131 nokta tam da buras\u0131.<\/p>\n<p>AWS CDK, bulut kaynaklar\u0131n\u0131z\u0131 tan\u0131d\u0131k programlama dilleri (TypeScript, Python, Java, C#, Go) kullanarak tan\u0131mlaman\u0131za olanak tan\u0131yan a\u00e7\u0131k kaynakl\u0131 bir yaz\u0131l\u0131m geli\u015ftirme \u00e7er\u00e7evesidir. Bu sayede, if-else ko\u015fullar\u0131, d\u00f6ng\u00fcler ve fonksiyonlar gibi bilindik programlama paradigmalar\u0131n\u0131 kullanarak altyap\u0131n\u0131z\u0131 daha esnek, okunabilir ve y\u00f6netilebilir hale getirebilirsiniz. CDK, yazd\u0131\u011f\u0131n\u0131z kodu AWS CloudFormation \u015fablonlar\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fcr ve ard\u0131ndan bu \u015fablonlar\u0131 AWS&#8217;e da\u011f\u0131t\u0131r. B\u00f6ylece, CloudFormation&#8217;\u0131n g\u00fcvenilir ve idempotent da\u011f\u0131t\u0131m yeteneklerinden faydalan\u0131rken, kodun esnekli\u011fini de korursunuz.<\/p>\n<p>CDK&#8217;n\u0131n en b\u00fcy\u00fck avantajlar\u0131ndan biri &#8220;Construct&#8221; ad\u0131 verilen yeniden kullan\u0131labilir soyutlama katmanlar\u0131d\u0131r. \u00d6rne\u011fin, sadece tek bir <code>ec2.Vpc<\/code> construct&#8217;u ile bir VPC, alt a\u011flar, rota tablolar\u0131, internet a\u011f ge\u00e7idi ve NAT a\u011f ge\u00e7idi gibi karma\u015f\u0131k bir a\u011f yap\u0131s\u0131n\u0131 saniyeler i\u00e7inde olu\u015fturabilirsiniz. Bu, geli\u015ftirme h\u0131z\u0131n\u0131z\u0131 art\u0131r\u0131r, best practices&#8217;i (en iyi uygulamalar) otomatik olarak uygulaman\u0131za yard\u0131mc\u0131 olur ve manuel hatalar\u0131 azalt\u0131r.<\/p>\n<p>CDK kurulumu olduk\u00e7a basittir. Node.js y\u00fckl\u00fc bir sistemde a\u015fa\u011f\u0131daki komutlarla global olarak kurabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">\n      npm install -g aws-cdk\n    <\/pre>\n<p><\/code><\/p>\n<p>Yeni bir CDK projesi ba\u015flatmak i\u00e7in ise, tercih etti\u011finiz dil ile (\u00f6rne\u011fin Python i\u00e7in) \u015fu komutu kullan\u0131rs\u0131n\u0131z:<\/p>\n<pre><code class=\"language-bash\">\n      mkdir my-cdk-app && cd my-cdk-app\n      cdk init app --language python\n    <\/pre>\n<p><\/code><\/p>\n<p>Altyap\u0131n\u0131z\u0131 yazd\u0131ktan sonra, <code>cdk synth<\/code> komutu CloudFormation \u015fablonunu olu\u015fturur, <code>cdk deploy<\/code> ise bu \u015fablonu AWS'e da\u011f\u0131t\u0131r.<\/p>\n<h3>AWS CLI: Bulut Kaynaklar\u0131n\u0131z\u0131 Komut Sat\u0131r\u0131ndan Y\u00f6netmek<\/h3>\n<p>AWS CLI (Command Line Interface), AWS hizmetlerini komut sat\u0131r\u0131ndan y\u00f6netmenizi sa\u011flayan g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Otomasyon scriptleri yazmak, rutin g\u00f6revleri ger\u00e7ekle\u015ftirmek veya h\u0131zl\u0131ca kaynak bilgilerini sorgulamak i\u00e7in idealdir. Konsolun g\u00f6rsel aray\u00fcz\u00fcne ihtiya\u00e7 duymadan, AWS ile tam bir etkile\u015fim kurman\u0131z\u0131 sa\u011flar.<\/p>\n<p>CLI'\u0131 kullanmaya ba\u015flamadan \u00f6nce kimlik bilgilerinizi yap\u0131land\u0131rman\u0131z gerekir:<\/p>\n<pre><code class=\"language-bash\">\n      aws configure\n      AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE\n      AWS Secret Access Key [None]: wJalrXUtnFEMI\/K7MDENG\/bPxRfiCYEXAMPLEKEY\n      Default region name [None]: us-east-1\n      Default output format [None]: json\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131land\u0131rma sayesinde CLI, sizin ad\u0131n\u0131za AWS kaynaklar\u0131na g\u00fcvenli bir \u015fekilde eri\u015febilir. CLI ile yapabilece\u011finiz baz\u0131 \u00f6rnek i\u015flemler \u015funlard\u0131r:<\/p>\n<pre><code class=\"language-bash\">\n      # EC2 \u00f6rneklerini listele\n      aws ec2 describe-instances\n\n      # S3 bucket'lar\u0131n\u0131 listele\n      aws s3 ls\n\n      # Bir S3 bucket'\u0131na dosya y\u00fckle\n      aws s3 cp my-local-file.txt s3:\/\/my-unique-bucket\/remote-file.txt\n    <\/pre>\n<p><\/code><\/p>\n<p>CLI, CDK'n\u0131n da\u011f\u0131t\u0131m\u0131 ve y\u00f6netimi i\u00e7in de temel bir bile\u015fendir. CDK, arka planda CLI'\u0131 kullanarak AWS API \u00e7a\u011fr\u0131lar\u0131n\u0131 yapar. Bu iki ara\u00e7, bulut altyap\u0131n\u0131z\u0131 daha verimli ve otomatik hale getirmeniz i\u00e7in birbirini tamamlayan bir ikili olu\u015fturur.<\/p>\n<h3>\u00c7ok Katmanl\u0131 (N-Tier) Mimari Nedir ve Bile\u015fenleri Nelerdir?<\/h3>\n<p>\u00c7ok katmanl\u0131 mimari, bir uygulaman\u0131n farkl\u0131 i\u015flevsel sorumluluklar\u0131n\u0131 (sunum, i\u015f mant\u0131\u011f\u0131, veri depolama) ayr\u0131, mant\u0131ksal olarak izole edilmi\u015f katmanlara ay\u0131rma prensibine dayan\u0131r. Bu yakla\u015f\u0131m, her katman\u0131n ba\u011f\u0131ms\u0131z olarak \u00f6l\u00e7eklenmesini, geli\u015ftirilmesini ve g\u00fcvenli\u011finin sa\u011flanmas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r. Tipik bir \u00e7ok katmanl\u0131 web altyap\u0131s\u0131 \u015fu bile\u015fenleri i\u00e7erir:<\/p>\n<ul>\n<li><strong>Sunum Katman\u0131 (Web\/Frontend):<\/strong> Kullan\u0131c\u0131lar\u0131n do\u011frudan etkile\u015fimde bulundu\u011fu aray\u00fczd\u00fcr. Statik dosyalar (HTML, CSS, JavaScript) genellikle S3'te bar\u0131nd\u0131r\u0131l\u0131r ve <a href=\"#_CloudFront_CDN\">CloudFront CDN<\/a> \u00fczerinden sunularak d\u00fc\u015f\u00fck gecikme sa\u011flan\u0131r. Dinamik i\u00e7erikler i\u00e7in Application Load Balancer (ALB) ve arkas\u0131ndaki web sunucular\u0131 (EC2 veya Fargate) kullan\u0131l\u0131r.<\/li>\n<li><strong>Uygulama Katman\u0131 (Backend\/Logic):<\/strong> \u0130\u015f mant\u0131\u011f\u0131n\u0131n y\u00fcr\u00fct\u00fcld\u00fc\u011f\u00fc yerdir. Kullan\u0131c\u0131 isteklerini i\u015fler, veritaban\u0131 ile ileti\u015fim kurar ve sunum katman\u0131na yan\u0131tlar\u0131 d\u00f6nd\u00fcr\u00fcr. Genellikle EC2 instances veya Fargate \u00fczerinde \u00e7al\u0131\u015fan konteynerize uygulamalardan olu\u015fur. Otomatik \u00f6l\u00e7eklendirme gruplar\u0131 ile talep art\u0131\u015flar\u0131na yan\u0131t verebilir.<\/li>\n<li><strong>Veri Katman\u0131 (Database):<\/strong> Uygulaman\u0131n verilerini depolad\u0131\u011f\u0131 ve y\u00f6netti\u011fi katmand\u0131r. \u0130li\u015fkisel veritabanlar\u0131 (RDS - MySQL, PostgreSQL vb.) veya NoSQL veritabanlar\u0131 (DynamoDB) bu katmanda yer al\u0131r. Y\u00fcksek eri\u015filebilirlik ve veri g\u00fcvenli\u011fi burada kritik \u00f6neme sahiptir.<\/li>\n<li><strong>A\u011f Katman\u0131 (Network):<\/strong> T\u00fcm bu katmanlar\u0131n birbiriyle ve d\u0131\u015f d\u00fcnya ile g\u00fcvenli bir \u015fekilde ileti\u015fim kurmas\u0131n\u0131 sa\u011flar. <a href=\"#_VPC\">Amazon VPC (Virtual Private Cloud)<\/a>, alt a\u011flar (subnet'ler), rota tablolar\u0131, Internet Gateway ve NAT Gateway gibi bile\u015fenleri i\u00e7erir. G\u00fcvenlik Gruplar\u0131 (Security Groups) ve A\u011f Eri\u015fim Kontrol Listeleri (NACL'ler) bu katmanda trafik filtrelemesi yaparak g\u00fcvenli\u011fi art\u0131r\u0131r.<\/li>\n<li><strong>G\u00fcvenlik Katman\u0131:<\/strong> IAM (Identity and Access Management) ile yetkilendirme, AWS WAF (Web Application Firewall) ile web uygulamas\u0131 korumas\u0131, Secrets Manager ile hassas verilerin y\u00f6netimi gibi mekanizmalar\u0131 kapsar.<\/li>\n<\/ul>\n<p>Vaka Analizi: E-ticaret sitemiz i\u00e7in bu katmanlar\u0131 hayal edelim. M\u00fc\u015fterilerimiz CloudFront \u00fczerinden h\u0131zl\u0131ca \u00fcr\u00fcn sayfalar\u0131na eri\u015firken (Sunum Katman\u0131), \u00fcr\u00fcn arama, sepete ekleme gibi i\u015flemler Fargate \u00fczerinde \u00e7al\u0131\u015fan mikroservislerimiz taraf\u0131ndan (Uygulama Katman\u0131) i\u015flenir. \u00dcr\u00fcn bilgileri, m\u00fc\u015fteri sipari\u015fleri ve hesap bilgileri ise RDS PostgreSQL veritaban\u0131nda (Veri Katman\u0131) saklan\u0131r. T\u00fcm bu ileti\u015fim, g\u00fcvenli bir VPC i\u00e7inde (A\u011f Katman\u0131) ger\u00e7ekle\u015fir. Bu katmanl\u0131 yap\u0131, her bir bile\u015fenin kendi sorumlulu\u011funu yerine getirmesini ve b\u00f6ylece sistemin bir b\u00fct\u00fcn olarak daha sa\u011flam ve y\u00f6netilebilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h2>Ad\u0131m Ad\u0131m \u0130n\u015fa: Temel A\u011f Altyap\u0131s\u0131n\u0131 (VPC) CDK ile Olu\u015fturmak<\/h2>\n<p>Bir web altyap\u0131s\u0131n\u0131n temeli, g\u00fcvenli ve iyi yap\u0131land\u0131r\u0131lm\u0131\u015f bir a\u011f ortam\u0131d\u0131r. AWS'te bu, Amazon Virtual Private Cloud (VPC) ile sa\u011flan\u0131r. VPC, AWS bulutu i\u00e7inde size \u00f6zel, mant\u0131ksal olarak izole edilmi\u015f bir sanal a\u011f olu\u015fturman\u0131za olanak tan\u0131r. \u0130\u00e7ine koydu\u011funuz sanal sunucular (EC2 instances), veritabanlar\u0131 (RDS instances) ve di\u011fer AWS kaynaklar\u0131 bu \u00f6zel a\u011fda \u00e7al\u0131\u015f\u0131r ve siz, a\u011f yap\u0131land\u0131rmas\u0131 \u00fczerinde tam kontrole sahip olursunuz.<\/p>\n<h3>G\u00fcvenli ve \u0130zole Bir A\u011f Ortam\u0131 Nas\u0131l Tasarlan\u0131r?<\/h3>\n<p>\u00dcretim seviyesi bir VPC tasarlarken, g\u00fcvenlik ve eri\u015filebilirlik en \u00fcst \u00f6nceliklerdir. Tipik bir senaryoda, VPC'nizi birden fazla kullan\u0131labilirlik b\u00f6lgesine (Availability Zone - AZ) yayarak y\u00fcksek eri\u015filebilirlik sa\u011flars\u0131n\u0131z. Her AZ i\u00e7inde ise, kaynaklar\u0131n eri\u015fim ihtiya\u00e7lar\u0131na g\u00f6re public ve private subnet'ler olu\u015fturursunuz.<\/p>\n<ul>\n<li><strong>Public Subnet'ler:<\/strong> \u0130nternet'ten do\u011frudan eri\u015filebilir olmas\u0131 gereken kaynaklar (\u00f6rne\u011fin, Application Load Balancer veya genel IP adresi atanan web sunucular\u0131) burada yer al\u0131r. Bir Internet Gateway (IGW) arac\u0131l\u0131\u011f\u0131yla d\u0131\u015f d\u00fcnya ile ileti\u015fim kurarlar.<\/li>\n<li><strong>Private Subnet'ler:<\/strong> \u0130nternet'ten do\u011frudan eri\u015fimin istenmedi\u011fi, daha hassas kaynaklar (\u00f6rne\u011fin, uygulama sunucular\u0131, veritabanlar\u0131) burada bulunur. Bu subnet'lerdeki kaynaklar, d\u0131\u015f d\u00fcnyaya eri\u015fmek istediklerinde genellikle bir NAT Gateway \u00fczerinden trafiklerini y\u00f6nlendirirler. Bu sayede, d\u0131\u015far\u0131dan eri\u015filemezler ancak g\u00fcncellemeleri veya d\u0131\u015f API'lar\u0131 \u00e7a\u011f\u0131rabilirler.<\/li>\n<\/ul>\n<p>Her bir subnet'in kendi rota tablolar\u0131 (Route Tables) bulunur ve bu tablolar, trafi\u011fin nas\u0131l y\u00f6nlendirilece\u011fini belirler. \u00d6rne\u011fin, public subnet'in rota tablosu trafi\u011fi IGW'ye y\u00f6nlendirirken, private subnet'in rota tablosu trafi\u011fi NAT Gateway'e y\u00f6nlendirir.<\/p>\n<div class=\"interactive-tip\">\n      Uzman \u0130pucu: Birden fazla AZ'de \u00e7al\u0131\u015fmak, tek bir AZ'deki ar\u0131zalar\u0131n uygulaman\u0131z\u0131 etkilemesini \u00f6nler. Ayr\u0131ca, IP aral\u0131klar\u0131n\u0131z\u0131 (CIDR bloklar\u0131) dikkatlice planlamak, gelecekteki geni\u015flemeler ve VPC'ler aras\u0131 ba\u011flant\u0131lar i\u00e7in esneklik sa\u011flar.\n    <\/div>\n<p>\u015eimdi, bu karma\u015f\u0131k yap\u0131y\u0131 CDK ile nas\u0131l olu\u015fturaca\u011f\u0131m\u0131za bakal\u0131m. Python dilini kullanarak, basit ama \u00fcretim seviyesine uygun bir VPC olu\u015fturan bir CDK kodu \u00f6rne\u011fi:<\/p>\n<pre><code class=\"language-python\">\n      import aws_cdk as cdk\n      from aws_cdk import aws_ec2 as ec2\n      from constructs import Construct\n\n      class MyVpcStack(cdk.Stack):\n\n          def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:\n              super().__init__(scope, construct_id, **kwargs)\n\n              # \u00dcretim seviyesi bir VPC olu\u015fturma\n              self.vpc = ec2.Vpc(self, \"ProdVPC\",\n                  ip_addresses=ec2.IpAddresses.cidr(\"10.0.0.0\/16\"), # Kendi IP aral\u0131\u011f\u0131n\u0131z\u0131 belirleyin\n                  max_azs=3, # Y\u00fcksek eri\u015filebilirlik i\u00e7in 3 farkl\u0131 Kullan\u0131labilirlik B\u00f6lgesi kullan\n                  nat_gateways=1, # Her AZ'de NAT Gateway yerine tek bir AZ'de 1 NAT Gateway\n                  subnet_configuration=[\n                      ec2.SubnetConfiguration(\n                          name=\"Public\",\n                          subnet_type=ec2.SubnetType.PUBLIC,\n                          cidr_mask=24 # \u00d6rnek: 10.0.0.0\/24, 10.0.1.0\/24 vb.\n                      ),\n                      ec2.SubnetConfiguration(\n                          name=\"Private\",\n                          subnet_type=ec2.SubnetType.PRIVATE_WITH_EGRESS, # NAT Gateway \u00fczerinden \u00e7\u0131k\u0131\u015f yapabilen private subnet\n                          cidr_mask=24\n                      ),\n                      ec2.SubnetConfiguration(\n                          name=\"Isolated\", # Veritabanlar\u0131 i\u00e7in tamamen izole subnet\n                          subnet_type=ec2.SubnetType.PRIVATE_ISOLATED,\n                          cidr_mask=24\n                      )\n                  ]\n              )\n\n              cdk.CfnOutput(self, \"VPCId\",\n                            value=self.vpc.vpc_id,\n                            description=\"The ID of the VPC\")\n              cdk.CfnOutput(self, \"PublicSubnets\",\n                            value=str([s.subnet_id for s in self.vpc.public_subnets]),\n                            description=\"Public Subnet IDs\")\n              cdk.CfnOutput(self, \"PrivateSubnets\",\n                            value=str([s.subnet_id for s in self.vpc.private_subnets]),\n                            description=\"Private Subnet IDs\")\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kod blo\u011fu, AWS \u00fczerinde <code>ProdVPC<\/code> ad\u0131nda bir VPC olu\u015fturur. Bu VPC:<\/p>\n<ul>\n<li><code>10.0.0.0\/16<\/code> CIDR blo\u011funu kullan\u0131r.<\/li>\n<li>\u00dc\u00e7 farkl\u0131 Kullan\u0131labilirlik B\u00f6lgesine yay\u0131l\u0131r (<code>max_azs=3<\/code>), bu da y\u00fcksek eri\u015filebilirli\u011fi art\u0131r\u0131r.<\/li>\n<li>T\u00fcm private subnet'lerin internete \u00e7\u0131k\u0131\u015f yapabilmesi i\u00e7in bir tane NAT Gateway kurar (<code>nat_gateways=1<\/code>). Daha y\u00fcksek eri\u015filebilirlik i\u00e7in her AZ'ye birer NAT Gateway de kurabilirsiniz, ancak bu maliyeti art\u0131r\u0131r.<\/li>\n<li>Her AZ'de birer adet Public, Private (NAT Gateway \u00fczerinden \u00e7\u0131kabilen) ve Isolated (tamamen izole, veritabanlar\u0131 i\u00e7in ideal) subnet olu\u015fturur.<\/li>\n<\/ul>\n<p>Bu yap\u0131land\u0131rma, uygulaman\u0131z\u0131n farkl\u0131 bile\u015fenlerini uygun g\u00fcvenlik ve eri\u015fim seviyeleriyle konumland\u0131rmak i\u00e7in sa\u011flam bir temel sa\u011flar. \u00d6rne\u011fin, web sunucular\u0131n\u0131z\u0131n ALB taraf\u0131ndan eri\u015filebilen public subnet'lerde, uygulama sunucular\u0131n\u0131z\u0131n NAT Gateway \u00fczerinden \u00e7\u0131k\u0131\u015f yapabilen private subnet'lerde ve veritabanlar\u0131n\u0131z\u0131n ise tamamen izole edilmi\u015f private subnet'lerde yer almas\u0131n\u0131 sa\u011flayabilirsiniz. Mobil uyumlu uygulamalar veya IoT cihazlar\u0131 gibi farkl\u0131 client t\u00fcrleri i\u00e7in, bu katmanl\u0131 a\u011f yap\u0131s\u0131, trafi\u011fin en verimli ve g\u00fcvenli yollarla y\u00f6nlendirilmesini m\u00fcmk\u00fcn k\u0131lar. \u00d6rne\u011fin, mobil uygulaman\u0131zdaki bir API \u00e7a\u011fr\u0131s\u0131, ALB ve uygulama katman\u0131na ula\u015fmadan \u00f6nce CloudFront \u00fczerinden \u00f6nbelle\u011fe al\u0131nabilir, bu da gecikmeyi \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r.<\/p>\n<p>Bu temel a\u011f altyap\u0131s\u0131 kurulduktan sonra, s\u0131ra uygulama ve veri katmanlar\u0131m\u0131z\u0131 bu g\u00fcvenli ortama yerle\u015ftirmeye gelecek.<\/p>\n<h2>Uygulama ve Veri Katmanlar\u0131n\u0131 Olu\u015fturmak: EC2, Fargate ve RDS ile \u00d6l\u00e7eklenebilirlik<\/h2>\n<p>G\u00fcvenli bir a\u011f ortam\u0131 olu\u015fturduktan sonra, web uygulaman\u0131z\u0131n kalbi olan uygulama ve veri katmanlar\u0131n\u0131 in\u015fa etmeye ge\u00e7ebiliriz. Bu katmanlar, uygulaman\u0131z\u0131n i\u015f mant\u0131\u011f\u0131n\u0131 y\u00fcr\u00fct\u00fcr ve t\u00fcm verileri depolar. AWS, bu g\u00f6revler i\u00e7in EC2, ECS Fargate ve RDS gibi g\u00fc\u00e7l\u00fc ve \u00f6l\u00e7eklenebilir hizmetler sunar.<\/p>\n<h3>Web Sunucular\u0131n\u0131 ve Uygulama Konteynerlerini Nas\u0131l Konumland\u0131r\u0131r\u0131z?<\/h3>\n<p>Uygulama katman\u0131n\u0131z i\u00e7in iki ana se\u00e7enek \u00f6ne \u00e7\u0131kar: Amazon EC2 (Elastic Compute Cloud) veya Amazon ECS (Elastic Container Service) Fargate ile konteynerize uygulamalar. Se\u00e7iminiz, projenizin gereksinimlerine ve operasyonel tercihinize ba\u011fl\u0131d\u0131r.<\/p>\n<ul>\n<li><strong>Amazon EC2:<\/strong> Sanal sunucular \u00fczerinde tam kontrol isteyenler i\u00e7in idealdir. Sunucu i\u015fletim sistemini, \u00e7al\u0131\u015fma zamanlar\u0131n\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131 kendiniz y\u00f6netirsiniz. Otomatik \u00d6l\u00e7eklendirme Gruplar\u0131 (Auto Scaling Groups - ASG) ile EC2 instance'lar\u0131n\u0131z\u0131 talebe g\u00f6re otomatik olarak art\u0131r\u0131p azaltabilirsiniz.<\/li>\n<li><strong>Amazon ECS Fargate:<\/strong> E\u011fer konteynerize uygulamalar kullan\u0131yorsan\u0131z (Docker gibi), Fargate \"serverless containers\" deneyimi sunar. EC2'deki gibi sunucular\u0131 y\u00f6netmek zorunda kalmazs\u0131n\u0131z; AWS, temel altyap\u0131y\u0131 sizin i\u00e7in y\u00f6netir. Bu, operasyonel y\u00fck\u00fc \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r ve geli\u015ftiricilerin sadece uygulamalar\u0131na odaklanmas\u0131n\u0131 sa\u011flar. \u00dcretim seviyesi modern uygulamalar i\u00e7in genellikle Fargate tercih edilir.<\/li>\n<\/ul>\n<p>Hangi se\u00e7ene\u011fi tercih ederseniz edin, trafi\u011fi bu sunuculara y\u00f6nlendirmek ve yatay \u00f6l\u00e7eklemeyi sa\u011flamak i\u00e7in bir Application Load Balancer (ALB) kullanmak \u015fartt\u0131r. ALB, gelen trafi\u011fi arka u\u00e7taki sa\u011fl\u0131kl\u0131 hedefler (EC2 instance'lar\u0131 veya Fargate g\u00f6revleri) aras\u0131nda da\u011f\u0131t\u0131r ve uygulama katman\u0131n\u0131z\u0131n y\u00fcksek eri\u015filebilirli\u011fini sa\u011flar.<\/p>\n<p>A\u015fa\u011f\u0131da, CDK ile bir Fargate servisi ve ALB olu\u015fturan bir kod \u00f6rne\u011fi bulunmaktad\u0131r. Bu yap\u0131land\u0131rma, sunucusuz konteyner teknolojisinin avantajlar\u0131ndan yararlanarak y\u00fcksek \u00f6l\u00e7eklenebilirlik ve d\u00fc\u015f\u00fck operasyonel y\u00fck sunar:<\/p>\n<pre><code class=\"language-python\">\n      import aws_cdk as cdk\n      from aws_cdk import aws_ec2 as ec2\n      from aws_cdk import aws_ecs as ecs\n      from aws_cdk import aws_ecs_patterns as ecs_patterns\n      from constructs import Construct\n\n      class MyWebAppStack(cdk.Stack):\n\n          def __init__(self, scope: Construct, construct_id: str, vpc: ec2.Vpc, **kwargs) -> None:\n              super().__init__(scope, construct_id, **kwargs)\n\n              # ECS Cluster olu\u015ftur\n              cluster = ecs.Cluster(self, \"MyCluster\", vpc=vpc)\n\n              # Uygulama kodumuzun bulundu\u011fu Docker imaj\u0131n\u0131 tan\u0131mlayal\u0131m.\n              # Ger\u00e7ek senaryoda, bu imaj AWS ECR'de (Elastic Container Registry) saklan\u0131r.\n              # \u00d6rnek olmas\u0131 i\u00e7in basit bir nginx imaj\u0131 kullan\u0131yoruz.\n              # Kendi uygulaman\u0131z i\u00e7in 'my-app:latest' gibi bir imaj belirtebilirsiniz.\n              image_name = \"nginx:latest\" # Veya ecs.ContainerImage.from_registry(\"ACCOUNT_ID.dkr.ecr.REGION.amazonaws.com\/my-app:latest\")\n\n              # Fargate servisi ile bir ALB ve konteynerize uygulama da\u011f\u0131t\n              ecs_patterns.ApplicationLoadBalancedFargateService(self, \"MyFargateService\",\n                  cluster=cluster,\n                  cpu=256, # Minimum CPU birimi\n                  memory_limit_mib=512, # Minimum bellek birimi\n                  desired_count=2, # Ba\u015flang\u0131\u00e7ta 2 adet g\u00f6rev \u00e7al\u0131\u015ft\u0131r\n                  public_load_balancer=True, # Public Load Balancer kullan\n                  task_image_options=ecs_patterns.ApplicationLoadBalancedTaskImageOptions(\n                      image=ecs.ContainerImage.from_registry(image_name),\n                      container_port=80, # Uygulaman\u0131z\u0131n dinledi\u011fi port\n                      log_driver=ecs.LogDriver.aws_logs( # CloudWatch Logs ile loglama\n                          stream_prefix=\"my-fargate-app-logs\"\n                      )\n                  )\n              )\n\n              cdk.CfnOutput(self, \"LoadBalancerDNS\",\n                            value=f\"http:\/\/{ecs_patterns.ApplicationLoadBalancedFargateService.from_service_attributes(self, 'LB', service_name='MyFargateService', cluster=cluster).load_balancer.load_balancer_dns_name}\",\n                            description=\"The DNS name of the Load Balancer\")\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu kod par\u00e7ac\u0131\u011f\u0131, daha \u00f6nce olu\u015fturdu\u011fumuz VPC i\u00e7inde bir ECS k\u00fcmesi tan\u0131mlar. Ard\u0131ndan, bir Application Load Balancer (ALB) ile entegre edilmi\u015f bir Fargate servisi olu\u015fturur. Bu servis, Nginx imaj\u0131n\u0131 kullanarak (siz kendi uygulama imaj\u0131n\u0131zla de\u011fi\u015ftirebilirsiniz) iki adet konteyner g\u00f6revi \u00e7al\u0131\u015ft\u0131r\u0131r ve bunlar\u0131 ALB'nin arkas\u0131na yerle\u015ftirir. <code>desired_count<\/code> parametresi ile ba\u015flang\u0131\u00e7 g\u00f6rev say\u0131s\u0131n\u0131 belirleyebilir, sonras\u0131nda otomatik \u00f6l\u00e7eklendirme kurallar\u0131 ekleyerek trafi\u011fe g\u00f6re dinamik \u00f6l\u00e7eklenmesini sa\u011flayabilirsiniz.<\/p>\n<h3>G\u00fcvenilir ve Y\u00fcksek Performansl\u0131 Veritaban\u0131 Nas\u0131l Sa\u011flan\u0131r?<\/h3>\n<p>Veri katman\u0131, web uygulaman\u0131z\u0131n en kritik bile\u015fenlerinden biridir. Amazon RDS (Relational Database Service), y\u00f6netilen bir veritaban\u0131 hizmeti sunarak operasyonel y\u00fck\u00fc sizin \u00fczerinizden al\u0131r. Yedeklemeler, yamalar, donan\u0131m temini ve replikasyon gibi g\u00f6revleri AWS sizin i\u00e7in y\u00f6netir. RDS, MySQL, PostgreSQL, Oracle, SQL Server ve MariaDB gibi pop\u00fcler veritaban\u0131 motorlar\u0131n\u0131 destekler.<\/p>\n<p>\u00dcretim ortam\u0131nda veritaban\u0131n\u0131z\u0131n y\u00fcksek eri\u015filebilirli\u011fini sa\u011flamak i\u00e7in Multi-AZ (\u00c7oklu Kullan\u0131labilirlik B\u00f6lgesi) da\u011f\u0131t\u0131m\u0131n\u0131 mutlaka kullanmal\u0131s\u0131n\u0131z. Bu sayede, birincil veritaban\u0131 \u00f6rne\u011finiz farkl\u0131 bir AZ'deki e\u015fzamanl\u0131 bir bekleme replikas\u0131na otomatik olarak \u00e7o\u011falt\u0131l\u0131r. Birincil \u00f6rnekte bir ar\u0131za olmas\u0131 durumunda, RDS otomatik olarak bekleme replikas\u0131na ge\u00e7i\u015f yapar ve kesinti s\u00fcresini minimize eder.<\/p>\n<p>A\u015fa\u011f\u0131da, CDK ile Multi-AZ PostgreSQL RDS veritaban\u0131 \u00f6rne\u011fi olu\u015fturan bir kod blo\u011fu yer almaktad\u0131r:<\/p>\n<pre><code class=\"language-python\">\n      import aws_cdk as cdk\n      from aws_cdk import aws_ec2 as ec2\n      from aws_cdk import aws_rds as rds\n      from constructs import Construct\n\n      class MyDatabaseStack(cdk.Stack):\n\n          def __init__(self, scope: Construct, construct_id: str, vpc: ec2.Vpc, **kwargs) -> None:\n              super().__init__(scope, construct_id, **kwargs)\n\n              # Veritaban\u0131 g\u00fcvenlik grubu tan\u0131mla: Sadece uygulama sunucular\u0131ndan eri\u015fime izin ver\n              db_security_group = ec2.SecurityGroup(self, \"DBSecurityGroup\",\n                  vpc=vpc,\n                  description=\"Allow access to RDS from Fargate tasks\",\n                  allow_all_outbound=True # D\u0131\u015far\u0131ya \u00e7\u0131k\u0131\u015fa izin ver\n              )\n\n              # Uygulama katman\u0131n\u0131n g\u00fcvenlik grubundan veritaban\u0131na eri\u015fime izin ver\n              # Ger\u00e7ek uygulamada, Fargate servisinizin g\u00fcvenlik grubunu buraya eklemelisiniz.\n              # \u00d6rnek olmas\u0131 i\u00e7in kendi IP'nizden veya bir Security Group ID'sinden eri\u015fime izin verebiliriz.\n              # db_security_group.add_ingress_rule(\n              #     peer=ec2.Peer.ipv4(\"YOUR_APP_SUBNET_CIDR_HERE\"), # Uygulama subnet CIDR'\u0131n\u0131z\n              #     connection=ec2.Port.tcp(5432), # PostgreSQL varsay\u0131lan portu\n              #     description=\"Allow PostgreSQL access from application layer\"\n              # )\n\n              # Fargate servisinin \u00e7al\u0131\u015faca\u011f\u0131 private subnet'ler\n              # Bu subnet'ler daha \u00f6nce VPC tan\u0131m\u0131nda 'PRIVATE_WITH_EGRESS' olarak olu\u015fturulmu\u015ftu.\n              private_subnets_selection = vpc.select_subnets(\n                  subnet_type=ec2.SubnetType.PRIVATE_WITH_EGRESS\n              )\n\n              # Veritaban\u0131 subnet grubunu olu\u015ftur (izole subnetleri kullanmak idealdir)\n              # Isolated subnet'leri kullanmak veritaban\u0131 g\u00fcvenli\u011fi i\u00e7in daha uygundur.\n              isolated_subnets_selection = vpc.select_subnets(\n                  subnet_type=ec2.SubnetType.PRIVATE_ISOLATED\n              )\n\n              # PostgreSQL RDS veritaban\u0131 \u00f6rne\u011fi olu\u015fturma\n              database = rds.DatabaseInstance(self, \"MyPostgresDB\",\n                  engine=rds.DatabaseEngine.postgres(version=rds.PostgresEngineVersion.VER_14),\n                  instance_type=ec2.t3.Micro.to_string(), # \u00dcretim i\u00e7in daha b\u00fcy\u00fck bir instance tipi se\u00e7in\n                  vpc=vpc,\n                  multi_az=True, # Y\u00fcksek eri\u015filebilirlik i\u00e7in Multi-AZ da\u011f\u0131t\u0131m\u0131\n                  allocated_storage=20, # GB cinsinden depolama alan\u0131\n                  database_name=\"mydb\",\n                  credentials=rds.Credentials.from_generated_secret(\"dbadmin\"), # Y\u00f6netilen bir parola olu\u015fturur\n                  vpc_subnets=isolated_subnets_selection, # Veritaban\u0131n\u0131 izole subnet'lere yerle\u015ftir\n                  security_groups=[db_security_group],\n                  removal_policy=cdk.RemovalPolicy.RETAIN, # Stack silindi\u011finde veritaban\u0131n\u0131 koru (\u00fcretim i\u00e7in \u00f6nemli)\n                  parameter_group=rds.ParameterGroup.from_parameter_group_name(\n                      self, \"PostgresParamGroup\", \"default.postgres14\"\n                  )\n              )\n\n              # Veritaban\u0131 ba\u011flant\u0131 bilgilerini \u00e7\u0131kt\u0131 olarak g\u00f6ster (D\u0130KKAT: \u00dcretimde hassas bilgileri \u00e7\u0131kt\u0131 g\u00f6stermeyin!)\n              cdk.CfnOutput(self, \"DBEndpoint\",\n                            value=database.db_instance_endpoint_address,\n                            description=\"RDS Database Endpoint Address\")\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu CDK kodu, <code>mydb<\/code> ad\u0131nda bir PostgreSQL veritaban\u0131 olu\u015fturur. <code>multi_az=True<\/code> ile y\u00fcksek eri\u015filebilirlik sa\u011flan\u0131rken, <code>vpc_subnets=isolated_subnets_selection<\/code> ile veritaban\u0131n\u0131n en g\u00fcvenli olan izole subnet'lerde \u00e7al\u0131\u015fmas\u0131 garanti alt\u0131na al\u0131n\u0131r. <code>removal_policy=cdk.RemovalPolicy.RETAIN<\/code> ise, e\u011fer bir hata olur ve bu CDK stack'ini silmek zorunda kal\u0131rsan\u0131z, veritaban\u0131n\u0131n silinmeyip korunmas\u0131n\u0131 sa\u011flar; bu, \u00fcretim ortamlar\u0131 i\u00e7in hayati bir g\u00fcvenlik \u00f6nlemidir. Veritaban\u0131na eri\u015fim, tan\u0131mlad\u0131\u011f\u0131m\u0131z <code>DBSecurityGroup<\/code> ile kontrol edilir, b\u00f6ylece yaln\u0131zca yetkili uygulama sunucular\u0131n\u0131n veritaban\u0131na ba\u011flanmas\u0131na izin verilir.<\/p>\n<p>Vaka Analizi: E-ticaret sitemiz i\u00e7in bu katmanlar, \u00fcr\u00fcn envanterini, m\u00fc\u015fteri sipari\u015flerini ve kullan\u0131c\u0131 profil bilgilerini depolayan PostgreSQL veritaban\u0131m\u0131z\u0131 (RDS) ve sipari\u015f i\u015fleme, envanter y\u00f6netimi, kullan\u0131c\u0131 kimlik do\u011frulamas\u0131 gibi i\u015f mant\u0131\u011f\u0131n\u0131 y\u00fcr\u00fcten Fargate servislerimizi bar\u0131nd\u0131racakt\u0131r. ALB, gelen t\u00fcm API isteklerini Fargate g\u00f6revlerine y\u00f6nlendirerek uygulaman\u0131n talebe g\u00f6re otomatik \u00f6l\u00e7eklenmesini sa\u011flar. Bu sayede, Black Friday gibi y\u00fcksek trafikli d\u00f6nemlerde bile sistem kesintisiz ve performansl\u0131 bir \u015fekilde \u00e7al\u0131\u015fmaya devam edecektir.<\/p>\n<h2>\u00d6n U\u00e7 ve \u0130\u00e7erik Da\u011f\u0131t\u0131m\u0131: S3, CloudFront ve Route 53 ile Performans ve G\u00fcvenlik<\/h2>\n<p>Uygulaman\u0131z\u0131n arka ucu ve veritaban\u0131 sa\u011flam bir \u015fekilde kurulduktan sonra, kullan\u0131c\u0131lar\u0131n do\u011frudan etkile\u015fim kuraca\u011f\u0131 \u00f6n u\u00e7 (frontend) k\u0131sm\u0131n\u0131 ve statik i\u00e7erik da\u011f\u0131t\u0131m\u0131n\u0131 ele alman\u0131n zaman\u0131 geldi. Bu a\u015famada, performans, g\u00fcvenlik ve k\u00fcresel eri\u015filebilirlik kritik \u00f6neme sahiptir. AWS S3, CloudFront ve Route 53, bu hedeflere ula\u015fmak i\u00e7in m\u00fckemmel bir \u00fc\u00e7l\u00fc olu\u015fturur.<\/p>\n<h3>Statik Web \u0130\u00e7eriklerini Global Olarak Nas\u0131l Da\u011f\u0131t\u0131r\u0131z?<\/h3>\n<p>Modern web uygulamalar\u0131n\u0131n \u00e7o\u011fu, HTML, CSS, JavaScript dosyalar\u0131, resimler ve videolar gibi statik varl\u0131klar\u0131 i\u00e7erir. Bu t\u00fcr i\u00e7erikleri do\u011frudan uygulama sunucular\u0131ndan sunmak, sunucu kaynaklar\u0131n\u0131 gereksiz yere me\u015fgul eder ve performans\u0131 d\u00fc\u015f\u00fcrebilir. Bunun yerine, AWS'in \u00f6zel olarak tasarlanm\u0131\u015f hizmetlerini kullanmak \u00e7ok daha verimlidir.<\/p>\n<ul>\n<li><strong>Amazon S3 (Simple Storage Service):<\/strong> Y\u00fcksek \u00f6l\u00e7eklenebilir, g\u00fcvenilir, h\u0131zl\u0131 ve maliyet-etkin bir nesne depolama hizmetidir. Statik web sitelerini bar\u0131nd\u0131rmak i\u00e7in idealdir. S3'e y\u00fckledi\u011finiz dosyalar, milyonlarca kullan\u0131c\u0131ya e\u015f zamanl\u0131 olarak sunulabilir.<\/li>\n<li><strong>Amazon CloudFront:<\/strong> AWS'in k\u00fcresel \u0130\u00e7erik Da\u011f\u0131t\u0131m A\u011f\u0131 (CDN) hizmetidir. Statik ve dinamik web i\u00e7eriklerinizi d\u00fcnya \u00e7ap\u0131ndaki \"edge location\" ad\u0131 verilen co\u011frafi noktalarda \u00f6nbelle\u011fe alarak, son kullan\u0131c\u0131lara en yak\u0131n noktadan da\u011f\u0131t\u0131m\u0131n\u0131 sa\u011flar. Bu sayede, gecikme s\u00fcresi (latency) \u00f6nemli \u00f6l\u00e7\u00fcde azal\u0131r ve kullan\u0131c\u0131 deneyimi iyile\u015fir. CloudFront ayr\u0131ca DDoS korumas\u0131 ve SSL\/TLS \u015fifrelemesi gibi g\u00fcvenlik avantajlar\u0131 da sunar.<\/li>\n<li><strong>Amazon Route 53:<\/strong> AWS'in y\u00fcksek eri\u015filebilir ve \u00f6l\u00e7eklenebilir Bulut DNS (Domain Name System) web servisidir. Uygulaman\u0131za \u00f6zel bir alan ad\u0131 (\u00f6rne\u011fin, <code>www.ornek.com<\/code>) ataman\u0131z\u0131 ve bu alan ad\u0131n\u0131 CloudFront da\u011f\u0131t\u0131m\u0131n\u0131za veya Application Load Balancer'\u0131n\u0131za y\u00f6nlendirmenizi sa\u011flar.<\/li>\n<\/ul>\n<div class=\"interactive-tip\">\n      Uzman \u0130pucu: CloudFront'ta s\u0131k g\u00fcncellenen statik dosyalar i\u00e7in Cache Invalidation (\u00f6nbellek ge\u00e7ersiz k\u0131lma) \u00f6zelli\u011fini kullanarak, kullan\u0131c\u0131lar\u0131n her zaman en g\u00fcncel i\u00e7eri\u011fi g\u00f6rmesini sa\u011flayabilirsiniz. Ancak bunu s\u0131k s\u0131k yapmak maliyetli olabilir, bu nedenle s\u00fcr\u00fcmleme (versioning) stratejileri (\u00f6rne\u011fin, dosya adlar\u0131na hash eklemek) daha etkili bir y\u00f6ntemdir.\n    <\/div>\n<p>A\u015fa\u011f\u0131da, CDK ile bir S3 kovas\u0131, CloudFront da\u011f\u0131t\u0131m\u0131 ve Route 53 kayd\u0131 olu\u015fturan bir kod \u00f6rne\u011fi bulunmaktad\u0131r. Bu yap\u0131, statik \u00f6n u\u00e7 dosyalar\u0131n\u0131z\u0131 k\u00fcresel olarak y\u00fcksek performansla sunman\u0131z\u0131 sa\u011flar:<\/p>\n<pre><code class=\"language-python\">\n      import aws_cdk as cdk\n      from aws_cdk import aws_s3 as s3\n      from aws_cdk import aws_s3_deployment as s3_deployment\n      from aws_cdk import aws_cloudfront as cloudfront\n      from aws_cdk import aws_cloudfront_origins as origins\n      from aws_cdk import aws_route53 as route53\n      from aws_cdk import aws_route53_targets as targets\n      from aws_cdk import aws_certificatemanager as acm\n      from constructs import Construct\n\n      class FrontendStack(cdk.Stack):\n\n          def __init__(self, scope: Construct, construct_id: str, domain_name: str, zone: route53.IHostedZone, **kwargs) -> None:\n              super().__init__(scope, construct_id, **kwargs)\n\n              # 1. S3 Kovas\u0131 (Bucket) olu\u015ftur - Statik web sitesi bar\u0131nd\u0131rma i\u00e7in\n              website_bucket = s3.Bucket(self, \"WebsiteBucket\",\n                  removal_policy=cdk.RemovalPolicy.DESTROY, # Geli\u015ftirme i\u00e7in Destroy, \u00fcretim i\u00e7in RETAIN\n                  auto_delete_objects=True, # Stack silindi\u011finde objeleri sil\n                  public_read_access=False, # CloudFront ile eri\u015filece\u011fi i\u00e7in do\u011frudan public eri\u015fime gerek yok\n                  block_public_access=s3.BlockPublicAccess.BLOCK_ALL # G\u00fcvenlik i\u00e7in t\u00fcm public eri\u015fimi engelle\n              )\n\n              # 2. SSL Sertifikas\u0131 olu\u015ftur veya var olan\u0131 kullan\n              # Domaininizin Certificate Manager'da do\u011frulanmas\u0131 gerekmektedir.\n              certificate = acm.DnsValidatedCertificate(self, \"WebsiteCertificate\",\n                  domain_name=domain_name,\n                  hosted_zone=zone,\n                  region=\"us-east-1\" # CloudFront i\u00e7in sertifika us-east-1 b\u00f6lgesinde olmal\u0131d\u0131r\n              )\n\n              # 3. CloudFront da\u011f\u0131t\u0131m\u0131 olu\u015ftur\n              distribution = cloudfront.Distribution(self, \"WebsiteDistribution\",\n                  default_behavior=cloudfront.BehaviorOptions(\n                      origin=origins.S3Origin(website_bucket),\n                      viewer_protocol_policy=cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,\n                      cache_policy=cloudfront.CachePolicy.CACHING_OPTIMIZED # Optimum \u00f6nbellekleme\n                  ),\n                  default_root_object=\"index.html\", # Varsay\u0131lan giri\u015f sayfas\u0131\n                  domain_names=[domain_name], # \u00d6zel alan ad\u0131n\u0131z\u0131 ekleyin\n                  certificate=certificate\n              )\n\n              # 4. S3 Kovas\u0131na \u00f6rnek bir index.html da\u011f\u0131t\u0131m\u0131\n              s3_deployment.BucketDeployment(self, \"DeployWebsite\",\n                  sources=[s3_deployment.Source.asset(\".\/frontend-app\")], # frontend-app klas\u00f6r\u00fcn\u00fczdeki dosyalar\u0131 da\u011f\u0131t\u0131n\n                  destination_bucket=website_bucket,\n                  distribution=distribution,\n                  distribution_paths=[\"\/*\"] # \u00d6nbelle\u011fi temizle\n              )\n\n              # 5. Route 53 DNS kayd\u0131 olu\u015ftur - Alan ad\u0131n\u0131 CloudFront'a y\u00f6nlendir\n              route53.ARecord(self, \"AliasRecord\",\n                  zone=zone,\n                  target=route53.RecordTarget.from_alias(targets.CloudFrontTarget(distribution)),\n                  record_name=domain_name\n              )\n\n              cdk.CfnOutput(self, \"CloudFrontUrl\",\n                            value=f\"https:\/\/{distribution.domain_name}\",\n                            description=\"CloudFront Distribution URL\")\n              cdk.CfnOutput(self, \"WebsiteBucketName\",\n                            value=website_bucket.bucket_name,\n                            description=\"S3 Bucket Name\")\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu kod blo\u011fu, <code>WebsiteBucket<\/code> ad\u0131nda bir S3 kovas\u0131 olu\u015fturur ve statik dosyalar\u0131n\u0131z\u0131 buraya y\u00fcklemeniz i\u00e7in bir <code>s3_deployment.BucketDeployment<\/code> kayna\u011f\u0131 kullan\u0131r. Daha sonra, <code>WebsiteDistribution<\/code> ad\u0131nda bir CloudFront da\u011f\u0131t\u0131m\u0131 olu\u015fturulur. Bu da\u011f\u0131t\u0131m, S3 kovan\u0131z\u0131 bir kaynak olarak kullan\u0131r, HTTPS \u00fczerinden eri\u015fimi zorlar ve \u00f6zel alan ad\u0131n\u0131z\u0131 (<code>domain_name<\/code>) sertifika ile ili\u015fkilendirir. Son olarak, Route 53'teki bir A kayd\u0131, \u00f6zel alan ad\u0131n\u0131z\u0131 CloudFront da\u011f\u0131t\u0131m\u0131n\u0131za y\u00f6nlendirir. Bu sayede, kullan\u0131c\u0131lar <code>www.ornek.com<\/code> adresine girdiklerinde, en yak\u0131n CloudFront edge location'\u0131ndan h\u0131zl\u0131 ve g\u00fcvenli bir \u015fekilde statik i\u00e7eri\u011finize ula\u015fabilirler. Burada bahsedilen <code>frontend-app<\/code> klas\u00f6r\u00fcnde ise, \u00f6rne\u011fin React, Angular veya Vue.js ile geli\u015ftirilmi\u015f web uygulaman\u0131z\u0131n build edilmi\u015f \u00e7\u0131kt\u0131lar\u0131 yer almal\u0131d\u0131r. Ayr\u0131ca, CloudFront da\u011f\u0131t\u0131m\u0131na \u00f6zel alan ad\u0131 atamak i\u00e7in <code>us-east-1<\/code> b\u00f6lgesinde bir SSL sertifikas\u0131na ihtiyac\u0131n\u0131z oldu\u011funu unutmay\u0131n; CDK bunu otomatik olarak y\u00f6netecek \u015fekilde tasarlanm\u0131\u015ft\u0131r.<\/p>\n<h2>G\u00fcvenlik ve \u0130zleme: \u00dcretim Ortam\u0131n\u0131z\u0131 Nas\u0131l Korursunuz ve G\u00f6zlersiniz?<\/h2>\n<p>Bir web altyap\u0131s\u0131 kurmak \u00f6nemli olsa da, onu g\u00fcvende tutmak ve sorunsuz \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak da bir o kadar kritiktir. \u00dcretim ortamlar\u0131 s\u00fcrekli tehdit alt\u0131ndad\u0131r ve performans\u0131 yak\u0131ndan izlemek, olas\u0131 sorunlar\u0131 proaktif olarak ele alman\u0131n anahtar\u0131d\u0131r. AWS, g\u00fcvenlik ve izleme i\u00e7in geni\u015f bir hizmet yelpazesi sunar; biz de CDK arac\u0131l\u0131\u011f\u0131yla bu hizmetleri altyap\u0131m\u0131za entegre edece\u011fiz.<\/p>\n<h3>Entegre G\u00fcvenlik Mekanizmalar\u0131 Nas\u0131l Uygulan\u0131r?<\/h3>\n<p>Bulut g\u00fcvenli\u011fi, payla\u015f\u0131lan sorumluluk modeline dayan\u0131r: AWS, bulutun g\u00fcvenli\u011finden sorumluyken, siz buluttaki g\u00fcvenli\u011finizden sorumlusunuz. Bu nedenle, altyap\u0131n\u0131z\u0131n her katman\u0131nda g\u00fcvenlik \u00f6nlemlerini uygulamak \u00e7ok \u00f6nemlidir.<\/p>\n<ul>\n<li><strong>IAM Rolleri ve Politikalar\u0131:<\/strong> AWS kaynaklar\u0131na kimlerin ne t\u00fcr eri\u015fimi oldu\u011funu belirlemek i\u00e7in IAM (Identity and Access Management) kullan\u0131l\u0131r. \"En az yetki prensibi\"ni (Least Privilege Principle) benimseyin: Her kullan\u0131c\u0131ya veya servise, yaln\u0131zca g\u00f6revini yerine getirmesi i\u00e7in kesinlikle gerekli olan minimum yetkileri verin. \u00d6rne\u011fin, Fargate servisinizin sadece RDS veritaban\u0131na eri\u015fmesine izin veren bir IAM rol\u00fc atay\u0131n.<\/li>\n<li><strong>Security Groups ve NACL'ler:<\/strong> A\u011f katman\u0131nda trafik filtrelemesi i\u00e7in kullan\u0131l\u0131rlar.\n<ul>\n<li><strong>Security Groups (G\u00fcvenlik Gruplar\u0131):<\/strong> Kaynak d\u00fczeyinde (EC2 instance, RDS instance) \u00e7al\u0131\u015fan sanal g\u00fcvenlik duvarlar\u0131d\u0131r. Gelen (ingress) ve giden (egress) trafi\u011fi kontrol eder. Durum bilgisine sahiptirler (stateful), yani giden trafi\u011fe izin verdi\u011finizde, d\u00f6nen trafi\u011fe de otomatik olarak izin verilir.<\/li>\n<li><strong>NACL'ler (Network Access Control Lists):<\/strong> Alt a\u011f d\u00fczeyinde \u00e7al\u0131\u015fan durum bilgisi olmayan (stateless) g\u00fcvenlik duvarlar\u0131d\u0131r. Hem gelen hem de giden her kural\u0131 ayr\u0131 ayr\u0131 tan\u0131mlaman\u0131z gerekir. Daha genel bir g\u00fcvenlik katman\u0131 sa\u011flar.<\/li>\n<\/ul>\n<\/li>\n<li><strong>AWS WAF (Web Application Firewall):<\/strong> Web uygulamalar\u0131n\u0131z\u0131 SQL injection, cross-site scripting (XSS) gibi yayg\u0131n web a\u00e7\u0131kl\u0131klar\u0131ndan ve botlardan korur. ALB veya CloudFront ile entegre edilebilir.<\/li>\n<li><strong>Secrets Manager \/ Parameter Store:<\/strong> Veritaban\u0131 kimlik bilgileri, API anahtarlar\u0131 gibi hassas bilgileri g\u00fcvenli bir \u015fekilde depolamak ve y\u00f6netmek i\u00e7in kullan\u0131l\u0131r. Uygulamalar\u0131n\u0131z bu s\u0131rlar\u0131 do\u011frudan kodlar\u0131nda tutmak yerine, bu hizmetlerden dinamik olarak almal\u0131d\u0131r.<\/li>\n<\/ul>\n<p>A\u015fa\u011f\u0131da, bir Fargate servisi i\u00e7in gerekli bir IAM rol\u00fcn\u00fc ve bir Security Group kural\u0131n\u0131 CDK ile tan\u0131mlayan bir \u00f6rnek bulunmaktad\u0131r:<\/p>\n<pre><code class=\"language-python\">\n      import aws_cdk as cdk\n      from aws_cdk import aws_iam as iam\n      from aws_cdk import aws_ec2 as ec2\n      from constructs import Construct\n\n      class SecurityStack(cdk.Stack):\n\n          def __init__(self, scope: Construct, construct_id: str, vpc: ec2.Vpc, **kwargs) -> None:\n              super().__init__(scope, construct_id, **kwargs)\n\n              # Fargate Task i\u00e7in IAM Rol\u00fc olu\u015ftur\n              # Bu rol, Fargate g\u00f6revinin gerekli AWS hizmetlerine (\u00f6rn. CloudWatch Logs, ECR, S3) eri\u015fmesini sa\u011flar.\n              fargate_task_role = iam.Role(self, \"FargateTaskRole\",\n                  assumed_by=iam.ServicePrincipal(\"ecs-tasks.amazonaws.com\"),\n                  description=\"IAM role for Fargate tasks\"\n              )\n              fargate_task_role.add_managed_policy(\n                  iam.ManagedPolicy.from_aws_managed_policy_name(\"service-role\/AmazonECSTaskExecutionRolePolicy\")\n              )\n              # E\u011fer Fargate g\u00f6reviniz RDS'e eri\u015fecekse, buraya ilgili izinleri de eklemelisiniz.\n              # fargate_task_role.add_to_policy(iam.PolicyStatement(\n              #     actions=[\"rds-db:connect\"],\n              #     resources=[\"arn:aws:rds-db:REGION:ACCOUNT_ID:dbuser:DB_INSTANCE_RESOURCE_ID\/DB_USER_NAME\"],\n              # ))\n\n              # Bir Security Group tan\u0131mla - sadece belirli portlara izin ver\n              web_app_security_group = ec2.SecurityGroup(self, \"WebAppSecurityGroup\",\n                  vpc=vpc,\n                  description=\"Allow web traffic to Fargate tasks\",\n                  allow_all_outbound=True # Uygulama internete \u00e7\u0131k\u0131\u015f yapabilir\n              )\n\n              # HTTP (80) ve HTTPS (443) trafi\u011fine izin ver (ALB'den gelen trafik i\u00e7in)\n              web_app_security_group.add_ingress_rule(\n                  peer=ec2.Peer.ipv4(\"0.0.0.0\/0\"), # Normalde ALB'nin SG'sinden gelen trafi\u011fe izin verilir.\n                  connection=ec2.Port.tcp(80),\n                  description=\"Allow HTTP access from anywhere (ALB)\"\n              )\n              web_app_security_group.add_ingress_rule(\n                  peer=ec2.Peer.ipv4(\"0.0.0.0\/0\"),\n                  connection=ec2.Port.tcp(443),\n                  description=\"Allow HTTPS access from anywhere (ALB)\"\n              )\n\n              cdk.CfnOutput(self, \"FargateTaskRoleArn\",\n                            value=fargate_task_role.role_arn,\n                            description=\"ARN of the Fargate Task Role\")\n              cdk.CfnOutput(self, \"WebAppSecurityGroupId\",\n                            value=web_app_security_group.security_group_id,\n                            description=\"ID of the Web App Security Group\")\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu kod par\u00e7ac\u0131\u011f\u0131, Fargate g\u00f6revlerinizin AWS hizmetlerine g\u00fcvenli bir \u015fekilde eri\u015fmesini sa\u011flayan bir IAM rol\u00fc ve web uygulaman\u0131za gelen HTTP\/HTTPS trafi\u011fine izin veren bir G\u00fcvenlik Grubu olu\u015fturur. \u00d6zellikle, G\u00fcvenlik Grubu'nda <code>peer=ec2.Peer.ipv4(\"0.0.0.0\/0\")<\/code> yerine ALB'nin Security Group ID'sini kullanmak, daha s\u0131k\u0131 bir g\u00fcvenlik sa\u011flar.<\/p>\n<h3>Altyap\u0131n\u0131z\u0131n Sa\u011fl\u0131\u011f\u0131n\u0131 S\u00fcrekli Nas\u0131l Takip Edebilirsiniz?<\/h3>\n<p>\u0130zleme, \u00fcretim ortam\u0131n\u0131n sa\u011fl\u0131\u011f\u0131n\u0131, performans\u0131n\u0131 ve g\u00fcvenli\u011fini anlamak i\u00e7in hayati \u00f6neme sahiptir. AWS, bu ama\u00e7la \u00e7e\u015fitli ara\u00e7lar sunar:<\/p>\n<ul>\n<li><strong>Amazon CloudWatch:<\/strong> AWS kaynaklar\u0131n\u0131z\u0131 ve uygulamalar\u0131n\u0131z\u0131 izlemek i\u00e7in temel bir hizmettir. Metrikleri toplar, loglar\u0131 depolar ve alarmlar olu\u015fturarak belirli e\u015fik de\u011ferleri a\u015f\u0131ld\u0131\u011f\u0131nda sizi bilgilendirir. CPU kullan\u0131m\u0131, bellek t\u00fcketimi, a\u011f trafi\u011fi, veritaban\u0131 ba\u011flant\u0131lar\u0131 gibi bir\u00e7ok metrik otomatik olarak toplan\u0131r.<\/li>\n<li><strong>CloudWatch Logs:<\/strong> Uygulamalar\u0131n\u0131zdan ve AWS hizmetlerinizden (EC2, Fargate, Lambda vb.) gelen loglar\u0131 merkezi bir konumda toplar, depolar ve analiz etmenizi sa\u011flar.<\/li>\n<li><strong>CloudTrail:<\/strong> AWS hesab\u0131n\u0131zdaki t\u00fcm API aktivitesini kaydeder. Kimin, ne zaman, hangi AWS kayna\u011f\u0131nda ne i\u015flem yapt\u0131\u011f\u0131n\u0131 takip etmenizi sa\u011flar. G\u00fcvenlik denetimi ve sorun giderme i\u00e7in paha bi\u00e7ilmezdir.<\/li>\n<\/ul>\n<p>CDK ile CloudWatch alarmlar\u0131 olu\u015fturarak altyap\u0131n\u0131zdaki kritik durumlar\u0131 otomatik olarak izleyebilirsiniz. \u00d6rne\u011fin, bir Fargate servisinin CPU kullan\u0131m\u0131n\u0131n belirli bir e\u015fi\u011fi a\u015fmas\u0131 durumunda sizi bilgilendiren bir alarm kurmak:<\/p>\n<pre><code class=\"language-python\">\n      import aws_cdk as cdk\n      from aws_cdk import aws_cloudwatch as cloudwatch\n      from aws_cdk import aws_sns as sns # Alarm bildirimleri i\u00e7in SNS\n      from constructs import Construct\n\n      class MonitoringStack(cdk.Stack):\n\n          def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:\n              super().__init__(scope, construct_id, **kwargs)\n\n              # SNS Konusu olu\u015ftur - Alarmlar buraya bildirim g\u00f6nderir\n              alarm_topic = sns.Topic(self, \"AlarmTopic\",\n                  display_name=\"Critical System Alarms\"\n              )\n\n              # \u00d6rnek bir CloudWatch Alarm\u0131: Fargate servisi CPU kullan\u0131m\u0131 %80'i a\u015farsa bildirim g\u00f6nder\n              # Bu alarm\u0131 ger\u00e7ek Fargate servisinizin CPU metri\u011fine ba\u011flaman\u0131z gerekecektir.\n              # \u00d6rnek olmas\u0131 a\u00e7\u0131s\u0131ndan genel bir CPU metrik tan\u0131m\u0131 kullan\u0131yoruz.\n              cpu_utilization_metric = cloudwatch.Metric(\n                  namespace=\"AWS\/ECS\", # ECS i\u00e7in metrik namespace\n                  metric_name=\"CPUUtilization\",\n                  dimensions_map={\n                      \"ClusterName\": \"MyCluster\", # Kendi ECS k\u00fcmenizin ad\u0131n\u0131 girin\n                      \"ServiceName\": \"MyFargateService\" # Kendi Fargate servisinizin ad\u0131n\u0131 girin\n                  },\n                  period=cdk.Duration.minutes(1),\n                  statistic=\"Average\"\n              )\n\n              cpu_alarm = cloudwatch.Alarm(self, \"FargateCpuHighAlarm\",\n                  metric=cpu_utilization_metric,\n                  evaluation_periods=5, # 5 dakika boyunca e\u015fi\u011fin \u00fczerinde kal\u0131rsa\n                  threshold=80, # %80 CPU kullan\u0131m\u0131\n                  comparison_operator=cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD,\n                  alarm_description=\"Fargate service CPU utilization is too high!\",\n                  actions_enabled=True\n              )\n              cpu_alarm.add_alarm_action(cloudwatch.SnsAction(alarm_topic))\n              cpu_alarm.add_ok_action(cloudwatch.SnsAction(alarm_topic))\n\n              cdk.CfnOutput(self, \"AlarmTopicArn\",\n                            value=alarm_topic.topic_arn,\n                            description=\"ARN of the SNS topic for alarms\")\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu kod, Fargate servisinizin CPU kullan\u0131m\u0131n\u0131 izleyen ve %80'in \u00fczerine \u00e7\u0131kt\u0131\u011f\u0131nda bir SNS konusuna bildirim g\u00f6nderen bir CloudWatch Alarm\u0131 olu\u015fturur. Bu SNS konusuna e-posta adresleri veya di\u011fer bildirim u\u00e7 noktalar\u0131 abone olarak kritik uyar\u0131lar\u0131 alabilir. Bu t\u00fcr alarmlar, sorunlar\u0131 h\u0131zla tespit etmenizi ve proaktif m\u00fcdahalelerde bulunman\u0131z\u0131 sa\u011flayarak \u00fcretim ortam\u0131n\u0131z\u0131n istikrar\u0131n\u0131 ve performans\u0131n\u0131 garantiler.<\/p>\n<h2>Operasyonel M\u00fckemmellik: CDK ve CLI ile Otomasyon ve Bak\u0131m<\/h2>\n<p>\u00dcretim seviyesi bir altyap\u0131 sadece kurulmakla kalmaz, ayn\u0131 zamanda s\u00fcrekli olarak y\u00f6netilmeli, bak\u0131m\u0131 yap\u0131lmal\u0131 ve geli\u015ftirilmelidir. Operasyonel m\u00fckemmellik, tekrarlayan g\u00f6revleri otomatize etmek, h\u0131zl\u0131 ve g\u00fcvenilir da\u011f\u0131t\u0131mlar sa\u011flamak ve kaynaklar\u0131 verimli kullanmak anlam\u0131na gelir. AWS CDK ve AWS CLI, bu hedeflere ula\u015fman\u0131z i\u00e7in vazge\u00e7ilmez ara\u00e7lard\u0131r.<\/p>\n<h3>Geli\u015ftirme Ya\u015fam D\u00f6ng\u00fcs\u00fcn\u00fc Nas\u0131l H\u0131zland\u0131r\u0131rs\u0131n\u0131z?<\/h3>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme, s\u00fcrekli entegrasyon ve s\u00fcrekli teslimat (CI\/CD) prensiplerine dayan\u0131r. Altyap\u0131n\u0131n kod olarak y\u00f6netilmesi (IaC) sayesinde, CI\/CD s\u00fcre\u00e7lerinizi altyap\u0131n\u0131za da geni\u015fletebilirsiniz.<\/p>\n<ul>\n<li><strong>CI\/CD Entegrasyonu:<\/strong> CDK kodunuzu Git repolar\u0131nda saklayarak, de\u011fi\u015fiklikleri otomatik olarak test edebilir ve AWS CodePipeline, CodeBuild, GitHub Actions veya GitLab CI gibi ara\u00e7lar arac\u0131l\u0131\u011f\u0131yla \u00fcretim ortam\u0131na da\u011f\u0131tabilirsiniz. Bu, manuel hatalar\u0131 ortadan kald\u0131r\u0131r ve da\u011f\u0131t\u0131m h\u0131z\u0131n\u0131 art\u0131r\u0131r. Bir geli\u015ftirici bir pull request a\u00e7t\u0131\u011f\u0131nda, CDK kodunun sentetik testi (<code>cdk synth<\/code>) ve hatta belirli entegrasyon testleri otomatik olarak \u00e7al\u0131\u015ft\u0131r\u0131labilir.<\/li>\n<li><strong>Geriye D\u00f6n\u00fc\u015f (Rollback) Stratejileri:<\/strong> CDK (ve temelindeki CloudFormation), da\u011f\u0131t\u0131mlar\u0131 bir \"stack\" olarak y\u00f6netti\u011fi i\u00e7in, bir da\u011f\u0131t\u0131m ba\u015far\u0131s\u0131z oldu\u011funda veya bir sorun tespit edildi\u011finde, \u00f6nceki kararl\u0131 duruma kolayca geri d\u00f6nebilirsiniz. Bu, \u00fcretimde yap\u0131lan hatalar\u0131n etkisini minimize etmenin kritik bir yoludur.<\/li>\n<li><strong>Ortam Farkl\u0131l\u0131klar\u0131:<\/strong> Geli\u015ftirme, test ve \u00fcretim ortamlar\u0131 aras\u0131nda genellikle farkl\u0131 kaynak konfig\u00fcrasyonlar\u0131 (\u00f6rn. test ortam\u0131 i\u00e7in daha k\u00fc\u00e7\u00fck EC2 instance'lar\u0131, \u00fcretim i\u00e7in Multi-AZ RDS) bulunur. CDK, bu farkl\u0131l\u0131klar\u0131 ayn\u0131 kod taban\u0131 i\u00e7inde y\u00f6netmenizi sa\u011flar. \u00d6rne\u011fin, bir environment de\u011fi\u015fkeni okuyarak farkl\u0131 Construct'lar veya Construct \u00f6zellikleri uygulayabilirsiniz.<\/li>\n<\/ul>\n<pre><code class=\"language-python\">\n      # \u00d6rnek: Farkl\u0131 ortamlar i\u00e7in ko\u015fullu kaynak olu\u015fturma\n      import os\n      environment = os.getenv(\"ENV\", \"dev\") # Ortam de\u011fi\u015fkeninden 'dev' veya 'prod' oku\n\n      if environment == \"prod\":\n          # \u00dcretim ortam\u0131 i\u00e7in Multi-AZ ve daha b\u00fcy\u00fck instance tipi\n          rds.DatabaseInstance(self, \"MyDatabase\",\n              instance_type=ec2.InstanceType.of(ec2.InstanceClass.R5, ec2.InstanceSize.LARGE),\n              multi_az=True,\n              # ...\n          )\n      else:\n          # Geli\u015ftirme ortam\u0131 i\u00e7in tek AZ ve daha k\u00fc\u00e7\u00fck instance tipi\n          rds.DatabaseInstance(self, \"MyDatabase\",\n              instance_type=ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.MICRO),\n              multi_az=False,\n              # ...\n          )\n    <\/pre>\n<p><\/code><\/p>\n<div class=\"interactive-tip\">\n      Uzman \u0130pucu: AWS CloudFormation'\u0131n \"Drift Detection\" \u00f6zelli\u011fini d\u00fczenli olarak kullanarak, CDK ile da\u011f\u0131tt\u0131\u011f\u0131n\u0131z altyap\u0131 kaynaklar\u0131nda manuel olarak yap\u0131lm\u0131\u015f ve kodunuzla senkronize olmayan de\u011fi\u015fiklikleri tespit edin. Bu, \"infrastructure drift\" sorununu \u00f6nler ve IaC prensiplerine ba\u011fl\u0131 kalman\u0131z\u0131 sa\u011flar.\n    <\/div>\n<p>CLI ise rutin g\u00f6revlerin otomasyonunda parlar. \u00d6rne\u011fin, her sabah belirli bir S3 bucket'\u0131ndaki log dosyalar\u0131n\u0131 indiren veya belirli bir EC2 instance'\u0131n\u0131 ba\u015flatan\/durduran Bash scriptleri yazmak i\u00e7in CLI'\u0131 kullanabilirsiniz. Bu t\u00fcr otomasyonlar, operasyonel y\u00fck\u00fc azalt\u0131r ve insan hatas\u0131 riskini d\u00fc\u015f\u00fcr\u00fcr.<\/p>\n<pre><code class=\"language-bash\">\n      # \u00d6rnek CLI komutu: Bir EC2 instance'\u0131 ba\u015flatma\n      aws ec2 start-instances --instance-ids i-0abcdef1234567890\n\n      # \u00d6rnek CLI komutu: Bir S3 bucket'\u0131ndan belirli bir \u00f6nekteki t\u00fcm dosyalar\u0131 senkronize etme\n      aws s3 sync s3:\/\/my-prod-logs\/2023\/ ~\/local-logs\/2023\/\n    <\/pre>\n<p><\/code><\/p>\n<h3>Kaynak Y\u00f6netimi ve Maliyet Optimizasyonu \u0130\u00e7in \u0130pu\u00e7lar\u0131<\/h3>\n<p>Bulut ortamlar\u0131nda maliyet y\u00f6netimi, \u00f6zellikle \u00fcretim seviyesi altyap\u0131larda, s\u00fcrekli dikkat gerektiren bir konudur. CDK ve CLI, maliyetleri optimize etmenize yard\u0131mc\u0131 olacak ara\u00e7lar sunar:<\/p>\n<ul>\n<li><strong>Gereksiz Kaynaklar\u0131 Temizleme:<\/strong> CDK stack'lerini silmek, stack i\u00e7indeki t\u00fcm kaynaklar\u0131 otomatik olarak temizler. Geli\u015ftirme ve test ortamlar\u0131nda kullan\u0131lmayan kaynaklar\u0131n at\u0131l kalmas\u0131n\u0131 \u00f6nlemek i\u00e7in d\u00fczenli temizlik yapmak \u00f6nemlidir.<\/li>\n<li><strong>Etiketleme (Tagging) Stratejileri:<\/strong> T\u00fcm AWS kaynaklar\u0131n\u0131za (VPC, EC2, RDS, S3 vb.) tutarl\u0131 etiketler (\u00f6rne\u011fin, <code>Project: ECommerce<\/code>, <code>Environment: Production<\/code>, <code>Owner: DevOpsTeam<\/code>) eklemek, maliyetleri departmanlara, projelere veya ortamlara g\u00f6re izlemenize ve raporlaman\u0131za olanak tan\u0131r. CDK, Construct'lar\u0131n\u0131za kolayca etiket eklemenizi sa\u011flar.<\/li>\n<li><strong>Rezerveli Instance'lar (Reserved Instances) ve Tasarruf Planlar\u0131 (Savings Plans):<\/strong> Tahmin edilebilir, uzun vadeli kaynak kullan\u0131mlar\u0131 i\u00e7in bu se\u00e7enekleri de\u011ferlendirin. \u00d6nemli maliyet tasarrufu sa\u011flarlar. CLI ile mevcut kullan\u0131mlar\u0131n\u0131z\u0131 analiz edebilirsiniz.<\/li>\n<li><strong>AWS Cost Explorer:<\/strong> Harcamalar\u0131n\u0131z\u0131 g\u00f6rselle\u015ftirmek ve analiz etmek i\u00e7in Cost Explorer'\u0131 kullan\u0131n. CLI ile Cost Explorer'dan veri \u00e7ekerek kendi raporlama mekanizmalar\u0131n\u0131z\u0131 olu\u015fturabilirsiniz.<\/li>\n<\/ul>\n<pre><code class=\"language-python\">\n      # CDK ile t\u00fcm kaynaklara otomatik etiket ekleme\n      import aws_cdk as cdk\n      from constructs import Construct\n\n      class MyTaggedStack(cdk.Stack):\n          def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:\n              super().__init__(scope, construct_id, **kwargs)\n\n              cdk.Tags.of(self).add(\"Project\", \"ECommerce\")\n              cdk.Tags.of(self).add(\"Environment\", \"Production\")\n              cdk.Tags.of(self).add(\"Owner\", \"DevOpsTeam\")\n\n              # Di\u011fer kaynak tan\u0131mlamalar\u0131 buraya gelecek...\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u015fekilde, CDK ile olu\u015fturdu\u011funuz t\u00fcm kaynaklara merkezi olarak etiketler uygulayabilir ve maliyet analizlerinizi basitle\u015ftirebilirsiniz. Unutmay\u0131n, maliyet optimizasyonu s\u00fcrekli bir s\u00fcre\u00e7tir ve d\u00fczenli olarak g\u00f6zden ge\u00e7irilmesi gerekir.<\/p>\n<h2>Sonu\u00e7: Gelece\u011fe Haz\u0131r Bir Altyap\u0131 \u0130n\u015fa Etmenin G\u00fcc\u00fc<\/h2>\n<p>Bu makale boyunca, AWS CDK ve AWS CLI'\u0131n g\u00fcc\u00fcn\u00fc kullanarak, s\u0131f\u0131rdan \u00fcretim seviyesi, \u00e7ok katmanl\u0131 bir web altyap\u0131s\u0131n\u0131 nas\u0131l in\u015fa edece\u011fimizi ad\u0131m ad\u0131m inceledik. Modern web uygulamalar\u0131n\u0131n de\u011fi\u015fen ve b\u00fcy\u00fcyen ihtiya\u00e7lar\u0131na yan\u0131t verebilen, g\u00fcvenli, \u00f6l\u00e7eklenebilir ve y\u00fcksek eri\u015filebilir bir mimariyi programatik olarak tan\u0131mlaman\u0131n \u00f6nemini vurgulad\u0131k.<\/p>\n<p>Ba\u015flang\u0131\u00e7ta, bir VPC ile uygulaman\u0131z i\u00e7in izole ve g\u00fcvenli bir a\u011f temeli att\u0131k. Ard\u0131ndan, Fargate ve Application Load Balancer kullanarak \u00f6l\u00e7eklenebilir uygulama katman\u0131m\u0131z\u0131 ve Multi-AZ RDS ile g\u00fcvenilir veri katman\u0131m\u0131z\u0131 kurduk. Statik \u00f6n u\u00e7 i\u00e7eri\u011fimizi S3, CloudFront ve Route 53 ile k\u00fcresel olarak h\u0131zl\u0131 ve g\u00fcvenli bir \u015fekilde da\u011f\u0131tt\u0131k. Son olarak, IAM, Security Groups, CloudWatch ve CloudTrail gibi hizmetlerle altyap\u0131m\u0131z\u0131n g\u00fcvenlik ve izleme ihtiya\u00e7lar\u0131n\u0131 kar\u015f\u0131lad\u0131k ve CI\/CD entegrasyonu, ortam farkl\u0131l\u0131klar\u0131n\u0131n y\u00f6netimi ve maliyet optimizasyonu gibi operasyonel m\u00fckemmellik konular\u0131na de\u011findik.<\/p>\n<p>AWS CDK ve CLI, altyap\u0131 y\u00f6netiminde devrim niteli\u011finde ara\u00e7lard\u0131r. Altyap\u0131n\u0131z\u0131 kod olarak tan\u0131mlayarak, manuel hatalar\u0131 azalt\u0131r, da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini h\u0131zland\u0131r\u0131r, versiyon kontrol\u00fc sa\u011flar ve farkl\u0131 ortamlar aras\u0131nda tutarl\u0131l\u0131\u011f\u0131 garantilersiniz. Bu sadece m\u00fchendislik verimlili\u011fini art\u0131rmakla kalmaz, ayn\u0131 zamanda i\u015f s\u00fcre\u00e7lerinizin h\u0131zlanmas\u0131na ve maliyetlerin d\u00fc\u015fmesine de katk\u0131da bulunur. Gelece\u011fin bulut altyap\u0131s\u0131n\u0131 in\u015fa etmek, otomasyon, g\u00fcvenlik ve \u00f6l\u00e7eklenebilirlik prensiplerine dayan\u0131r. Bu makaledeki bilgileri ve \u00f6rnekleri rehber alarak, siz de bu g\u00fc\u00e7l\u00fc ara\u00e7larla kendi \u00fcretim seviyesi altyap\u0131lar\u0131n\u0131z\u0131 g\u00fcvenle olu\u015fturabilir ve y\u00f6netebilirsiniz.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<ol>\n<li>\n<h4>AWS CDK \u00f6\u011frenme e\u011frisi ne kadar?<\/h4>\n<p>CDK, programlama dillerini (Python, TypeScript vb.) bilen geli\u015ftiriciler i\u00e7in nispeten d\u00fc\u015f\u00fck bir \u00f6\u011frenme e\u011frisine sahiptir. AWS hizmetleri ve temel bulut mimarisi prensipleri hakk\u0131nda bilgi sahibi olmak s\u00fcreci h\u0131zland\u0131r\u0131r. Temel konseptleri ve construct'lar\u0131 \u00f6\u011frendikten sonra, h\u0131zla karma\u015f\u0131k altyap\u0131lar olu\u015fturmaya ba\u015flayabilirsiniz.<\/p>\n<\/li>\n<li>\n<h4>Mevcut bir altyap\u0131y\u0131 CDK'ya ta\u015f\u0131yabilir miyim?<\/h4>\n<p>Evet, mevcut AWS kaynaklar\u0131n\u0131z\u0131 CDK'ya ta\u015f\u0131yabilirsiniz. Bu s\u00fcrece \"import\" veya \"adopt\" denir. CDK, CloudFormation'\u0131n import yeteneklerini kullanarak mevcut kaynaklar\u0131 bir CDK stack'ine dahil etmenizi sa\u011flar. Bu, manuel olarak olu\u015fturulmu\u015f veya ba\u015fka bir IaC arac\u0131yla olu\u015fturulmu\u015f altyap\u0131lar\u0131 CDK y\u00f6netimine alman\u0131za olanak tan\u0131r.<\/p>\n<\/li>\n<li>\n<h4>CDK ve Terraform aras\u0131ndaki temel farklar nelerdir?<\/h4>\n<p>Her ikisi de pop\u00fcler IaC ara\u00e7lar\u0131 olsa da, temel farklar\u0131 vard\u0131r:<\/p>\n<ul>\n<li><strong>CDK:<\/strong> Programlama dillerini (TypeScript, Python vb.) kullanarak bulut kaynaklar\u0131n\u0131 tan\u0131mlar. AWS'e \u00f6zg\u00fcd\u00fcr ve CloudFormation'a derlenir. Y\u00fcksek d\u00fczeyli soyutlamalar (Construct'lar) sunar.<\/li>\n<li><strong>Terraform:<\/strong> HashiCorp Configuration Language (HCL) veya JSON kullan\u0131r. \u00c7apraz bulut platformlar\u0131n\u0131 destekler (AWS, Azure, GCP vb.). Daha d\u00fc\u015f\u00fck seviyeli kaynak tan\u0131mlamas\u0131 sunar ve daha az soyutlama sa\u011flar.<\/li>\n<\/ul>\n<p>                Se\u00e7iminiz, projenizin dil tercihine, bulut platformu ba\u011f\u0131ml\u0131l\u0131\u011f\u0131na ve soyutlama ihtiyac\u0131na g\u00f6re de\u011fi\u015fir.<\/p>\n<\/li>\n<li>\n<h4>\u00dcretim ortam\u0131 i\u00e7in en \u00f6nemli g\u00fcvenlik \u00f6nlemleri nelerdir?<\/h4>\n<p>En \u00f6nemli g\u00fcvenlik \u00f6nlemleri aras\u0131nda \"En az yetki prensibi\" (IAM), a\u011f segmentasyonu (VPC, Security Groups, NACL'ler), veri \u015fifrelemesi (aktar\u0131m halinde ve bekleyen veriler i\u00e7in), d\u00fczenli g\u00fcvenlik denetimleri ve yamalama, WAF gibi uygulamaya \u00f6zel korumalar ve hassas verilerin (API anahtarlar\u0131, veritaban\u0131 \u015fifreleri) Secrets Manager gibi g\u00fcvenli hizmetlerde saklanmas\u0131 yer al\u0131r.<\/p>\n<\/li>\n<li>\n<h4>Maliyetleri optimize etmek i\u00e7in hangi ad\u0131mlar\u0131 atmal\u0131y\u0131m?<\/h4>\n<p>Maliyet optimizasyonu i\u00e7in \u015funlar\u0131 yapmal\u0131s\u0131n\u0131z: Kullan\u0131lmayan veya gereksiz kaynaklar\u0131 temizleyin, t\u00fcm kaynaklar\u0131n\u0131z\u0131 tutarl\u0131 bir \u015fekilde etiketleyin, AWS Cost Explorer'\u0131 kullanarak harcamalar\u0131n\u0131z\u0131 analiz edin, \u00fcretim y\u00fckleriniz i\u00e7in Rezerveli Instance'lar veya Tasarruf Planlar\u0131 gibi uzun vadeli taahh\u00fctleri de\u011ferlendirin, Auto Scaling ile kaynaklar\u0131n\u0131z\u0131 talebe g\u00f6re otomatik \u00f6l\u00e7eklendirin ve EC2 yerine Fargate\/Lambda gibi sunucusuz hizmetleri tercih ederek operasyonel maliyetleri azalt\u0131n.<\/p>\n<\/li>\n<\/ol>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"AWS CDK ve CLI kullanarak \u00fcretim seviyesinde, g\u00fcvenilir ve \u00f6l\u00e7eklenebilir \u00e7ok katmanl\u0131 web altyap\u0131s\u0131 nas\u0131l in\u015fa edilir? Bu&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-31741","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&#039;te \u00dcretim Seviyesi \u00c7ok Katmanl\u0131 Web Altyap\u0131s\u0131 Olu\u015fturmak: CDK ve CLI ile Ad\u0131m Ad\u0131m Rehber<\/title>\n<meta name=\"description\" content=\"AWS CDK ve CLI kullanarak \u00fcretim seviyesinde, g\u00fcvenilir ve \u00f6l\u00e7eklenebilir \u00e7ok katmanl\u0131 web altyap\u0131s\u0131 nas\u0131l in\u015fa edilir? Bu makale, s\u0131f\u0131rdan ileri d\u00fczeye detayl\u0131 bir rehber sunuyor ve bulut altyap\u0131n\u0131z\u0131 otomatize etmenizi sa\u011fl\u0131yor.\" \/>\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\/awste-uretim-seviyesi-cok-katmanli-web-altyapisi-olusturmak-cdk-ve-cli-ile-adim-adim-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"AWS&#039;te \u00dcretim Seviyesi \u00c7ok Katmanl\u0131 Web Altyap\u0131s\u0131 Olu\u015fturmak: CDK ve CLI ile Ad\u0131m Ad\u0131m Rehber\" \/>\n<meta property=\"og:description\" content=\"AWS CDK ve CLI kullanarak \u00fcretim seviyesinde, g\u00fcvenilir ve \u00f6l\u00e7eklenebilir \u00e7ok katmanl\u0131 web altyap\u0131s\u0131 nas\u0131l in\u015fa edilir? Bu makale, s\u0131f\u0131rdan ileri d\u00fczeye detayl\u0131 bir rehber sunuyor ve bulut altyap\u0131n\u0131z\u0131 otomatize etmenizi sa\u011fl\u0131yor.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/awste-uretim-seviyesi-cok-katmanli-web-altyapisi-olusturmak-cdk-ve-cli-ile-adim-adim-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-13T09:32:03+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=\"38 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/awste-uretim-seviyesi-cok-katmanli-web-altyapisi-olusturmak-cdk-ve-cli-ile-adim-adim-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/awste-uretim-seviyesi-cok-katmanli-web-altyapisi-olusturmak-cdk-ve-cli-ile-adim-adim-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"AWS&#8217;te \u00dcretim Seviyesi \u00c7ok Katmanl\u0131 Web Altyap\u0131s\u0131 Olu\u015fturmak: CDK ve CLI ile Ad\u0131m Ad\u0131m Rehber\",\"datePublished\":\"2025-10-13T09:32:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/awste-uretim-seviyesi-cok-katmanli-web-altyapisi-olusturmak-cdk-ve-cli-ile-adim-adim-rehber\/\"},\"wordCount\":5502,\"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\/awste-uretim-seviyesi-cok-katmanli-web-altyapisi-olusturmak-cdk-ve-cli-ile-adim-adim-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/awste-uretim-seviyesi-cok-katmanli-web-altyapisi-olusturmak-cdk-ve-cli-ile-adim-adim-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/awste-uretim-seviyesi-cok-katmanli-web-altyapisi-olusturmak-cdk-ve-cli-ile-adim-adim-rehber\/\",\"name\":\"AWS'te \u00dcretim Seviyesi \u00c7ok Katmanl\u0131 Web Altyap\u0131s\u0131 Olu\u015fturmak: CDK ve CLI ile Ad\u0131m Ad\u0131m Rehber\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-13T09:32:03+00:00\",\"description\":\"AWS CDK ve CLI kullanarak \u00fcretim seviyesinde, g\u00fcvenilir ve \u00f6l\u00e7eklenebilir \u00e7ok katmanl\u0131 web altyap\u0131s\u0131 nas\u0131l in\u015fa edilir? Bu makale, s\u0131f\u0131rdan ileri d\u00fczeye detayl\u0131 bir rehber sunuyor ve bulut altyap\u0131n\u0131z\u0131 otomatize etmenizi sa\u011fl\u0131yor.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/awste-uretim-seviyesi-cok-katmanli-web-altyapisi-olusturmak-cdk-ve-cli-ile-adim-adim-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/awste-uretim-seviyesi-cok-katmanli-web-altyapisi-olusturmak-cdk-ve-cli-ile-adim-adim-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/awste-uretim-seviyesi-cok-katmanli-web-altyapisi-olusturmak-cdk-ve-cli-ile-adim-adim-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"AWS&#8217;te \u00dcretim Seviyesi \u00c7ok Katmanl\u0131 Web Altyap\u0131s\u0131 Olu\u015fturmak: CDK ve CLI ile Ad\u0131m Ad\u0131m 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'te \u00dcretim Seviyesi \u00c7ok Katmanl\u0131 Web Altyap\u0131s\u0131 Olu\u015fturmak: CDK ve CLI ile Ad\u0131m Ad\u0131m Rehber","description":"AWS CDK ve CLI kullanarak \u00fcretim seviyesinde, g\u00fcvenilir ve \u00f6l\u00e7eklenebilir \u00e7ok katmanl\u0131 web altyap\u0131s\u0131 nas\u0131l in\u015fa edilir? Bu makale, s\u0131f\u0131rdan ileri d\u00fczeye detayl\u0131 bir rehber sunuyor ve bulut altyap\u0131n\u0131z\u0131 otomatize etmenizi sa\u011fl\u0131yor.","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\/awste-uretim-seviyesi-cok-katmanli-web-altyapisi-olusturmak-cdk-ve-cli-ile-adim-adim-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"AWS'te \u00dcretim Seviyesi \u00c7ok Katmanl\u0131 Web Altyap\u0131s\u0131 Olu\u015fturmak: CDK ve CLI ile Ad\u0131m Ad\u0131m Rehber","og_description":"AWS CDK ve CLI kullanarak \u00fcretim seviyesinde, g\u00fcvenilir ve \u00f6l\u00e7eklenebilir \u00e7ok katmanl\u0131 web altyap\u0131s\u0131 nas\u0131l in\u015fa edilir? Bu makale, s\u0131f\u0131rdan ileri d\u00fczeye detayl\u0131 bir rehber sunuyor ve bulut altyap\u0131n\u0131z\u0131 otomatize etmenizi sa\u011fl\u0131yor.","og_url":"https:\/\/fatihsoysal.com\/blog\/awste-uretim-seviyesi-cok-katmanli-web-altyapisi-olusturmak-cdk-ve-cli-ile-adim-adim-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-13T09:32:03+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"38 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/awste-uretim-seviyesi-cok-katmanli-web-altyapisi-olusturmak-cdk-ve-cli-ile-adim-adim-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/awste-uretim-seviyesi-cok-katmanli-web-altyapisi-olusturmak-cdk-ve-cli-ile-adim-adim-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"AWS&#8217;te \u00dcretim Seviyesi \u00c7ok Katmanl\u0131 Web Altyap\u0131s\u0131 Olu\u015fturmak: CDK ve CLI ile Ad\u0131m Ad\u0131m Rehber","datePublished":"2025-10-13T09:32:03+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/awste-uretim-seviyesi-cok-katmanli-web-altyapisi-olusturmak-cdk-ve-cli-ile-adim-adim-rehber\/"},"wordCount":5502,"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\/awste-uretim-seviyesi-cok-katmanli-web-altyapisi-olusturmak-cdk-ve-cli-ile-adim-adim-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/awste-uretim-seviyesi-cok-katmanli-web-altyapisi-olusturmak-cdk-ve-cli-ile-adim-adim-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/awste-uretim-seviyesi-cok-katmanli-web-altyapisi-olusturmak-cdk-ve-cli-ile-adim-adim-rehber\/","name":"AWS'te \u00dcretim Seviyesi \u00c7ok Katmanl\u0131 Web Altyap\u0131s\u0131 Olu\u015fturmak: CDK ve CLI ile Ad\u0131m Ad\u0131m Rehber","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-13T09:32:03+00:00","description":"AWS CDK ve CLI kullanarak \u00fcretim seviyesinde, g\u00fcvenilir ve \u00f6l\u00e7eklenebilir \u00e7ok katmanl\u0131 web altyap\u0131s\u0131 nas\u0131l in\u015fa edilir? Bu makale, s\u0131f\u0131rdan ileri d\u00fczeye detayl\u0131 bir rehber sunuyor ve bulut altyap\u0131n\u0131z\u0131 otomatize etmenizi sa\u011fl\u0131yor.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/awste-uretim-seviyesi-cok-katmanli-web-altyapisi-olusturmak-cdk-ve-cli-ile-adim-adim-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/awste-uretim-seviyesi-cok-katmanli-web-altyapisi-olusturmak-cdk-ve-cli-ile-adim-adim-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/awste-uretim-seviyesi-cok-katmanli-web-altyapisi-olusturmak-cdk-ve-cli-ile-adim-adim-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"AWS&#8217;te \u00dcretim Seviyesi \u00c7ok Katmanl\u0131 Web Altyap\u0131s\u0131 Olu\u015fturmak: CDK ve CLI ile Ad\u0131m Ad\u0131m 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\/31741","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=31741"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31741\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31741"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31741"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31741"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}