{"id":36225,"date":"2025-12-10T20:01:06","date_gmt":"2025-12-10T17:01:06","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/terraform-ile-oop-scriptingden-mimariye-gecis-rehberi\/"},"modified":"2025-12-10T20:01:06","modified_gmt":"2025-12-10T17:01:06","slug":"terraform-ile-oop-scriptingden-mimariye-gecis-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/terraform-ile-oop-scriptingden-mimariye-gecis-rehberi\/","title":{"rendered":"Terraform ile OOP: Scripting&#8217;den Mimariye Ge\u00e7i\u015f Rehberi"},"content":{"rendered":"<p><body><\/p>\n<p>Terraform&#8217;da tekrar eden kodlar ve karma\u015f\u0131k altyap\u0131lar sizi yoruyor mu? Nesne Y\u00f6nelimli Programlama (OOP) prensipleriyle daha mod\u00fcler, y\u00f6netilebilir ve esnek altyap\u0131lar in\u015fa etmenin yollar\u0131n\u0131 ke\u015ffedin. Scripting al\u0131\u015fkanl\u0131\u011f\u0131ndan mimari d\u00fc\u015f\u00fcnceye ge\u00e7i\u015finizi kolayla\u015ft\u0131racak bu rehberle, Infrastructure as Code prati\u011finizi bir \u00fcst seviyeye ta\u015f\u0131y\u0131n.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\u011fi\u015fen teknoloji d\u00fcnyas\u0131nda, altyap\u0131 y\u00f6netimi hi\u00e7 olmad\u0131\u011f\u0131 kadar kritik bir role sahip. Cloud sa\u011flay\u0131c\u0131lar\u0131n\u0131n sundu\u011fu sonsuz kaynak esnekli\u011fi, bir yandan inovasyonu h\u0131zland\u0131r\u0131rken, di\u011fer yandan altyap\u0131 kodlar\u0131n\u0131n karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 da beraberinde getiriyor. Terraform gibi Infrastructure as Code (IaC) ara\u00e7lar\u0131 bu karma\u015f\u0131kl\u0131\u011f\u0131 y\u00f6netmek i\u00e7in harika \u00e7\u00f6z\u00fcmler sunsa da, kullan\u0131m \u015feklimiz sonu\u00e7lar\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde etkileyebilir. \u00c7o\u011fu zaman, h\u0131zl\u0131 \u00e7\u00f6z\u00fcmler \u00fcretmek ad\u0131na &#8220;scripting&#8221; al\u0131\u015fkanl\u0131\u011f\u0131na kap\u0131l\u0131r\u0131z. Yani, belirli bir g\u00f6revi yerine getirmek i\u00e7in h\u0131zla yaz\u0131lm\u0131\u015f, tek kullan\u0131ml\u0131k veya az tekrar eden kod bloklar\u0131 olu\u015ftururuz.<\/p>\n<p>Bu yakla\u015f\u0131m ba\u015flang\u0131\u00e7ta pratik gibi g\u00f6r\u00fcnse de, orta ve uzun vadede ciddi sorunlara yol a\u00e7ar. Bir projede ilk EC2 \u00f6rne\u011fini veya ilk VPC&#8217;yi olu\u015ftururken birka\u00e7 sat\u0131r kod yeterli olabilir. Ancak zamanla, ayn\u0131 tip kaynaklar\u0131 farkl\u0131 ortamlar (geli\u015ftirme, test, \u00fcretim) i\u00e7in defalarca kopyalay\u0131p yap\u0131\u015ft\u0131rmaya ba\u015flar\u0131z. Bu durum, &#8220;Don&#8217;t Repeat Yourself&#8221; (DRY) prensibine ayk\u0131r\u0131d\u0131r ve h\u0131zla &#8220;teknik bor\u00e7&#8221; birikimine yol a\u00e7ar. Ayn\u0131 altyap\u0131 kodunun birden fazla yerde bulunmas\u0131, de\u011fi\u015fiklik yapmay\u0131 veya hata ay\u0131klamay\u0131 kabusa \u00e7evirir. Bir g\u00fcvenlik yamas\u0131 uygulamak veya bir \u00f6zelli\u011fi g\u00fcncellemek istedi\u011finizde, y\u00fczlerce hatta binlerce sat\u0131r kod i\u00e7inde ayn\u0131 de\u011fi\u015fikli\u011fi defalarca yapmak zorunda kal\u0131rs\u0131n\u0131z. Bu hem zaman kayb\u0131na hem de tutars\u0131zl\u0131k riskine neden olur.<\/p>\n<p>Ayr\u0131ca, scripting yakla\u015f\u0131m\u0131 genellikle &#8220;kara kutu&#8221; mant\u0131\u011f\u0131ndan yoksundur. Herkesin altyap\u0131n\u0131n her detay\u0131n\u0131 bilmesini gerektiren, birbirine s\u0131k\u0131ca ba\u011fl\u0131 (tightly coupled) kod bloklar\u0131, yeni ekip \u00fcyelerinin projeye adaptasyonunu zorla\u015ft\u0131r\u0131r. Altyap\u0131 kodunun okunabilirli\u011fi ve anla\u015f\u0131labilirli\u011fi d\u00fc\u015fer. \u00d6l\u00e7eklendirme veya yeni bir b\u00f6lgeye yay\u0131lma gibi ihtiya\u00e7lar ortaya \u00e7\u0131kt\u0131\u011f\u0131nda, mevcut kodun bu gereksinimlere uyarlanmas\u0131 neredeyse imkans\u0131z hale gelir. Bu noktada, &#8220;mimar&#8221; gibi d\u00fc\u015f\u00fcnmeye ba\u015flamak, yani altyap\u0131m\u0131z\u0131 t\u0131pk\u0131 bir yaz\u0131l\u0131m uygulamas\u0131 gibi tasarlamak elzemdir. Nesne Y\u00f6nelimli Programlama (OOP) prensipleri, bu mimari d\u00fc\u015f\u00fcnce yap\u0131s\u0131n\u0131 Terraform projelerimize ta\u015f\u0131mak i\u00e7in g\u00fc\u00e7l\u00fc bir \u00e7er\u00e7eve sunar. Bu ge\u00e7i\u015f, sadece kod yazma \u015feklimizi de\u011fil, ayn\u0131 zamanda altyap\u0131 y\u00f6netimine bak\u0131\u015f a\u00e7\u0131m\u0131z\u0131 da k\u00f6kten de\u011fi\u015ftirecektir. Amac\u0131m\u0131z, tekrar eden, karma\u015f\u0131k ve y\u00f6netilemez kod y\u0131\u011f\u0131nlar\u0131ndan kurtularak, daha esnek, s\u00fcrd\u00fcr\u00fclebilir ve \u00f6l\u00e7eklenebilir altyap\u0131lar in\u015fa etmektir.<\/p>\n<h2>Terraform&#8217;da Nesne Y\u00f6nelimli Yakla\u015f\u0131m Ne Anlama Geliyor?<\/h2>\n<p>Nesne Y\u00f6nelimli Programlama (OOP), yaz\u0131l\u0131m geli\u015ftirmede yayg\u0131n olarak kullan\u0131lan bir paradigmad\u0131r ve ger\u00e7ek d\u00fcnya varl\u0131klar\u0131n\u0131 modellere d\u00f6n\u00fc\u015ft\u00fcrerek karma\u015f\u0131kl\u0131\u011f\u0131 y\u00f6netmeyi hedefler. Peki, bu kavramlar\u0131 altyap\u0131 kodu yaz\u0131m\u0131na, \u00f6zellikle de Terraform&#8217;a nas\u0131l uygulayabiliriz? Terraform&#8217;da OOP yakla\u015f\u0131m\u0131, do\u011frudan &#8220;class&#8221; ve &#8220;object&#8221; tan\u0131mlamak anlam\u0131na gelmez; daha ziyade OOP&#8217;nin temel prensiplerini (mod\u00fclerlik, soyutlama, kaps\u00fclleme ve kompozisyon) altyap\u0131 kodumuza entegre etmek demektir. Bu prensipler, Terraform projelerimizin daha d\u00fczenli, okunabilir, yeniden kullan\u0131labilir ve s\u00fcrd\u00fcr\u00fclebilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>\u00d6ncelikle, <strong>Mod\u00fclerlik<\/strong> Terraform&#8217;da &#8220;mod\u00fcl&#8221; kavram\u0131yla do\u011frudan ili\u015fkilidir. T\u0131pk\u0131 bir yaz\u0131l\u0131m projesindeki fonksiyonlar veya s\u0131n\u0131flar gibi, Terraform mod\u00fclleri de belirli bir altyap\u0131 bile\u015fenini (\u00f6rne\u011fin, bir VPC, bir veritaban\u0131, bir web sunucusu grubu) kapsayan, kendi i\u00e7inde ba\u011f\u0131ms\u0131z ve yeniden kullan\u0131labilir kod bloklar\u0131d\u0131r. Bu mod\u00fcller, farkl\u0131 ba\u011flamlarda, farkl\u0131 girdilerle \u00e7a\u011fr\u0131larak \u00e7ok benzer veya tamamen farkl\u0131 altyap\u0131 par\u00e7alar\u0131 olu\u015fturabilir. Bu, DRY (Don&#8217;t Repeat Yourself) prensibinin temelini olu\u015fturur; ayn\u0131 altyap\u0131 desenini defalarca kopyalamak yerine, bir kez tan\u0131mlanm\u0131\u015f bir mod\u00fcl\u00fc kullan\u0131r\u0131z.<\/p>\n<p><strong>Kaps\u00fclleme (Encapsulation)<\/strong>, bir nesnenin i\u00e7 \u00e7al\u0131\u015fma detaylar\u0131n\u0131 d\u0131\u015f d\u00fcnyadan gizlemesi anlam\u0131na gelir. Terraform ba\u011flam\u0131nda bu, bir mod\u00fcl\u00fcn i\u00e7indeki kaynaklar\u0131n (\u00f6rne\u011fin, bir VPC mod\u00fcl\u00fcn\u00fcn i\u00e7indeki alt a\u011flar, g\u00fcvenlik gruplar\u0131) d\u0131\u015far\u0131dan direkt m\u00fcdahale edilemez olmas\u0131n\u0131 sa\u011flamakt\u0131r. Mod\u00fcl, yaln\u0131zca <code>variable<\/code> (giri\u015f) ve <code>output<\/code> (\u00e7\u0131k\u0131\u015f) bloklar\u0131 arac\u0131l\u0131\u011f\u0131yla d\u0131\u015f d\u00fcnya ile etkile\u015fime girer. Bu sayede, mod\u00fcl\u00fcn i\u00e7indeki de\u011fi\u015fiklikler, d\u0131\u015far\u0131dan kullanan kodlar\u0131 do\u011frudan etkilemez, \u00e7\u00fcnk\u00fc d\u0131\u015f kod sadece mod\u00fcl\u00fcn aray\u00fcz\u00fcyle (giri\u015f ve \u00e7\u0131k\u0131\u015flar) ilgilenir. Bu, ba\u011f\u0131ml\u0131l\u0131klar\u0131 azalt\u0131r ve hata ay\u0131klamay\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<p><strong>Soyutlama (Abstraction)<\/strong>, karma\u015f\u0131k detaylar\u0131 basitle\u015ftirilmi\u015f bir aray\u00fcz alt\u0131nda sunmakt\u0131r. \u00d6rne\u011fin, bir <code>aws_instance<\/code> kayna\u011f\u0131 yerine, &#8220;web sunucusu&#8221; ad\u0131nda bir mod\u00fcl kullanmak soyutlamaya \u00f6rnektir. Bu web sunucusu mod\u00fcl\u00fc, i\u00e7inde <code>aws_instance<\/code>&#8216;\u0131n yan\u0131 s\u0131ra, ilgili g\u00fcvenlik grubunu, EBS birimini veya y\u00fck dengeleyici ba\u011flant\u0131s\u0131n\u0131 i\u00e7erebilir. Kullanan ki\u015fi, sadece &#8220;bir web sunucusu istiyorum&#8221; der ve mod\u00fcl t\u00fcm bu karma\u015f\u0131k detaylar\u0131 onun yerine y\u00f6netir. Bu, altyap\u0131 kodunun daha y\u00fcksek seviyeli, i\u015f odakl\u0131 terimlerle ifade edilmesini sa\u011flar.<\/p>\n<p>Son olarak, <strong>Kompozisyon (Composition)<\/strong>, basit mod\u00fclleri birle\u015ftirerek daha b\u00fcy\u00fck ve karma\u015f\u0131k altyap\u0131lar olu\u015fturma sanat\u0131d\u0131r. T\u0131pk\u0131 yaz\u0131l\u0131mda k\u00fc\u00e7\u00fck, ba\u011f\u0131ms\u0131z nesnelerin bir araya getirilerek daha b\u00fcy\u00fck sistemler olu\u015fturulmas\u0131 gibi, Terraform&#8217;da da bir VPC mod\u00fcl\u00fc, bir veritaban\u0131 mod\u00fcl\u00fc ve bir uygulama sunucusu mod\u00fcl\u00fc bir araya getirilerek tam te\u015fekk\u00fcll\u00fc bir uygulama ortam\u0131 olu\u015fturulabilir. Bu yakla\u015f\u0131m, &#8220;miras&#8221; (inheritance) yerine tercih edilir, \u00e7\u00fcnk\u00fc Terraform&#8217;da do\u011frudan miras mekanizmas\u0131 bulunmaz ve kompozisyon daha esnek ve daha az ba\u011f\u0131ml\u0131 yap\u0131lar olu\u015fturmaya olanak tan\u0131r. Bu prensiplerin uygulanmas\u0131, Terraform projelerinizi sadece &#8220;\u00e7al\u0131\u015fan&#8221; de\u011fil, ayn\u0131 zamanda &#8220;bak\u0131m\u0131 yap\u0131labilir&#8221; ve &#8220;geli\u015ftirilebilir&#8221; hale getirecektir.<\/p>\n<h3>Mod\u00fclerlik: Yeniden Kullan\u0131labilir Terraform Bile\u015fenleri Nas\u0131l Olu\u015fturulur?<\/h3>\n<p>Terraform&#8217;da mod\u00fclerlik, Nesne Y\u00f6nelimli Programlama (OOP) prensiplerinin temel ta\u015flar\u0131ndan biridir. Bir mod\u00fcl, belirli bir i\u015flevselli\u011fi veya altyap\u0131 bile\u015fenini kapsayan, kendi i\u00e7inde tutarl\u0131 ve yeniden kullan\u0131labilir bir Terraform kod blo\u011fudur. Bu yakla\u015f\u0131m, kod tekrar\u0131n\u0131 \u00f6nler (DRY prensibi), farkl\u0131 ortamlarda veya projelerde ayn\u0131 altyap\u0131 desenlerini kolayca kullanmam\u0131z\u0131 sa\u011flar ve altyap\u0131m\u0131z\u0131n bak\u0131m\u0131n\u0131, \u00f6l\u00e7eklendirilmesini ve geli\u015ftirilmesini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirir. Mod\u00fcller, t\u0131pk\u0131 yaz\u0131l\u0131m k\u00fct\u00fcphaneleri gibi d\u00fc\u015f\u00fcn\u00fclebilir; bir kez yaz\u0131l\u0131rlar ve istenildi\u011fi zaman, farkl\u0131 parametrelerle \u00e7a\u011fr\u0131larak kullan\u0131l\u0131rlar.<\/p>\n<p>Bir mod\u00fcl olu\u015ftururken, temel olarak \u00fc\u00e7 ana bile\u015fene odaklan\u0131r\u0131z: <code>main.tf<\/code> (kaynak tan\u0131mlar\u0131), <code>variables.tf<\/code> (giri\u015f parametreleri) ve <code>outputs.tf<\/code> (\u00e7\u0131k\u0131\u015f de\u011ferleri). <code>main.tf<\/code> dosyas\u0131nda, mod\u00fcl\u00fcn olu\u015fturaca\u011f\u0131 t\u00fcm AWS EC2 instance, S3 bucket, veya VPC gibi kaynaklar\u0131 tan\u0131mlar\u0131z. <code>variables.tf<\/code> dosyas\u0131, mod\u00fcl\u00fcn d\u0131\u015far\u0131dan alaca\u011f\u0131 girdileri belirtir; \u00f6rne\u011fin, bir EC2 mod\u00fcl\u00fc i\u00e7in <code>instance_type<\/code>, <code>ami_id<\/code> veya <code>key_name<\/code> gibi de\u011fi\u015fkenler tan\u0131mlayabiliriz. Bu de\u011fi\u015fkenler, mod\u00fcl\u00fcn esnekli\u011fini ve yeniden kullan\u0131labilirli\u011fini art\u0131r\u0131r. Son olarak, <code>outputs.tf<\/code> dosyas\u0131, mod\u00fcl\u00fcn d\u0131\u015far\u0131ya a\u00e7t\u0131\u011f\u0131 de\u011ferleri tan\u0131mlar; \u00f6rne\u011fin, olu\u015fturulan EC2 \u00f6rne\u011finin genel IP adresi veya bir VPC&#8217;nin ID&#8217;si gibi bilgiler, bu \u00e7\u0131kt\u0131 de\u011ferleri arac\u0131l\u0131\u011f\u0131yla mod\u00fcl\u00fc \u00e7a\u011f\u0131ran \u00fcst mod\u00fcl veya root konfig\u00fcrasyon taraf\u0131ndan kullan\u0131labilir.<\/p>\n<p>Ger\u00e7ek d\u00fcnyadan bir \u00f6rnek olarak, bir kurumsal ortamda s\u0131k\u00e7a kullan\u0131lan bir Amazon VPC (Virtual Private Cloud) yap\u0131s\u0131n\u0131 d\u00fc\u015f\u00fcnelim. Her yeni proje veya ekip i\u00e7in bir VPC olu\u015fturmak gerekti\u011finde, bu i\u015flemi manuel olarak yapmak veya her seferinde ayn\u0131 Terraform kodunu kopyalay\u0131p yap\u0131\u015ft\u0131rmak yerine, yeniden kullan\u0131labilir bir VPC mod\u00fcl\u00fc olu\u015fturabiliriz. Bu mod\u00fcl, VPC&#8217;nin kendisini, birka\u00e7 genel ve \u00f6zel alt a\u011f\u0131, rota tablolar\u0131n\u0131 ve internet a\u011f ge\u00e7idini i\u00e7erebilir. Mod\u00fcl\u00fcn giri\u015f de\u011fi\u015fkenleri ise <code>vpc_cidr_block<\/code>, <code>public_subnet_cidrs<\/code>, <code>private_subnet_cidrs<\/code> ve <code>environment_tag<\/code> gibi de\u011ferler olabilir. \u00c7\u0131k\u0131\u015flar\u0131 da <code>vpc_id<\/code>, <code>public_subnet_ids<\/code> gibi bilgiler olacakt\u0131r. B\u00f6ylece, farkl\u0131 projeler veya ortamlar i\u00e7in sadece bu de\u011fi\u015fkenleri de\u011fi\u015ftirerek tutarl\u0131 VPC yap\u0131lar\u0131 olu\u015fturabiliriz.<\/p>\n<p><code><br \/>\nmodule \"my_vpc\" {<br \/>\n  source = \".\/modules\/vpc\" # Mod\u00fcl\u00fcn yolu<br \/>\n  vpc_cidr_block = \"10.0.0.0\/16\"<br \/>\n  public_subnet_cidrs = [\"10.0.1.0\/24\", \"10.0.2.0\/24\"]<br \/>\n  private_subnet_cidrs = [\"10.0.10.0\/24\", \"10.0.11.0\/24\"]<br \/>\n  environment_tag = \"development\"<br \/>\n  project_name = \"MyWebApp\"<br \/>\n}<br \/>\n<\/code><\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Mod\u00fcllerinizi olu\u015ftururken sadece kaynaklar\u0131 de\u011fil, ayn\u0131 zamanda bu kaynaklar aras\u0131ndaki ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve varsay\u0131lan de\u011ferleri de d\u00fc\u015f\u00fcn\u00fcn. Mod\u00fcl\u00fcn varsay\u0131lan de\u011ferleri, minimum yap\u0131land\u0131rma ile kullan\u0131labilmesini sa\u011flarken, giri\u015f de\u011fi\u015fkenleri ile esnekli\u011fini art\u0131r\u0131rs\u0131n\u0131z. Ayr\u0131ca, mod\u00fcllerinize README.md dosyalar\u0131 ekleyerek kullan\u0131m\u0131n\u0131 ve beklentilerini belgelemek, di\u011fer ekip \u00fcyelerinin (ve gelecekteki sizin) i\u015fini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde kolayla\u015ft\u0131racakt\u0131r. Mod\u00fcllerin versiyonlamas\u0131n\u0131 da g\u00f6z ard\u0131 etmeyin; her b\u00fcy\u00fck de\u011fi\u015fiklik i\u00e7in yeni bir s\u00fcr\u00fcm etiketi kullanmak, geriye d\u00f6n\u00fck uyumluluk sorunlar\u0131n\u0131 y\u00f6netmenize yard\u0131mc\u0131 olur.\n<\/div>\n<p>Bu mod\u00fcler yakla\u015f\u0131m, altyap\u0131 kodunu daha y\u00f6netilebilir par\u00e7alara ay\u0131r\u0131r, her bir par\u00e7an\u0131n kendi sorumlulu\u011funu netle\u015ftirir ve hata izolasyonunu kolayla\u015ft\u0131r\u0131r. Bir hata durumunda, sorunun b\u00fcy\u00fck olas\u0131l\u0131kla belirli bir mod\u00fclde oldu\u011funu bilir ve arama alan\u0131n\u0131z\u0131 daralt\u0131rs\u0131n\u0131z. Ayr\u0131ca, g\u00fcvenlik g\u00fcncellemeleri veya performans iyile\u015ftirmeleri gibi de\u011fi\u015fiklikler, sadece ilgili mod\u00fcl\u00fc g\u00fcncelleyerek bir\u00e7ok yerde ayn\u0131 anda uygulanabilir. Bu da altyap\u0131 y\u00f6netimine ger\u00e7ek bir mimari disiplin getirir.<\/p>\n<h3>Encapsulation ve Veri Saklama: Altyap\u0131 Detaylar\u0131n\u0131 Nas\u0131l Gizleriz?<\/h3>\n<p>Kaps\u00fclleme (Encapsulation), Nesne Y\u00f6nelimli Programlama&#8217;n\u0131n (OOP) temel prensiplerinden biridir ve bir nesnenin i\u00e7 \u00e7al\u0131\u015fma detaylar\u0131n\u0131 d\u0131\u015f d\u00fcnyadan gizlemesi anlam\u0131na gelir. Bu, nesnenin veri ve davran\u0131\u015flar\u0131n\u0131 tek bir birimde toplarken, d\u0131\u015far\u0131dan eri\u015fimi kontroll\u00fc bir \u015fekilde sa\u011flayan bir aray\u00fcz sunar. Terraform ba\u011flam\u0131nda kaps\u00fclleme, bir mod\u00fcl\u00fcn i\u00e7 kaynaklar\u0131n\u0131 ve mant\u0131\u011f\u0131n\u0131 d\u0131\u015far\u0131dan do\u011frudan m\u00fcdahaleye kapatarak, sadece tan\u0131mlanm\u0131\u015f giri\u015f (variables) ve \u00e7\u0131k\u0131\u015f (outputs) arac\u0131l\u0131\u011f\u0131yla etkile\u015fim kurmas\u0131n\u0131 sa\u011flamakt\u0131r. Bu yakla\u015f\u0131m, mod\u00fcl\u00fcn i\u00e7 yap\u0131s\u0131n\u0131 de\u011fi\u015ftirdi\u011finizde, bu mod\u00fcl\u00fc kullanan di\u011fer yerlerdeki kodun bozulma riskini minimize eder, \u00e7\u00fcnk\u00fc d\u0131\u015f kod sadece mod\u00fcl\u00fcn &#8220;public&#8221; aray\u00fcz\u00fcn\u00fc kullan\u0131r.<\/p>\n<p>Bir Terraform mod\u00fcl\u00fc olu\u015ftururken, <code>main.tf<\/code> i\u00e7inde tan\u0131mlad\u0131\u011f\u0131m\u0131z <code>aws_instance<\/code> veya <code>aws_vpc<\/code> gibi kaynaklar, mod\u00fcl\u00fcn i\u00e7 detaylar\u0131d\u0131r. Bu kaynaklar\u0131n konfig\u00fcrasyonlar\u0131, mod\u00fcl\u00fcn i\u00e7 mant\u0131\u011f\u0131n\u0131 olu\u015fturur. D\u0131\u015far\u0131dan bir mod\u00fcl \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, mod\u00fcl\u00fcn i\u00e7indeki bu kaynaklar\u0131n detaylar\u0131na do\u011frudan eri\u015filemez. \u00d6rne\u011fin, bir VPC mod\u00fcl\u00fcn\u00fcn i\u00e7indeki alt a\u011flar\u0131n (subnets) ID&#8217;leri, mod\u00fcl\u00fcn kendisi taraf\u0131ndan y\u00f6netilir ve d\u0131\u015far\u0131ya sadece <code>output<\/code> bloklar\u0131yla sunulabilir. E\u011fer bir mod\u00fcl, kendi i\u00e7indeki bir kaynak ID&#8217;sini d\u0131\u015far\u0131ya <code>output<\/code> olarak a\u00e7mazsa, bu ID&#8217;ye d\u0131\u015far\u0131dan eri\u015fmek imkans\u0131z hale gelir. Bu durum, bilgi saklama (information hiding) prensibini uygulayarak, altyap\u0131 kodunun tutarl\u0131l\u0131\u011f\u0131n\u0131 ve g\u00fcvenli\u011fini art\u0131r\u0131r.<\/p>\n<p>Kaps\u00fcllemeyi sa\u011flaman\u0131n bir di\u011fer yolu, <code>locals<\/code> bloklar\u0131n\u0131 kullanmakt\u0131r. <code>locals<\/code> bloklar\u0131, bir Terraform mod\u00fcl\u00fc i\u00e7inde hesaplanan veya t\u00fcretilen de\u011ferleri ge\u00e7ici olarak saklamak i\u00e7in kullan\u0131l\u0131r. Bu de\u011ferler, sadece tan\u0131mland\u0131klar\u0131 mod\u00fcl veya root konfig\u00fcrasyon i\u00e7inde kullan\u0131labilirler ve d\u0131\u015far\u0131dan eri\u015filemezler. Bu sayede, karma\u015f\u0131k hesaplamalar\u0131 veya tekrar eden ifadeleri tek bir yerde tan\u0131mlay\u0131p, mod\u00fcl i\u00e7inde birden \u00e7ok kaynakta kullanabiliriz. \u00d6rne\u011fin, bir kaynak ad\u0131n\u0131 veya bir etiket k\u00fcmesini (<code>tags<\/code>) <code>locals<\/code> i\u00e7inde tan\u0131mlayarak, bu de\u011ferleri mod\u00fcl i\u00e7indeki t\u00fcm ilgili kaynaklara tutarl\u0131 bir \u015fekilde uygulayabiliriz. Bu, hem kod tekrar\u0131n\u0131 azalt\u0131r hem de mod\u00fcl\u00fcn i\u00e7 mant\u0131\u011f\u0131n\u0131 daha okunakl\u0131 ve y\u00f6netilebilir hale getirir.<\/p>\n<p><code><br \/>\n# locals.tf \u00f6rne\u011fi:<br \/>\nlocals {<br \/>\n  common_tags = {<br \/>\n    Environment = var.environment_tag<br \/>\n    Project     = var.project_name<br \/>\n  }<br \/>\n  instance_name = \"${var.project_name}-${var.environment_tag}-web\"<br \/>\n}<\/p>\n<p># main.tf i\u00e7inde kullan\u0131m:<br \/>\nresource \"aws_instance\" \"web_server\" {<br \/>\n  ami           = var.ami_id<br \/>\n  instance_type = var.instance_type<br \/>\n  tags          = local.common_tags<br \/>\n  # ... di\u011fer konfig\u00fcrasyonlar<br \/>\n}<br \/>\n<\/code><\/p>\n<p>Ayr\u0131ca, mevcut altyap\u0131 bilgilerini almak i\u00e7in kullan\u0131lan <code>data<\/code> bloklar\u0131 da bir t\u00fcr kaps\u00fclleme g\u00f6revi g\u00f6r\u00fcr. \u00d6rne\u011fin, belirli bir b\u00f6lgedeki en son Amazon Linux AMI&#8217;sinin ID&#8217;sini dinamik olarak almak i\u00e7in <code>aws_ami<\/code> veri kayna\u011f\u0131n\u0131 kullanabiliriz. Bu, mod\u00fcl\u00fcm\u00fcz\u00fcn AMI ID&#8217;sini harici bir de\u011fi\u015fken olarak almas\u0131n\u0131 gerektirmek yerine, mod\u00fcl\u00fcn kendi i\u00e7inde bu bilgiyi kaps\u00fcllemesini sa\u011flar. B\u00f6ylece, mod\u00fcl\u00fcn kendisi, ihtiya\u00e7 duydu\u011fu AMI ID&#8217;sini nas\u0131l bulaca\u011f\u0131n\u0131 bilir ve bu detay\u0131 mod\u00fcl\u00fc \u00e7a\u011f\u0131ran koddan gizler. Bu sayede mod\u00fcl\u00fcn ba\u011f\u0131ms\u0131zl\u0131\u011f\u0131 artar ve d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar\u0131 azal\u0131r.<\/p>\n<p><code><br \/>\n# data.tf \u00f6rne\u011fi:<br \/>\ndata \"aws_ami\" \"latest_amazon_linux\" {<br \/>\n  most_recent = true<br \/>\n  owners      = [\"amazon\"]<br \/>\n  filter {<br \/>\n    name   = \"name\"<br \/>\n    values = [\"amzn2-ami-hvm-*-x86_64-gp2\"]<br \/>\n  }<br \/>\n  filter {<br \/>\n    name   = \"virtualization-type\"<br \/>\n    values = [\"hvm\"]<br \/>\n  }<br \/>\n}<\/p>\n<p># main.tf i\u00e7inde kullan\u0131m:<br \/>\nresource \"aws_instance\" \"app_server\" {<br \/>\n  ami           = data.aws_ami.latest_amazon_linux.id<br \/>\n  instance_type = var.instance_type<br \/>\n  # ...<br \/>\n}<br \/>\n<\/code><\/p>\n<p>Bu teknikler, Terraform mod\u00fcllerinizi sadece yeniden kullan\u0131labilir de\u011fil, ayn\u0131 zamanda daha g\u00fcvenli, daha az hataya a\u00e7\u0131k ve daha kolay s\u00fcrd\u00fcr\u00fclebilir hale getirir. Kaps\u00fclleme sayesinde, mod\u00fclleriniz bir &#8220;kara kutu&#8221; gibi davran\u0131r; ne yapt\u0131\u011f\u0131n\u0131 bilirsiniz ama nas\u0131l yapt\u0131\u011f\u0131n\u0131n t\u00fcm detaylar\u0131n\u0131 bilmek zorunda kalmazs\u0131n\u0131z. Bu, b\u00fcy\u00fck ve karma\u015f\u0131k altyap\u0131lar\u0131n y\u00f6netimini basitle\u015ftiren ve ekip \u00fcyeleri aras\u0131nda sorumluluklar\u0131 netle\u015ftiren bir mimari yakla\u015f\u0131md\u0131r.<\/p>\n<h3>Composition: Kompleks Altyap\u0131lar\u0131 Basit Mod\u00fcllerden Nas\u0131l \u0130n\u015fa Ederiz?<\/h3>\n<p>Kompozisyon (Composition), Nesne Y\u00f6nelimli Programlama&#8217;da (OOP) temel bir prensiptir ve basit nesneleri veya bile\u015fenleri bir araya getirerek daha karma\u015f\u0131k yap\u0131lar olu\u015fturma anlam\u0131na gelir. Terraform ba\u011flam\u0131nda, bu prensip, daha \u00f6nce tan\u0131mlad\u0131\u011f\u0131m\u0131z k\u00fc\u00e7\u00fck, tek sorumluluklu mod\u00fclleri birle\u015ftirerek b\u00fcy\u00fck ve kompleks altyap\u0131 mimarileri in\u015fa etme prati\u011fine kar\u015f\u0131l\u0131k gelir. T\u0131pk\u0131 bir mimar\u0131n farkl\u0131 yap\u0131 ta\u015flar\u0131n\u0131 (temel, duvar, \u00e7at\u0131) birle\u015ftirerek bir bina in\u015fa etmesi gibi, Terraform mimar\u0131 da VPC, veritaban\u0131, uygulama sunucusu ve y\u00fck dengeleyici mod\u00fcllerini bir araya getirerek tam i\u015flevsel bir uygulama ortam\u0131 olu\u015fturabilir.<\/p>\n<p>Kompozisyon, \u00f6zellikle katmanl\u0131 mimariler olu\u015ftururken g\u00fc\u00e7l\u00fc bir ara\u00e7 haline gelir. \u00d6rne\u011fin, bir web uygulamas\u0131 i\u00e7in genellikle bir a\u011f katman\u0131 (VPC, alt a\u011flar, g\u00fcvenlik gruplar\u0131), bir uygulama katman\u0131 (EC2 \u00f6rnekleri, ECS k\u00fcmeleri, Lambda fonksiyonlar\u0131) ve bir veri katman\u0131 (RDS veritabanlar\u0131, DynamoDB tablolar\u0131) bulunur. Her bir katman i\u00e7in ayr\u0131 ve iyi tan\u0131mlanm\u0131\u015f Terraform mod\u00fclleri olu\u015fturarak, bu mod\u00fclleri ana bir konfig\u00fcrasyon dosyas\u0131nda birle\u015ftirebiliriz. Bu yakla\u015f\u0131m, her katman\u0131n kendi sorumluluklar\u0131n\u0131 net bir \u015fekilde tan\u0131mlamas\u0131n\u0131 ve di\u011fer katmanlardan ba\u011f\u0131ms\u0131z olarak geli\u015ftirilmesini veya g\u00fcncellenmesini sa\u011flar. B\u00f6ylece, bir katmanda yap\u0131lan de\u011fi\u015fikliklerin di\u011fer katmanlar \u00fczerindeki etkisi minimize edilir.<\/p>\n<h4>Vaka Analizi: Mikroservis Mimarisi \u0130\u00e7in Mod\u00fcl Kompozisyonu<\/h4>\n<p>Bir e-ticaret \u015firketinin yeni nesil mikroservis tabanl\u0131 uygulamas\u0131n\u0131 AWS \u00fczerinde \u00e7al\u0131\u015ft\u0131rmak istedi\u011fini varsayal\u0131m. Bu uygulama, bir API Gateway, birden \u00e7ok mikroservis (her biri kendi ECS servisinde), bir merkezi veritaban\u0131 (RDS PostgreSQL) ve bir \u00f6nbellek (ElastiCache Redis) kullan\u0131yor. Bu karma\u015f\u0131k altyap\u0131y\u0131 tek bir b\u00fcy\u00fck Terraform dosyas\u0131nda y\u00f6netmek, k\u0131sa s\u00fcrede bir kabusa d\u00f6n\u00fc\u015fecektir. Bunun yerine, kompozisyon prensibini kullanarak bu altyap\u0131y\u0131 mod\u00fcler hale getirebiliriz:<\/p>\n<ol>\n<li><strong>A\u011f Mod\u00fcl\u00fc (Network Module):<\/strong> Temel VPC, genel ve \u00f6zel alt a\u011flar, internet a\u011f ge\u00e7idi, NAT a\u011f ge\u00e7itleri ve varsay\u0131lan g\u00fcvenlik gruplar\u0131n\u0131 olu\u015fturur.<\/li>\n<li><strong>Veritaban\u0131 Mod\u00fcl\u00fc (Database Module):<\/strong> RDS PostgreSQL instance&#8217;\u0131, gerekli g\u00fcvenlik grubu kurallar\u0131 ve veritaban\u0131 parametre gruplar\u0131n\u0131 olu\u015fturur. A\u011f mod\u00fcl\u00fcn\u00fcn \u00e7\u0131kt\u0131lar\u0131n\u0131 (\u00f6rne\u011fin, \u00f6zel alt a\u011f ID&#8217;leri) girdi olarak al\u0131r.<\/li>\n<li><strong>\u00d6nbellek Mod\u00fcl\u00fc (Cache Module):<\/strong> ElastiCache Redis k\u00fcmesini ve ilgili g\u00fcvenlik grubunu olu\u015fturur. Yine a\u011f mod\u00fcl\u00fcn\u00fcn \u00e7\u0131kt\u0131lar\u0131n\u0131 girdi olarak kullan\u0131r.<\/li>\n<li><strong>ECS Servis Mod\u00fcl\u00fc (ECS Service Module):<\/strong> Bir ECS k\u00fcmesi, g\u00f6rev tan\u0131mlar\u0131, servisler ve y\u00fck dengeleyici (ALB) kurallar\u0131n\u0131 i\u00e7erir. Bu mod\u00fcl, uygulaman\u0131n her bir mikroservisi i\u00e7in tekrar tekrar \u00e7a\u011fr\u0131labilir. A\u011f mod\u00fcl\u00fcn\u00fcn \u00e7\u0131kt\u0131lar\u0131 (VPC ID, genel alt a\u011f ID&#8217;leri), veritaban\u0131 ve \u00f6nbellek mod\u00fcllerinin \u00e7\u0131kt\u0131lar\u0131 (ba\u011flant\u0131 bilgileri) bu mod\u00fcl i\u00e7in girdi olabilir.<\/li>\n<\/ol>\n<p>Ana Terraform konfig\u00fcrasyonumuz (root module) bu mod\u00fclleri a\u015fa\u011f\u0131daki gibi bir araya getirecektir:<\/p>\n<p><code><br \/>\n\/\/ main.tf dosyas\u0131nda<br \/>\n\/\/ 1. A\u011f altyap\u0131s\u0131<br \/>\nmodule \"app_network\" {<br \/>\n  source = \".\/modules\/network\"<br \/>\n  vpc_cidr       = \"10.10.0.0\/16\"<br \/>\n  public_subnets = [\"10.10.1.0\/24\", \"10.10.2.0\/24\"]<br \/>\n  private_subnets = [\"10.10.10.0\/24\", \"10.10.11.0\/24\"]<br \/>\n  environment    = \"production\"<br \/>\n  project_name   = \"E-commerce\"<br \/>\n}<\/p>\n<p>\/\/ 2. Veritaban\u0131<br \/>\nmodule \"app_database\" {<br \/>\n  source = \".\/modules\/database\"<br \/>\n  vpc_id          = module.app_network.vpc_id<br \/>\n  subnet_ids      = module.app_network.private_subnet_ids<br \/>\n  db_instance_type = \"db.t3.medium\"<br \/>\n  db_name         = \"ecommerce_db\"<br \/>\n  db_username     = \"admin\"<br \/>\n  environment     = \"production\"<br \/>\n  # ... di\u011fer db de\u011fi\u015fkenleri<br \/>\n}<\/p>\n<p>\/\/ 3. \u00d6nbellek<br \/>\nmodule \"app_cache\" {<br \/>\n  source = \".\/modules\/cache\"<br \/>\n  vpc_id     = module.app_network.vpc_id<br \/>\n  subnet_ids = module.app_network.private_subnet_ids<br \/>\n  cache_node_type = \"cache.t3.micro\"<br \/>\n  engine         = \"redis\"<br \/>\n  environment    = \"production\"<br \/>\n  # ... di\u011fer cache de\u011fi\u015fkenleri<br \/>\n}<\/p>\n<p>\/\/ 4. Mikroservisler (\u00d6rnek: \u00dcr\u00fcn Servisi)<br \/>\nmodule \"product_service\" {<br \/>\n  source = \".\/modules\/ecs_service\"<br \/>\n  vpc_id            = module.app_network.vpc_id<br \/>\n  public_subnet_ids = module.app_network.public_subnet_ids<br \/>\n  private_subnet_ids = module.app_network.private_subnet_ids<br \/>\n  service_name      = \"product-api\"<br \/>\n  container_image   = \"myrepo\/product-api:latest\"<br \/>\n  db_endpoint       = module.app_database.db_endpoint<br \/>\n  cache_endpoint    = module.app_cache.cache_endpoint<br \/>\n  environment       = \"production\"<br \/>\n  # ... di\u011fer ecs servis de\u011fi\u015fkenleri<br \/>\n}<\/p>\n<p>\/\/ 5. Di\u011fer mikroservisler (\u00d6deme, Kullan\u0131c\u0131 vb.) i\u00e7in benzer ECS servis mod\u00fcl\u00fc \u00e7a\u011fr\u0131lar\u0131...<br \/>\n<\/code><\/p>\n<p>Bu yap\u0131, her bir mod\u00fcl\u00fcn kendi i\u00e7inde ba\u011f\u0131ms\u0131z olmas\u0131n\u0131 sa\u011flarken, gerekli bilgileri <code>output<\/code> bloklar\u0131 arac\u0131l\u0131\u011f\u0131yla di\u011fer mod\u00fcllere veya \u00fcst mod\u00fcle sunar. Bu, altyap\u0131n\u0131n bir b\u00fct\u00fcn olarak nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 anlamay\u0131 kolayla\u015ft\u0131r\u0131r, \u00e7\u00fcnk\u00fc her bir katman\u0131n veya bile\u015fenin sorumlulu\u011fu net bir \u015fekilde ayr\u0131lm\u0131\u015ft\u0131r. Kompozisyon, karma\u015f\u0131k sistemlerin y\u00f6netilebilirli\u011fini art\u0131r\u0131r, de\u011fi\u015fikliklerin etkisini s\u0131n\u0131rlar ve altyap\u0131m\u0131z\u0131n daha esnek ve adapte olabilir olmas\u0131n\u0131 sa\u011flar. Ayr\u0131ca, yeni bir mikroservis eklemek veya mevcut birini de\u011fi\u015ftirmek istedi\u011fimizde, sadece ilgili ECS servis mod\u00fcl\u00fcn\u00fc g\u00fcncelleyerek veya yeni bir tane \u00e7a\u011f\u0131rarak bu i\u015flemi kolayca yapabiliriz, t\u00fcm altyap\u0131 kodunu ba\u015ftan yazmaya gerek kalmaz.<\/p>\n<h3>Inheritance Yerine Kompozisyon: Terraform&#8217;da DRY Prensibi Nas\u0131l Uygulan\u0131r?<\/h3>\n<p>Nesne Y\u00f6nelimli Programlama&#8217;da (OOP) &#8220;miras&#8221; (inheritance) ve &#8220;kompozisyon&#8221; (composition) iki farkl\u0131 yeniden kullan\u0131labilirlik mekanizmas\u0131d\u0131r. Miras, bir s\u0131n\u0131f\u0131n ba\u015fka bir s\u0131n\u0131f\u0131n \u00f6zelliklerini ve davran\u0131\u015flar\u0131n\u0131 devralmas\u0131n\u0131 sa\u011flar (&#8220;is-a&#8221; ili\u015fkisi). Kompozisyon ise, bir s\u0131n\u0131f\u0131n di\u011fer s\u0131n\u0131flar\u0131n \u00f6rneklerini i\u00e7ererek onlar\u0131n i\u015flevselli\u011fini kullanmas\u0131n\u0131 ifade eder (&#8220;has-a&#8221; ili\u015fkisi). Geleneksel yaz\u0131l\u0131m geli\u015ftirmede miras yayg\u0131n olarak kullan\u0131lsa da, a\u015f\u0131r\u0131ya ka\u00e7t\u0131\u011f\u0131nda s\u0131k\u0131 ba\u011f\u0131ml\u0131l\u0131klara ve hiyerar\u015fi karma\u015f\u0131kl\u0131\u011f\u0131na yol a\u00e7abilir.<\/p>\n<p>Terraform&#8217;da, do\u011frudan bir &#8220;miras&#8221; mekanizmas\u0131 bulunmamaktad\u0131r. Yani, bir mod\u00fcl\u00fcn ba\u015fka bir mod\u00fclden t\u00fcremesi veya onun \u00f6zelliklerini devralmas\u0131 gibi bir durum s\u00f6z konusu de\u011fildir. Bu eksiklik, asl\u0131nda bir dezavantajdan ziyade, bizi daha esnek ve sa\u011flam bir tasar\u0131m prensibi olan kompozisyona y\u00f6neltir. Terraform&#8217;da &#8220;DRY&#8221; (Don&#8217;t Repeat Yourself) prensibini uygulaman\u0131n ve kodu yeniden kullanman\u0131n en etkili yolu kompozisyondur.<\/p>\n<p>Kompozisyon, daha \u00f6nce bahsetti\u011fimiz gibi, k\u00fc\u00e7\u00fck ve tek sorumluluklu mod\u00fclleri bir araya getirerek daha b\u00fcy\u00fck yap\u0131lar olu\u015fturma prensibidir. \u00d6rne\u011fin, bir <code>aws_instance<\/code> veya <code>aws_s3_bucket<\/code> kayna\u011f\u0131 i\u00e7in varsay\u0131lan etiketler (tags) veya g\u00fcvenlik konfig\u00fcrasyonlar\u0131 gibi ortak ayarlar\u0131n\u0131z oldu\u011funu d\u00fc\u015f\u00fcn\u00fcn. Miras yakla\u015f\u0131m\u0131yla, belki bir &#8220;BaseResource&#8221; mod\u00fcl\u00fc olu\u015fturup t\u00fcm di\u011fer mod\u00fcllerin ondan devralmas\u0131n\u0131 isterdiniz. Ancak Terraform&#8217;da bu m\u00fcmk\u00fcn de\u011fil.<\/p>\n<p>Bunun yerine, bu ortak ayarlar\u0131 kaps\u00fclleyen ve d\u0131\u015far\u0131dan parametre alabilen bir &#8220;Etiket Mod\u00fcl\u00fc&#8221; veya &#8220;G\u00fcvenlik Grubu Mod\u00fcl\u00fc&#8221; olu\u015fturabiliriz. Daha sonra, di\u011fer t\u00fcm ana mod\u00fcllerimiz (\u00f6rne\u011fin, bir EC2 mod\u00fcl\u00fc, bir RDS mod\u00fcl\u00fc) bu k\u00fc\u00e7\u00fck mod\u00fclleri kendi i\u00e7lerinde \u00e7a\u011f\u0131rarak veya \u00e7\u0131kt\u0131lar\u0131n\u0131 kullanarak kompozisyon yapabilirler.<\/p>\n<p><code><br \/>\n\/\/ Ortak etiketleri tan\u0131mlayan basit bir mod\u00fcl<br \/>\n\/\/ modules\/common_tags\/main.tf<br \/>\nresource \"null_resource\" \"tags_generator\" {<br \/>\n  provisioner \"local-exec\" {<br \/>\n    command = \"echo '{\\\"Environment\\\":\\\"${var.environment}\\\",\\\"Project\\\":\\\"${var.project}\\\"}' > ${path.module}\/tags.json\"<br \/>\n  }<br \/>\n}<\/p>\n<p>\/\/ modules\/common_tags\/variables.tf<br \/>\nvariable \"environment\" {<br \/>\n  type = string<br \/>\n}<br \/>\nvariable \"project\" {<br \/>\n  type = string<br \/>\n}<\/p>\n<p>\/\/ modules\/common_tags\/outputs.tf<br \/>\noutput \"generated_tags\" {<br \/>\n  value = {<br \/>\n    Environment = var.environment<br \/>\n    Project     = var.project<br \/>\n  }<br \/>\n}<br \/>\n<\/code><\/p>\n<p>Ard\u0131ndan, bu etiket mod\u00fcl\u00fcn\u00fc di\u011fer altyap\u0131 mod\u00fcllerimizde \u00e7a\u011f\u0131rarak, etiketleri tekrar etmeden uygulayabiliriz:<\/p>\n<p><code><br \/>\n\/\/ EC2 mod\u00fcl\u00fcm\u00fcz (modules\/ec2\/main.tf)<br \/>\nmodule \"common_tags\" {<br \/>\n  source    = \"..\/..\/modules\/common_tags\" \/\/ \u00dcst dizindeki ortak etiket mod\u00fcl\u00fcn\u00fc \u00e7a\u011f\u0131r\u0131yoruz<br \/>\n  environment = var.environment<br \/>\n  project     = var.project<br \/>\n}<\/p>\n<p>resource \"aws_instance\" \"web\" {<br \/>\n  ami           = var.ami_id<br \/>\n  instance_type = var.instance_type<br \/>\n  tags          = module.common_tags.generated_tags \/\/ Etiketleri kompozisyon ile kullan\u0131yoruz<br \/>\n  # ...<br \/>\n}<br \/>\n<\/code><\/p>\n<p>Bu \u00f6rnekte, <code>common_tags<\/code> mod\u00fcl\u00fc herhangi bir kaynak olu\u015fturmuyor; sadece ortak etiketleri \u00fcreterek di\u011fer mod\u00fcllerin bunlar\u0131 kolayca kullanmas\u0131n\u0131 sa\u011fl\u0131yor. Bu, mirasa benzer bir etki yarat\u0131rken, \u00e7ok daha esnektir. \u00c7\u00fcnk\u00fc <code>aws_instance<\/code> mod\u00fcl\u00fc, <code>common_tags<\/code> mod\u00fcl\u00fcne &#8220;ba\u011fl\u0131d\u0131r&#8221; (has-a relation), ondan &#8220;t\u00fcrememi\u015ftir&#8221;. \u0130leride <code>aws_instance<\/code> mod\u00fcl\u00fcne \u00f6zel ba\u015fka bir etiket k\u00fcmesi eklemek istersek, bu kompozisyon yap\u0131s\u0131n\u0131 bozmadan kolayca yapabiliriz.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Kompozisyonu kullan\u0131rken, <code>data<\/code> bloklar\u0131n\u0131 da aktif olarak de\u011ferlendirin. <code>data<\/code> bloklar\u0131, mevcut altyap\u0131 kaynaklar\u0131 hakk\u0131nda bilgi alman\u0131z\u0131 sa\u011flar. \u00d6rne\u011fin, mevcut bir VPC&#8217;nin ID&#8217;sini veya belirli bir g\u00fcvenlik grubunun ID&#8217;sini almak i\u00e7in <code>data<\/code> bloklar\u0131n\u0131 kullanabiliriz. Bu, altyap\u0131 bile\u015fenlerini birbirine ba\u011flarken karma\u015f\u0131k \u00e7\u0131kt\u0131 zincirlerinden ka\u00e7\u0131nmam\u0131z\u0131 sa\u011flar ve ba\u011f\u0131ml\u0131l\u0131klar\u0131 daha gev\u015fek hale getirir. Bir mod\u00fcl\u00fcn ihtiyac\u0131 olan bir bilgiyi kendisi <code>data<\/code> bloklar\u0131 ile sorgulayabiliyorsa, bunu bir <code>input<\/code> olarak almak yerine bu y\u00f6ntemi tercih etmek mod\u00fcl\u00fcn ba\u011f\u0131ms\u0131zl\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.\n<\/div>\n<p>Terraform&#8217;da kompozisyonun miras yerine tercih edilmesi, daha az ba\u011f\u0131ml\u0131, daha esnek ve daha s\u00fcrd\u00fcr\u00fclebilir altyap\u0131 kodlar\u0131 yazmam\u0131z\u0131 sa\u011flar. Mod\u00fcller aras\u0131ndaki ba\u011f\u0131ml\u0131l\u0131klar a\u00e7\u0131k\u00e7a <code>input<\/code> ve <code>output<\/code>lar arac\u0131l\u0131\u011f\u0131yla tan\u0131mland\u0131\u011f\u0131ndan, altyap\u0131n\u0131n nas\u0131l bir araya geldi\u011fini anlamak daha kolayd\u0131r. Bu, Terraform projelerimizde DRY prensibini ger\u00e7ekten uygulaman\u0131n ve teknik borcu azaltman\u0131n anahtar\u0131d\u0131r.<\/p>\n<h2>\u0130leri D\u00fczey Mimari Modeller ve \u0130pu\u00e7lar\u0131<\/h2>\n<p>Terraform&#8217;u OOP prensipleriyle mimari bir yakla\u015f\u0131mla kullanmaya ba\u015flad\u0131ktan sonra, projelerinizin karma\u015f\u0131kl\u0131\u011f\u0131 ve \u00f6l\u00e7e\u011fi artt\u0131k\u00e7a kar\u015f\u0131la\u015fabilece\u011finiz baz\u0131 ileri d\u00fczey konular ve bu konularda size yard\u0131mc\u0131 olacak ipu\u00e7lar\u0131 bulunmaktad\u0131r. Bu ipu\u00e7lar\u0131, daha b\u00fcy\u00fck ekiplerle \u00e7al\u0131\u015f\u0131rken, \u00e7oklu ortam ve b\u00f6lge y\u00f6netimi yaparken veya CI\/CD s\u00fcre\u00e7lerinizi daha da optimize ederken de\u011ferli olacakt\u0131r.<\/p>\n<h3>Terragrunt ile Mod\u00fcl Y\u00f6netimi ve DRY Prensibinin Pe\u00e7esi<\/h3>\n<p>B\u00fcy\u00fck projelerde, bir\u00e7ok farkl\u0131 altyap\u0131 ortam\u0131 (dev, staging, prod) ve AWS b\u00f6lgeleri i\u00e7in ayn\u0131 mod\u00fclleri tekrar tekrar \u00e7a\u011f\u0131rmak zorunda kalabilirsiniz. Bu durum, root mod\u00fcl konfig\u00fcrasyonlar\u0131n\u0131z\u0131n olduk\u00e7a tekrar eden hale gelmesine neden olabilir. \u0130\u015fte bu noktada <a href=\"https:\/\/terragrunt.gruntwork.io\/\" target=\"_blank\" rel=\"noopener\">Terragrunt<\/a> gibi ara\u00e7lar devreye girer. Terragrunt, Terraform&#8217;u bir &#8220;sarmalay\u0131c\u0131&#8221; (wrapper) olarak kullanarak, mod\u00fcllerinizi daha DRY bir \u015fekilde yap\u0131land\u0131rman\u0131za olanak tan\u0131r. Ortak de\u011fi\u015fkenleri, backend yap\u0131land\u0131rmalar\u0131n\u0131 ve provider ayarlar\u0131n\u0131 tek bir yerde tan\u0131mlay\u0131p, farkl\u0131 ortam ve b\u00f6lgeler i\u00e7in bu tan\u0131mlar\u0131 devralabilirsiniz. Bu, her ortam i\u00e7in ayr\u0131 ayr\u0131 root konfig\u00fcrasyon dosyalar\u0131 olu\u015fturma ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r ve kod tekrar\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r.<\/p>\n<p>\u00d6rne\u011fin, bir <code>vpc<\/code> mod\u00fcl\u00fcn\u00fc hem <code>dev<\/code> hem de <code>prod<\/code> ortam\u0131nda kullanacaksan\u0131z, Terragrunt ile <code>vpc\/terragrunt.hcl<\/code> dosyas\u0131nda mod\u00fcl\u00fcn <code>source<\/code>&#8216;unu ve ortak de\u011fi\u015fkenlerini tan\u0131mlars\u0131n\u0131z. Daha sonra <code>dev\/vpc\/terragrunt.hcl<\/code> ve <code>prod\/vpc\/terragrunt.hcl<\/code> dosyalar\u0131nda sadece ortama \u00f6zg\u00fc de\u011fi\u015fkenleri belirtirsiniz. Bu, mod\u00fcl \u00e7a\u011fr\u0131lar\u0131n\u0131z\u0131n daha temiz ve daha y\u00f6netilebilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Sa\u011flam Backend Yap\u0131land\u0131rmalar\u0131 ve State Y\u00f6netimi<\/h3>\n<p>Terraform state dosyas\u0131, altyap\u0131n\u0131z\u0131n mevcut durumunu izleyen kritik bir bile\u015fendir. B\u00fcy\u00fck ve ekip\u00e7e \u00e7al\u0131\u015f\u0131lan projelerde, bu state dosyas\u0131n\u0131n g\u00fcvenli, merkezi ve versiyonlu bir \u015fekilde y\u00f6netilmesi hayati \u00f6nem ta\u015f\u0131r. S3 gibi bir object storage servisi, Terraform state&#8217;ini saklamak i\u00e7in en yayg\u0131n ve \u00f6nerilen \u00e7\u00f6z\u00fcmd\u00fcr. <code>backend<\/code> yap\u0131land\u0131rmas\u0131nda S3&#8217;\u00fc belirtirken, e\u015fzamanl\u0131 de\u011fi\u015fiklikleri \u00f6nlemek i\u00e7in DynamoDB ile &#8220;state lock&#8221; mekanizmas\u0131n\u0131 da kullanmak kritik \u00f6neme sahiptir. Bu, ayn\u0131 anda birden fazla ki\u015finin ayn\u0131 state dosyas\u0131 \u00fczerinde \u00e7al\u0131\u015f\u0131rken olas\u0131 \u00e7ak\u0131\u015fmalar\u0131 ve bozulmalar\u0131 engeller.<\/p>\n<p><code><br \/>\nterraform {<br \/>\n  backend \"s3\" {<br \/>\n    bucket         = \"my-terraform-state-bucket\"<br \/>\n    key            = \"environments\/production\/my-app\/terraform.tfstate\"<br \/>\n    region         = \"eu-central-1\"<br \/>\n    encrypt        = true<br \/>\n    dynamodb_table = \"terraform-state-locking\"<br \/>\n  }<br \/>\n}<br \/>\n<\/code><\/p>\n<p>Her ortam ve b\u00f6lge i\u00e7in ayr\u0131 bir state dosyas\u0131 kullanmak, ba\u011f\u0131ms\u0131zl\u0131k sa\u011flar ve bir ortamdaki hatan\u0131n di\u011ferlerini etkilemesini \u00f6nler. Bu, \u00f6zellikle mikroservis mimarilerinde veya farkl\u0131 ekiplerin farkl\u0131 altyap\u0131 par\u00e7alar\u0131n\u0131 y\u00f6netti\u011fi durumlarda \u00e7ok \u00f6nemlidir.<\/p>\n<h3>CI\/CD Entegrasyonu: Otomatik ve G\u00fcvenli Da\u011f\u0131t\u0131mlar<\/h3>\n<p>Mimari bir yakla\u015f\u0131mla geli\u015ftirilmi\u015f mod\u00fcler Terraform kodlar\u0131n\u0131n tam potansiyelini ortaya \u00e7\u0131karmak i\u00e7in s\u00fcrekli entegrasyon ve s\u00fcrekli da\u011f\u0131t\u0131m (CI\/CD) pipeline&#8217;lar\u0131na entegrasyon \u015fartt\u0131r. Bir CI\/CD pipeline&#8217;\u0131, her kod de\u011fi\u015fikli\u011finde otomatik olarak <code>terraform plan<\/code> komutunu \u00e7al\u0131\u015ft\u0131rarak planlanan de\u011fi\u015fiklikleri g\u00f6zden ge\u00e7irmenizi ve <code>terraform apply<\/code> komutunu g\u00fcvenli bir \u015fekilde uygulaman\u0131z\u0131 sa\u011flar. Bu s\u00fcre\u00e7, insan hatas\u0131n\u0131 minimize eder, da\u011f\u0131t\u0131m h\u0131z\u0131n\u0131 art\u0131r\u0131r ve altyap\u0131n\u0131z\u0131n s\u00fcrekli olarak istenen durumda kalmas\u0131n\u0131 garantiler.<\/p>\n<p>Entegrasyon s\u0131ras\u0131nda dikkat edilmesi gereken noktalar:<\/p>\n<ul>\n<li><strong>Terraform Plan \u0130ncelemesi:<\/strong> <code>terraform plan<\/code> \u00e7\u0131kt\u0131s\u0131n\u0131 otomatik olarak bir pull request (PR) yorumu olarak ekleyerek, kod g\u00f6zden ge\u00e7irenlerin altyap\u0131 de\u011fi\u015fikliklerini kolayca anlamas\u0131n\u0131 sa\u011flay\u0131n.<\/li>\n<li><strong>Kredensiyel Y\u00f6netimi:<\/strong> Terraform&#8217;un bulut sa\u011flay\u0131c\u0131lar\u0131na eri\u015fimi i\u00e7in kullan\u0131lan kimlik bilgilerini (credentials) CI\/CD ortam\u0131n\u0131zda g\u00fcvenli bir \u015fekilde saklay\u0131n (\u00f6rne\u011fin, vault veya IAM rolleri kullanarak).<\/li>\n<li><strong>Otomatik Do\u011frulama:<\/strong> <code>terraform validate<\/code> ve <code>terraform fmt<\/code> gibi komutlar\u0131 CI a\u015famas\u0131nda otomatik olarak \u00e7al\u0131\u015ft\u0131rarak kod kalitesini ve tutarl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flay\u0131n.<\/li>\n<li><strong>Ortam Ba\u011f\u0131ms\u0131zl\u0131\u011f\u0131:<\/strong> CI\/CD pipeline&#8217;\u0131n\u0131z\u0131n farkl\u0131 ortamlar (dev, test, prod) i\u00e7in ayr\u0131 ayr\u0131 \u00e7al\u0131\u015fabildi\u011finden ve do\u011fru state dosyalar\u0131n\u0131 kulland\u0131\u011f\u0131ndan emin olun.<\/li>\n<\/ul>\n<p>Bu ileri d\u00fczey teknikler ve ara\u00e7lar, Terraform projelerinizi sadece &#8220;\u00e7al\u0131\u015f\u0131r&#8221; olmaktan \u00e7\u0131kar\u0131p, kurumsal d\u00fczeyde y\u00f6netilebilir, \u00f6l\u00e7eklenebilir ve g\u00fcvenli hale getirmenize yard\u0131mc\u0131 olur. Mimari d\u00fc\u015f\u00fcnce, Terraform&#8217;u sadece bir scripting arac\u0131 olmaktan \u00e7\u0131kar\u0131p, g\u00fc\u00e7l\u00fc bir altyap\u0131 otomasyon platformuna d\u00f6n\u00fc\u015ft\u00fcrmenin anahtar\u0131d\u0131r.<\/p>\n<h2>Sonu\u00e7: Mimari D\u00fc\u015f\u00fcnceyle Daha \u0130yi Terraform Pratikleri<\/h2>\n<p>Bu makale boyunca, Terraform projelerimizde &#8220;scripting&#8221; al\u0131\u015fkanl\u0131\u011f\u0131ndan &#8220;mimari&#8221; bir yakla\u015f\u0131ma ge\u00e7menin neden kritik oldu\u011funu ve Nesne Y\u00f6nelimli Programlama (OOP) prensiplerini Terraform&#8217;a nas\u0131l uygulayabilece\u011fimizi detayl\u0131ca inceledik. G\u00f6rd\u00fck ki, sadece kod yazmak yeterli de\u011fil; kodumuzu bir mimar gibi tasarlamak, uzun vadede s\u00fcrd\u00fcr\u00fclebilir, y\u00f6netilebilir ve \u00f6l\u00e7eklenebilir altyap\u0131lar in\u015fa etmenin temelini olu\u015fturuyor. Mod\u00fclerlik, kaps\u00fclleme ve kompozisyon gibi OOP prensipleri, Terraform mod\u00fcllerimizi daha DRY (Don&#8217;t Repeat Yourself), esnek ve anla\u015f\u0131l\u0131r hale getirmemizi sa\u011fl\u0131yor.<\/p>\n<p>Mod\u00fcller arac\u0131l\u0131\u011f\u0131yla altyap\u0131 bile\u015fenlerimizi yeniden kullan\u0131labilir par\u00e7alara ay\u0131rmak, kod tekrar\u0131n\u0131 \u00f6nlerken, hata izolasyonunu ve bak\u0131m kolayl\u0131\u011f\u0131n\u0131 art\u0131r\u0131yor. Kaps\u00fclleme ile mod\u00fcl i\u00e7i detaylar\u0131 d\u0131\u015far\u0131dan gizlemek, ba\u011f\u0131ml\u0131l\u0131klar\u0131 azalt\u0131yor ve mod\u00fcllerin daha ba\u011f\u0131ms\u0131z \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011fl\u0131yor. Kompozisyon ise, bu k\u00fc\u00e7\u00fck, iyi tan\u0131mlanm\u0131\u015f mod\u00fclleri bir araya getirerek karma\u015f\u0131k ve katmanl\u0131 altyap\u0131lar in\u015fa etmemize olanak tan\u0131yor. Bu, miras gibi s\u0131k\u0131 ba\u011f\u0131ml\u0131l\u0131klar yerine, daha esnek &#8220;has-a&#8221; ili\u015fkileri kurmam\u0131z\u0131 sa\u011fl\u0131yor.<\/p>\n<p>Terragrunt gibi ara\u00e7larla mod\u00fcl y\u00f6netimini kolayla\u015ft\u0131rmak, merkezi state y\u00f6netimiyle g\u00fcvenli\u011fi ve tutarl\u0131l\u0131\u011f\u0131 sa\u011flamak, ve CI\/CD pipeline&#8217;lar\u0131 ile otomasyonu entegre etmek, bu mimari yakla\u015f\u0131m\u0131n getirdi\u011fi faydalar\u0131 en \u00fcst d\u00fczeye \u00e7\u0131kar\u0131yor. Bu pratikler, teknik borcu azalt\u0131rken, da\u011f\u0131t\u0131m h\u0131z\u0131n\u0131 art\u0131r\u0131yor ve ekiplerin daha verimli \u00e7al\u0131\u015fmas\u0131na olanak tan\u0131yor. Terraform&#8217;u sadece bir altyap\u0131 otomasyon arac\u0131 olarak g\u00f6rmek yerine, onu bir yaz\u0131l\u0131m projesi gibi mimari prensiplerle ele almak, bulut altyap\u0131n\u0131z\u0131n gelece\u011fini g\u00fcvence alt\u0131na alacakt\u0131r.<\/p>\n<p>Unutmay\u0131n, iyi bir altyap\u0131 mimarisi, sadece \u015fimdiki ihtiya\u00e7lar\u0131 kar\u015f\u0131lamakla kalmaz, ayn\u0131 zamanda gelecekteki de\u011fi\u015fikliklere ve b\u00fcy\u00fcmelere de kolayca adapte olabilir. Scripting&#8217;den mimariye ge\u00e7i\u015f, altyap\u0131 y\u00f6netiminde sadece daha iyi bir yol de\u011fil, ayn\u0131 zamanda daha ak\u0131ll\u0131, daha g\u00fcvenli ve daha s\u00fcrd\u00fcr\u00fclebilir bir yoldur. Bu yakla\u015f\u0131m\u0131 benimseyerek, altyap\u0131 kodunuzu ger\u00e7ek bir de\u011fere d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><strong>1. Terraform&#8217;da do\u011frudan OOP dilindeki gibi &#8220;s\u0131n\u0131f&#8221; veya &#8220;nesne&#8221; tan\u0131mlayabilir miyiz?<\/strong><\/p>\n<p>Hay\u0131r, Terraform bir genel ama\u00e7l\u0131 programlama dili de\u011fildir ve do\u011frudan OOP dillerindeki gibi &#8220;s\u0131n\u0131f&#8221; veya &#8220;nesne&#8221; tan\u0131mlama mekanizmalar\u0131 i\u00e7ermez. Ancak, mod\u00fcller, <code>variables<\/code>, <code>outputs<\/code> ve <code>locals<\/code> gibi yap\u0131lar\u0131 kullanarak mod\u00fclerlik, kaps\u00fclleme ve kompozisyon gibi OOP prensiplerini altyap\u0131 kodunuza uygulayabilirsiniz. Bu makalede de g\u00f6sterildi\u011fi gibi, Terraform&#8217;un sa\u011flad\u0131\u011f\u0131 ara\u00e7larla OOP&#8217;nin faydalar\u0131n\u0131 altyap\u0131 y\u00f6netimine ta\u015f\u0131yabilirsiniz.<\/p>\n<p><strong>2. Her k\u00fc\u00e7\u00fck altyap\u0131 bile\u015feni i\u00e7in ayr\u0131 bir mod\u00fcl olu\u015fturmal\u0131 m\u0131y\u0131m?<\/strong><\/p>\n<p>Her k\u00fc\u00e7\u00fck bile\u015fen i\u00e7in ayr\u0131 bir mod\u00fcl olu\u015fturmak, a\u015f\u0131r\u0131 mod\u00fclerli\u011fe yol a\u00e7abilir ve projenin y\u00f6netimini gereksiz yere karma\u015f\u0131k hale getirebilir. Mod\u00fcllerinizi, mant\u0131ksal olarak birbiriyle ili\u015fkili kaynaklar\u0131 gruplayacak \u015fekilde tasarlaman\u0131z \u00f6nerilir. \u00d6rne\u011fin, bir VPC ve ona ait alt a\u011flar, g\u00fcvenlik gruplar\u0131 gibi bile\u015fenler genellikle tek bir VPC mod\u00fcl\u00fc i\u00e7inde toplan\u0131r. \u00d6nemli olan, mod\u00fcl\u00fcn tek bir sorumlulu\u011fa sahip olmas\u0131 ve yeniden kullan\u0131labilir olmas\u0131d\u0131r. Deneyimle birlikte, neyin bir mod\u00fcl olarak ayr\u0131lmas\u0131 gerekti\u011fi konusunda daha iyi bir sezgi geli\u015ftireceksiniz.<\/p>\n<p><strong>3. Terraform mod\u00fcllerini nas\u0131l versiyonlamal\u0131y\u0131m?<\/strong><\/p>\n<p>Terraform mod\u00fcllerini versiyonlamak, de\u011fi\u015fiklikleri y\u00f6netmek ve geriye d\u00f6n\u00fck uyumlulu\u011fu sa\u011flamak i\u00e7in \u00f6nemlidir. Mod\u00fcllerinizi genellikle Git depolar\u0131nda tutar ve <code>git tag<\/code> kullanarak semantik versiyonlama (\u00f6rne\u011fin, v1.0.0, v1.1.0, v2.0.0) yapars\u0131n\u0131z. Mod\u00fcl\u00fc \u00e7a\u011f\u0131rd\u0131\u011f\u0131n\u0131zda <code>source<\/code> blo\u011funda belirli bir versiyonu belirtebilirsiniz. \u00d6rne\u011fin: <code>source = \"git::ssh:\/\/git@example.com\/org\/modules\/vpc.git?ref=v1.2.0\"<\/code>. Bu, mod\u00fcl g\u00fcncellemelerinin kontroll\u00fc bir \u015fekilde yap\u0131lmas\u0131n\u0131 sa\u011flar ve beklenmedik de\u011fi\u015fikliklerin \u00f6n\u00fcne ge\u00e7er.<\/p>\n<p><strong>4. Terraform&#8217;da &#8220;miras&#8221; (inheritance) yerine &#8220;kompozisyon&#8221; kullanmak ne anlama geliyor?<\/strong><\/p>\n<p>Terraform&#8217;da do\u011frudan bir miras mekanizmas\u0131 olmad\u0131\u011f\u0131 i\u00e7in, bir mod\u00fcl\u00fcn ba\u015fka bir mod\u00fcl\u00fcn t\u00fcm \u00f6zelliklerini &#8220;devralmas\u0131&#8221; m\u00fcmk\u00fcn de\u011fildir. Bunun yerine, kompozisyon yakla\u015f\u0131m\u0131n\u0131 kullan\u0131r\u0131z. Bu, daha b\u00fcy\u00fck bir mod\u00fcl\u00fcn, daha k\u00fc\u00e7\u00fck, ba\u011f\u0131ms\u0131z mod\u00fclleri kendi i\u00e7inde &#8220;i\u00e7ermesi&#8221; veya &#8220;kullanmas\u0131&#8221; anlam\u0131na gelir. \u00d6rne\u011fin, bir <code>web_server<\/code> mod\u00fcl\u00fc, <code>vpc<\/code> mod\u00fcl\u00fcn\u00fc veya <code>security_group<\/code> mod\u00fcl\u00fcn\u00fc kendi i\u00e7inde \u00e7a\u011f\u0131rarak onlar\u0131n i\u015flevselli\u011fini kullan\u0131r. Bu, daha esnek ve daha az ba\u011f\u0131ml\u0131 bir yap\u0131 olu\u015fturur, \u00e7\u00fcnk\u00fc her mod\u00fcl kendi sorumlulu\u011funu yerine getirir ve di\u011fer mod\u00fcllerle sadece gerekli ara y\u00fczler (giri\u015f\/\u00e7\u0131k\u0131\u015flar) \u00fczerinden ileti\u015fim kurar.<\/p>\n<p><strong>5. Mevcut Terraform projemi OOP prensiplerine g\u00f6re nas\u0131l yeniden yap\u0131land\u0131rabilirim?<\/strong><\/p>\n<p>Mevcut projeleri yeniden yap\u0131land\u0131rmak (refactoring) kademeli bir s\u00fcre\u00e7tir. \u0130lk ad\u0131m, en \u00e7ok tekrar eden veya en karma\u015f\u0131k kod bloklar\u0131n\u0131 belirlemektir. Bu bloklar\u0131 yava\u015f yava\u015f ba\u011f\u0131ms\u0131z mod\u00fcllere d\u00f6n\u00fc\u015ft\u00fcr\u00fcn. Her bir mod\u00fcl\u00fc olu\u015fturduktan sonra, onu test edin ve mevcut kodunuzda bu mod\u00fcl\u00fc \u00e7a\u011f\u0131rmak i\u00e7in gerekli de\u011fi\u015fiklikleri yap\u0131n. <code>terraform state mv<\/code> komutunu kullanarak kaynaklar\u0131n state dosyas\u0131ndaki konumlar\u0131n\u0131 yeni mod\u00fcl yap\u0131land\u0131rmas\u0131na g\u00f6re g\u00fcncelleyebilirsiniz. Bu s\u00fcreci k\u00fc\u00e7\u00fck ad\u0131mlarla ve s\u0131k s\u0131k <code>terraform plan<\/code> ve <code>terraform apply<\/code> yaparak ilerletmek, riskleri minimize edecektir.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Terraform&#8217;da tekrar eden kodlar ve karma\u015f\u0131k altyap\u0131lar sizi yoruyor mu? Nesne Y\u00f6nelimli Programlama (OOP) prensipleriyle daha mod\u00fcler, y\u00f6netilebilir&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":[1],"tags":[],"class_list":{"0":"post-36225","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","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>Terraform ile OOP: Scripting&#039;den Mimariye Ge\u00e7i\u015f Rehberi<\/title>\n<meta name=\"description\" content=\"Terraform&#039;da tekrar eden kodlar ve karma\u015f\u0131k altyap\u0131lar sizi yoruyor mu? Nesne Y\u00f6nelimli Programlama (OOP) prensipleriyle daha mod\u00fcler, y\u00f6netilebilir ve esnek altyap\u0131lar in\u015fa etmenin yollar\u0131n\u0131 ke\u015ffedin. Scripting al\u0131\u015fkanl\u0131\u011f\u0131ndan mimari d\u00fc\u015f\u00fcnceye ge\u00e7i\u015finizi kolayla\u015ft\u0131racak bu rehberle, Infrastructure as Code prati\u011finizi bir \u00fcst seviyeye ta\u015f\u0131y\u0131n.\" \/>\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\/terraform-ile-oop-scriptingden-mimariye-gecis-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Terraform ile OOP: Scripting&#039;den Mimariye Ge\u00e7i\u015f Rehberi\" \/>\n<meta property=\"og:description\" content=\"Terraform&#039;da tekrar eden kodlar ve karma\u015f\u0131k altyap\u0131lar sizi yoruyor mu? Nesne Y\u00f6nelimli Programlama (OOP) prensipleriyle daha mod\u00fcler, y\u00f6netilebilir ve esnek altyap\u0131lar in\u015fa etmenin yollar\u0131n\u0131 ke\u015ffedin. Scripting al\u0131\u015fkanl\u0131\u011f\u0131ndan mimari d\u00fc\u015f\u00fcnceye ge\u00e7i\u015finizi kolayla\u015ft\u0131racak bu rehberle, Infrastructure as Code prati\u011finizi bir \u00fcst seviyeye ta\u015f\u0131y\u0131n.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/terraform-ile-oop-scriptingden-mimariye-gecis-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-10T17:01:06+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\/terraform-ile-oop-scriptingden-mimariye-gecis-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-ile-oop-scriptingden-mimariye-gecis-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Terraform ile OOP: Scripting&#8217;den Mimariye Ge\u00e7i\u015f Rehberi\",\"datePublished\":\"2025-12-10T17:01:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-ile-oop-scriptingden-mimariye-gecis-rehberi\/\"},\"wordCount\":5270,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/terraform-ile-oop-scriptingden-mimariye-gecis-rehberi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-ile-oop-scriptingden-mimariye-gecis-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/terraform-ile-oop-scriptingden-mimariye-gecis-rehberi\/\",\"name\":\"Terraform ile OOP: Scripting'den Mimariye Ge\u00e7i\u015f Rehberi\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-10T17:01:06+00:00\",\"description\":\"Terraform'da tekrar eden kodlar ve karma\u015f\u0131k altyap\u0131lar sizi yoruyor mu? Nesne Y\u00f6nelimli Programlama (OOP) prensipleriyle daha mod\u00fcler, y\u00f6netilebilir ve esnek altyap\u0131lar in\u015fa etmenin yollar\u0131n\u0131 ke\u015ffedin. Scripting al\u0131\u015fkanl\u0131\u011f\u0131ndan mimari d\u00fc\u015f\u00fcnceye ge\u00e7i\u015finizi kolayla\u015ft\u0131racak bu rehberle, Infrastructure as Code prati\u011finizi bir \u00fcst seviyeye ta\u015f\u0131y\u0131n.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-ile-oop-scriptingden-mimariye-gecis-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/terraform-ile-oop-scriptingden-mimariye-gecis-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-ile-oop-scriptingden-mimariye-gecis-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Terraform ile OOP: Scripting&#8217;den Mimariye Ge\u00e7i\u015f Rehberi\"}]},{\"@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":"Terraform ile OOP: Scripting'den Mimariye Ge\u00e7i\u015f Rehberi","description":"Terraform'da tekrar eden kodlar ve karma\u015f\u0131k altyap\u0131lar sizi yoruyor mu? Nesne Y\u00f6nelimli Programlama (OOP) prensipleriyle daha mod\u00fcler, y\u00f6netilebilir ve esnek altyap\u0131lar in\u015fa etmenin yollar\u0131n\u0131 ke\u015ffedin. Scripting al\u0131\u015fkanl\u0131\u011f\u0131ndan mimari d\u00fc\u015f\u00fcnceye ge\u00e7i\u015finizi kolayla\u015ft\u0131racak bu rehberle, Infrastructure as Code prati\u011finizi bir \u00fcst seviyeye ta\u015f\u0131y\u0131n.","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\/terraform-ile-oop-scriptingden-mimariye-gecis-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Terraform ile OOP: Scripting'den Mimariye Ge\u00e7i\u015f Rehberi","og_description":"Terraform'da tekrar eden kodlar ve karma\u015f\u0131k altyap\u0131lar sizi yoruyor mu? Nesne Y\u00f6nelimli Programlama (OOP) prensipleriyle daha mod\u00fcler, y\u00f6netilebilir ve esnek altyap\u0131lar in\u015fa etmenin yollar\u0131n\u0131 ke\u015ffedin. Scripting al\u0131\u015fkanl\u0131\u011f\u0131ndan mimari d\u00fc\u015f\u00fcnceye ge\u00e7i\u015finizi kolayla\u015ft\u0131racak bu rehberle, Infrastructure as Code prati\u011finizi bir \u00fcst seviyeye ta\u015f\u0131y\u0131n.","og_url":"https:\/\/fatihsoysal.com\/blog\/terraform-ile-oop-scriptingden-mimariye-gecis-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-10T17:01:06+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\/terraform-ile-oop-scriptingden-mimariye-gecis-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/terraform-ile-oop-scriptingden-mimariye-gecis-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Terraform ile OOP: Scripting&#8217;den Mimariye Ge\u00e7i\u015f Rehberi","datePublished":"2025-12-10T17:01:06+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/terraform-ile-oop-scriptingden-mimariye-gecis-rehberi\/"},"wordCount":5270,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/terraform-ile-oop-scriptingden-mimariye-gecis-rehberi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/terraform-ile-oop-scriptingden-mimariye-gecis-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/terraform-ile-oop-scriptingden-mimariye-gecis-rehberi\/","name":"Terraform ile OOP: Scripting'den Mimariye Ge\u00e7i\u015f Rehberi","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-10T17:01:06+00:00","description":"Terraform'da tekrar eden kodlar ve karma\u015f\u0131k altyap\u0131lar sizi yoruyor mu? Nesne Y\u00f6nelimli Programlama (OOP) prensipleriyle daha mod\u00fcler, y\u00f6netilebilir ve esnek altyap\u0131lar in\u015fa etmenin yollar\u0131n\u0131 ke\u015ffedin. Scripting al\u0131\u015fkanl\u0131\u011f\u0131ndan mimari d\u00fc\u015f\u00fcnceye ge\u00e7i\u015finizi kolayla\u015ft\u0131racak bu rehberle, Infrastructure as Code prati\u011finizi bir \u00fcst seviyeye ta\u015f\u0131y\u0131n.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/terraform-ile-oop-scriptingden-mimariye-gecis-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/terraform-ile-oop-scriptingden-mimariye-gecis-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/terraform-ile-oop-scriptingden-mimariye-gecis-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Terraform ile OOP: Scripting&#8217;den Mimariye Ge\u00e7i\u015f Rehberi"}]},{"@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\/36225","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=36225"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36225\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36225"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36225"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36225"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}