{"id":31774,"date":"2025-10-13T21:41:11","date_gmt":"2025-10-13T18:41:11","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=31774"},"modified":"2025-10-13T21:41:11","modified_gmt":"2025-10-13T18:41:11","slug":"terraform-modulleri-ve-sablonlari-ile-yeniden-kullanilabilir-altyapi-olusturma","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/terraform-modulleri-ve-sablonlari-ile-yeniden-kullanilabilir-altyapi-olusturma\/","title":{"rendered":"Terraform Mod\u00fclleri ve \u015eablonlar\u0131 ile Yeniden Kullan\u0131labilir Altyap\u0131 Olu\u015fturma"},"content":{"rendered":"<p><body><\/p>\n<h2>Terraform Mod\u00fclleri ve \u015eablonlar\u0131 ile Yeniden Kullan\u0131labilir Altyap\u0131 Olu\u015fturma<\/h2>\n<h3>Giri\u015f<\/h3>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme ve operasyon s\u00fcre\u00e7lerinde, altyap\u0131n\u0131n kod olarak y\u00f6netilmesi (Infrastructure as Code &#8211; IaC) vazge\u00e7ilmez bir yakla\u015f\u0131m haline gelmi\u015ftir. IaC, altyap\u0131y\u0131 manuel s\u00fcre\u00e7ler yerine kod arac\u0131l\u0131\u011f\u0131yla tan\u0131mlamay\u0131, sa\u011flamay\u0131 ve y\u00f6netmeyi sa\u011flar. Bu sayede, altyap\u0131 da\u011f\u0131t\u0131mlar\u0131 tutarl\u0131, tekrarlanabilir ve s\u00fcr\u00fcm kontroll\u00fc hale gelir. IaC ara\u00e7lar\u0131 aras\u0131nda \u00f6ne \u00e7\u0131kanlardan biri de HashiCorp Terraform&#8217;dur. Terraform, \u00e7e\u015fitli bulut sa\u011flay\u0131c\u0131lar\u0131 (AWS, Azure, GCP) ve di\u011fer hizmetler (Kubernetes, Docker) \u00fczerinde altyap\u0131 kaynaklar\u0131n\u0131 g\u00fcvenli ve verimli bir \u015fekilde olu\u015fturmaya, de\u011fi\u015ftirmeye ve s\u00fcr\u00fcmlemeye olanak tan\u0131r.<\/p>\n<p>Ancak, b\u00fcy\u00fck ve karma\u015f\u0131k altyap\u0131 ortamlar\u0131nda, basit Terraform yap\u0131land\u0131rma dosyalar\u0131 bile h\u0131zla y\u00f6netilemez hale gelebilir. Ayn\u0131 kaynaklar\u0131n veya kaynak gruplar\u0131n\u0131n farkl\u0131 ortamlarda (geli\u015ftirme, test, \u00fcretim) veya farkl\u0131 projelerde tekrar tekrar tan\u0131mlanmas\u0131, &#8220;kopyala-yap\u0131\u015ft\u0131r&#8221; hatalar\u0131na, tutars\u0131zl\u0131\u011fa ve bak\u0131m zorluklar\u0131na yol a\u00e7ar. \u0130\u015fte bu noktada, Terraform mod\u00fclleri ve \u015fablonlar\u0131 devreye girerek altyap\u0131y\u0131 yeniden kullan\u0131labilir, soyutlanm\u0131\u015f ve daha kolay y\u00f6netilebilir par\u00e7alara ay\u0131rma imkan\u0131 sunar. Bu makale, Terraform mod\u00fcllerinin ve \u015fablonlar\u0131n\u0131n ne oldu\u011funu, nas\u0131l kullan\u0131ld\u0131\u011f\u0131n\u0131 ve yeniden kullan\u0131labilir altyap\u0131 olu\u015fturmada sunduklar\u0131 avantajlar\u0131 ayr\u0131nt\u0131l\u0131 bir \u015fekilde inceleyecektir.<\/p>\n<h3>Neden Yeniden Kullan\u0131labilir Altyap\u0131?<\/h3>\n<p>Yeniden kullan\u0131labilir altyap\u0131, IaC prensiplerinin temel bir uzant\u0131s\u0131d\u0131r ve bir\u00e7ok \u00f6nemli avantaj sunar:<\/p>\n<p>*   <strong>Tutarl\u0131l\u0131k ve G\u00fcvenilirlik:<\/strong> Ayn\u0131 mod\u00fcl\u00fcn farkl\u0131 ortamlarda kullan\u0131lmas\u0131, altyap\u0131n\u0131n her zaman ayn\u0131 \u015fekilde yap\u0131land\u0131r\u0131lmas\u0131n\u0131 sa\u011flar. Bu, manuel yap\u0131land\u0131rma hatalar\u0131n\u0131 ortadan kald\u0131r\u0131r ve \u00fcretim ortam\u0131ndaki sorun riskini azalt\u0131r.<br \/>\n*   <strong>H\u0131z ve Verimlilik:<\/strong> \u00d6nceden tan\u0131mlanm\u0131\u015f ve test edilmi\u015f mod\u00fcller sayesinde, yeni altyap\u0131 bile\u015fenleri veya ortamlar\u0131 \u00e7ok daha h\u0131zl\u0131 bir \u015fekilde devreye al\u0131nabilir. Geli\u015ftiriciler ve operasyon ekipleri, temel altyap\u0131 elemanlar\u0131n\u0131 s\u0131f\u0131rdan olu\u015fturmak yerine mevcut mod\u00fclleri kullanabilirler.<br \/>\n*   <strong>Maliyet Azaltma:<\/strong> Daha h\u0131zl\u0131 da\u011f\u0131t\u0131m ve daha az hata, operasyonel maliyetleri d\u00fc\u015f\u00fcr\u00fcr. Ayr\u0131ca, altyap\u0131 kaynaklar\u0131n\u0131n daha standart ve optimize edilmi\u015f bir \u015fekilde kullan\u0131lmas\u0131, gereksiz kaynak tahsisini \u00f6nleyebilir.<br \/>\n*   <strong>Bak\u0131m Kolayl\u0131\u011f\u0131:<\/strong> Bir mod\u00fclde yap\u0131lan de\u011fi\u015fiklikler, o mod\u00fcl\u00fc kullanan t\u00fcm altyap\u0131 da\u011f\u0131t\u0131mlar\u0131na merkezi bir \u015fekilde uygulanabilir. Bu, g\u00fcvenlik yamalar\u0131, s\u00fcr\u00fcm y\u00fckseltmeleri veya yap\u0131land\u0131rma de\u011fi\u015fiklikleri gibi bak\u0131m g\u00f6revlerini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirir.<br \/>\n*   <strong>Ekip \u0130\u015fbirli\u011fi:<\/strong> Mod\u00fcller, farkl\u0131 ekiplerin veya bireylerin altyap\u0131n\u0131n farkl\u0131 katmanlar\u0131 \u00fczerinde \u00e7al\u0131\u015fmas\u0131na olanak tan\u0131r. \u00d6rne\u011fin, bir ekip a\u011f mod\u00fcllerini geli\u015ftirirken, ba\u015fka bir ekip veritaban\u0131 mod\u00fcllerini kullanabilir. Bu, i\u015f b\u00f6l\u00fcm\u00fcn\u00fc te\u015fvik eder ve uzmanla\u015fmay\u0131 sa\u011flar.<br \/>\n*   <strong>Soyutlama:<\/strong> Mod\u00fcller, karma\u015f\u0131k altyap\u0131 detaylar\u0131n\u0131 soyutlayarak, kullan\u0131c\u0131lar\u0131n sadece ihtiya\u00e7 duyduklar\u0131 parametreleri anlamalar\u0131n\u0131 sa\u011flar. Bu, altyap\u0131 m\u00fchendislerinin daha y\u00fcksek seviyeli mimarilere odaklanmas\u0131na olanak tan\u0131r.<\/p>\n<h3>Terraform Mod\u00fclleri Nedir?<\/h3>\n<p>Terraform&#8217;da &#8220;mod\u00fcl&#8221;, bir veya daha fazla kaynak taraf\u0131ndan y\u00f6netilen bir yap\u0131land\u0131rma dosyalar\u0131 koleksiyonudur. Her Terraform yap\u0131land\u0131rmas\u0131 en az bir k\u00f6k mod\u00fcl i\u00e7erir. K\u00f6k mod\u00fcl, <code>terraform apply<\/code> komutunu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131z dizindir. Di\u011fer mod\u00fcller, bu k\u00f6k mod\u00fcl i\u00e7inde veya harici kaynaklardan \u00e7a\u011fr\u0131labilir. Mod\u00fcller, altyap\u0131 kaynaklar\u0131n\u0131 mant\u0131ksal birimler halinde gruplayarak kodun d\u00fczenlenmesini, yeniden kullan\u0131labilirli\u011fini ve anla\u015f\u0131l\u0131rl\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<h4>Mod\u00fcl Yap\u0131s\u0131<\/h4>\n<p>Tipik bir Terraform mod\u00fcl\u00fc, a\u015fa\u011f\u0131daki gibi bir dizin yap\u0131s\u0131na sahiptir:<\/p>\n<pre><code class=\"language-\">my-module\/\n\u251c\u2500\u2500 main.tf\n\u251c\u2500\u2500 variables.tf\n\u251c\u2500\u2500 outputs.tf\n\u251c\u2500\u2500 versions.tf\n\u2514\u2500\u2500 README.md<\/code><\/pre>\n<p>*   <strong><code>main.tf<\/code><\/strong>: Mod\u00fcl\u00fcn ana kaynak tan\u0131mlamalar\u0131n\u0131 i\u00e7erir. EC2 \u00f6rnekleri, VPC&#8217;ler, veritabanlar\u0131 gibi temel altyap\u0131 kaynaklar\u0131 burada tan\u0131mlan\u0131r.<br \/>\n*   <strong><code>variables.tf<\/code><\/strong>: Mod\u00fcl\u00fcn d\u0131\u015far\u0131dan alaca\u011f\u0131 giri\u015f parametrelerini (de\u011fi\u015fkenleri) tan\u0131mlar. Bu, mod\u00fcl\u00fcn esnekli\u011fini sa\u011flar.<br \/>\n*   <strong><code>outputs.tf<\/code><\/strong>: Mod\u00fcl\u00fcn tamamland\u0131ktan sonra d\u0131\u015far\u0131ya d\u00f6nd\u00fcrece\u011fi de\u011ferleri (\u00e7\u0131kt\u0131lar\u0131) tan\u0131mlar. \u00d6rne\u011fin, olu\u015fturulan bir EC2 \u00f6rne\u011finin IP adresi veya bir veritaban\u0131n\u0131n ba\u011flant\u0131 dizesi.<br \/>\n*   <strong><code>versions.tf<\/code><\/strong>: Mod\u00fcl\u00fcn gerektirdi\u011fi Terraform s\u00fcr\u00fcm\u00fcn\u00fc ve sa\u011flay\u0131c\u0131 s\u00fcr\u00fcmlerini belirtir.<br \/>\n*   <strong><code>README.md<\/code><\/strong>: Mod\u00fcl\u00fcn nas\u0131l kullan\u0131laca\u011f\u0131n\u0131, hangi giri\u015fleri bekledi\u011fini, hangi \u00e7\u0131kt\u0131lar\u0131 sa\u011flad\u0131\u011f\u0131n\u0131 ve \u00f6rnek kullan\u0131m senaryolar\u0131n\u0131 a\u00e7\u0131klayan bir belgeleme dosyas\u0131d\u0131r. Bu, mod\u00fcl\u00fcn ba\u015fkalar\u0131 taraf\u0131ndan kolayca anla\u015f\u0131lmas\u0131n\u0131 ve kullan\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>Mod\u00fcl Giri\u015fleri (Variables)<\/h4>\n<p>Mod\u00fcllerin yeniden kullan\u0131labilir olmas\u0131n\u0131 sa\u011flayan temel mekanizma, giri\u015f de\u011fi\u015fkenleridir. <code>variables.tf<\/code> dosyas\u0131nda tan\u0131mlanan de\u011fi\u015fkenler, mod\u00fcl\u00fcn davran\u0131\u015f\u0131n\u0131 d\u0131\u015far\u0131dan kontrol etmeye olanak tan\u0131r.<\/p>\n<pre><code class=\"language-terraform\"># variables.tf\nvariable \"instance_type\" {\n  description = \"EC2 instance type\"\n  type        = string\n  default     = \"t2.micro\"\n}\n\nvariable \"ami_id\" {\n  description = \"AMI ID for the EC2 instance\"\n  type        = string\n}\n\nvariable \"tags\" {\n  description = \"Tags to apply to the EC2 instance\"\n  type        = map(string)\n  default     = {}\n}<\/code><\/pre>\n<p>Bu de\u011fi\u015fkenler, mod\u00fcl\u00fc \u00e7a\u011f\u0131ran ana yap\u0131land\u0131rma taraf\u0131ndan a\u015fa\u011f\u0131daki gibi de\u011ferlerle beslenir:<\/p>\n<pre><code class=\"language-terraform\"># main.tf (ana yap\u0131land\u0131rmada)\nmodule \"web_server\" {\n  source        = \".\/modules\/ec2-instance\"\n  instance_type = \"t3.medium\"\n  ami_id        = \"ami-0abcdef1234567890\" # Ger\u00e7ek bir AMI ID\n  tags = {\n    Name        = \"WebServer\"\n    Environment = \"Production\"\n  }\n}<\/code><\/pre>\n<h4>Mod\u00fcl \u00c7\u0131kt\u0131lar\u0131 (Outputs)<\/h4>\n<p>Mod\u00fcller, olu\u015fturduklar\u0131 kaynaklar\u0131n belirli \u00f6zelliklerini d\u0131\u015far\u0131ya a\u00e7abilir. Bu \u00e7\u0131kt\u0131lar, mod\u00fcl\u00fc \u00e7a\u011f\u0131ran ana yap\u0131land\u0131rma veya di\u011fer mod\u00fcller taraf\u0131ndan kullan\u0131labilir.<\/p>\n<pre><code class=\"language-terraform\"># outputs.tf\noutput \"instance_id\" {\n  description = \"The ID of the EC2 instance\"\n  value       = aws_instance.example.id\n}\n\noutput \"public_ip\" {\n  description = \"The public IP address of the EC2 instance\"\n  value       = aws_instance.example.public_ip\n}<\/code><\/pre>\n<p>Bu \u00e7\u0131kt\u0131lara ana yap\u0131land\u0131rmada a\u015fa\u011f\u0131daki gibi eri\u015filebilir:<\/p>\n<pre><code class=\"language-terraform\"># main.tf (ana yap\u0131land\u0131rmada)\nresource \"aws_eip\" \"example\" {\n  instance = module.web_server.instance_id\n  vpc      = true\n}\n\noutput \"web_server_ip\" {\n  value = module.web_server.public_ip\n}<\/code><\/pre>\n<h4>Yerel Mod\u00fcller<\/h4>\n<p>Yerel mod\u00fcller, ana yap\u0131land\u0131rma dosyas\u0131 ile ayn\u0131 Terraform projesi i\u00e7inde, genellikle <code>modules\/<\/code> dizini alt\u0131nda bulunan mod\u00fcllerdir. Bunlar, projenin belirli bir b\u00f6l\u00fcm\u00fcn\u00fc d\u00fczenlemek veya ayn\u0131 proje i\u00e7inde birden fazla kez kullan\u0131lacak bile\u015fenleri gruplamak i\u00e7in idealdir.<\/p>\n<pre><code class=\"language-terraform\">module \"my_local_module\" {\n  source = \".\/modules\/my_custom_resource\"\n  # ... de\u011fi\u015fkenler ...\n}<\/code><\/pre>\n<h4>Uzak Mod\u00fcller<\/h4>\n<p>Uzak mod\u00fcller, harici bir kaynaktan (Git deposu, S3 kovas\u0131, Terraform Registry) \u00e7a\u011fr\u0131lan mod\u00fcllerdir. Bu, mod\u00fcllerin farkl\u0131 projeler veya ekipler aras\u0131nda payla\u015f\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>*   <strong>Git Depolar\u0131:<\/strong><\/p>\n<pre><code class=\"language-terraform\">module \"vpc\" {\n      source = \"git::https:\/\/github.com\/my-org\/terraform-aws-vpc.git?ref=v1.2.0\"\n      # ... de\u011fi\u015fkenler ...\n    }<\/code><\/pre>\n<p>    Burada <code>ref=v1.2.0<\/code> etiketi, mod\u00fcl\u00fcn belirli bir s\u00fcr\u00fcm\u00fcn\u00fc kullanmay\u0131 sa\u011flar, bu da s\u00fcr\u00fcm kontrol\u00fc ve tutarl\u0131l\u0131k i\u00e7in kritik \u00f6neme sahiptir.<br \/>\n*   <strong>Terraform Registry:<\/strong> HashiCorp Terraform Registry, hem halka a\u00e7\u0131k hem de \u00f6zel mod\u00fcller i\u00e7in bir depolama ve ke\u015fif platformudur. Bu, topluluk taraf\u0131ndan olu\u015fturulmu\u015f veya kurulu\u015funuz i\u00e7inde dahili olarak geli\u015ftirilmi\u015f mod\u00fclleri kolayca bulman\u0131z\u0131 ve kullanman\u0131z\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-terraform\">module \"s3_bucket\" {\n      source  = \"terraform-aws-modules\/s3-bucket\/aws\"\n      version = \"3.1.0\"\n      # ... de\u011fi\u015fkenler ...\n    }<\/code><\/pre>\n<p>    Registry kullan\u0131m\u0131, mod\u00fcl s\u00fcr\u00fcmlerinin y\u00f6netilmesini ve mod\u00fcl belgelemesinin otomatik olarak sunulmas\u0131n\u0131 basitle\u015ftirir.<\/p>\n<h3>Mod\u00fcl Tasar\u0131m Prensipleri<\/h3>\n<p>Etkili ve yeniden kullan\u0131labilir Terraform mod\u00fclleri olu\u015fturmak i\u00e7in baz\u0131 temel tasar\u0131m prensiplerine uymak \u00f6nemlidir:<\/p>\n<h4>Soyutlama ve Kaps\u00fclleme<\/h4>\n<p>Mod\u00fcller, altyap\u0131n\u0131n karma\u015f\u0131k detaylar\u0131n\u0131 soyutlamal\u0131 ve kullan\u0131c\u0131dan gizlemelidir. Mod\u00fcl\u00fcn i\u00e7 i\u015fleyi\u015fi, d\u0131\u015far\u0131dan sadece tan\u0131mlanm\u0131\u015f giri\u015fler ve \u00e7\u0131kt\u0131lar arac\u0131l\u0131\u011f\u0131yla etkile\u015fime girilerek de\u011fi\u015ftirilmelidir. Bu, mod\u00fcl kullan\u0131c\u0131lar\u0131n\u0131n sadece mod\u00fcl\u00fcn ne yapt\u0131\u011f\u0131n\u0131 bilmesi gerekti\u011fi, nas\u0131l yapt\u0131\u011f\u0131n\u0131 bilmesine gerek olmad\u0131\u011f\u0131 anlam\u0131na gelir. \u00d6rne\u011fin, bir veritaban\u0131 mod\u00fcl\u00fc, veritaban\u0131n\u0131n kendisi, yedekleme mekanizmalar\u0131, replikasyon ayarlar\u0131 ve g\u00fcvenlik gruplar\u0131 gibi bir\u00e7ok kayna\u011f\u0131 i\u00e7erebilir. Kullan\u0131c\u0131n\u0131n sadece veritaban\u0131 t\u00fcr\u00fcn\u00fc, boyutunu ve ad\u0131n\u0131 belirtmesi yeterli olmal\u0131d\u0131r.<\/p>\n<h4>Parametrelendirme<\/h4>\n<p>Mod\u00fcller, m\u00fcmk\u00fcn oldu\u011funca esnek olacak \u015fekilde tasarlanmal\u0131d\u0131r. Bu, her senaryoya uyum sa\u011flayabilmeleri i\u00e7in geni\u015f bir parametre yelpazesi sunmalar\u0131 gerekti\u011fi anlam\u0131na gelir. Ancak, a\u015f\u0131r\u0131 parametrelendirme de mod\u00fcl\u00fc karma\u015f\u0131k hale getirebilir. \u0130yi bir denge bulmak \u00f6nemlidir: kritik yap\u0131land\u0131rma se\u00e7eneklerini de\u011fi\u015fken olarak sunarken, daha az \u00f6nemli veya standart se\u00e7enekler i\u00e7in makul varsay\u0131lan de\u011ferler belirleyin.<\/p>\n<h4>S\u00fcr\u00fcm Kontrol\u00fc<\/h4>\n<p>Mod\u00fcller, bir s\u00fcr\u00fcm kontrol sistemi (Git gibi) alt\u0131nda y\u00f6netilmelidir. Bu, mod\u00fcl\u00fcn ge\u00e7mi\u015fini takip etmeyi, de\u011fi\u015fiklikleri geri almay\u0131 ve belirli s\u00fcr\u00fcmleri kullanmay\u0131 m\u00fcmk\u00fcn k\u0131lar. Mod\u00fcl\u00fcn her \u00f6nemli de\u011fi\u015fikli\u011fi i\u00e7in yeni bir s\u00fcr\u00fcm etiketi (tag) olu\u015fturmak, kullan\u0131c\u0131lar\u0131n istikrarl\u0131 ve test edilmi\u015f bir s\u00fcr\u00fcm\u00fc hedeflemesini sa\u011flar.<\/p>\n<h4>Belgeleme<\/h4>\n<p>\u0130yi belgelenmi\u015f mod\u00fcller, ba\u015fkalar\u0131 taraf\u0131ndan kolayca ke\u015ffedilebilir ve kullan\u0131labilir. Her mod\u00fcl\u00fcn k\u00f6k dizininde bir <code>README.md<\/code> dosyas\u0131 bulunmal\u0131d\u0131r. Bu dosya \u015funlar\u0131 i\u00e7ermelidir:<\/p>\n<p>*   Mod\u00fcl\u00fcn amac\u0131 ve ne yapt\u0131\u011f\u0131na dair k\u0131sa bir a\u00e7\u0131klama.<br \/>\n*   Gerekli giri\u015f de\u011fi\u015fkenleri, t\u00fcrleri, varsay\u0131lan de\u011ferleri ve a\u00e7\u0131klamalar\u0131.<br \/>\n*   Sa\u011flad\u0131\u011f\u0131 \u00e7\u0131kt\u0131 de\u011ferleri ve a\u00e7\u0131klamalar\u0131.<br \/>\n*   \u00d6rnek kullan\u0131m senaryolar\u0131.<br \/>\n*   Gereksinimler (Terraform s\u00fcr\u00fcm\u00fc, sa\u011flay\u0131c\u0131lar).<br \/>\n*   Bak\u0131mc\u0131 bilgileri.<\/p>\n<h3>Terraform \u015eablonlar\u0131 Nedir?<\/h3>\n<p>Terraform \u015fablonlar\u0131, dinamik i\u00e7erik olu\u015fturmak i\u00e7in kullan\u0131lan mekanizmalard\u0131r. Genellikle, bir sunucuya ba\u015flang\u0131\u00e7ta \u00e7al\u0131\u015ft\u0131r\u0131lacak betikler (user data), yap\u0131land\u0131rma dosyalar\u0131 veya di\u011fer dinamik metin tabanl\u0131 i\u00e7erikleri olu\u015fturmak i\u00e7in kullan\u0131l\u0131rlar. Terraform, HCL (HashiCorp Configuration Language) i\u00e7inde g\u00f6m\u00fcl\u00fc olarak \u00e7e\u015fitli \u015fablonlama yetenekleri sunar.<\/p>\n<p>\u00d6nceden, Terraform&#8217;da <code>template_file<\/code> veri kayna\u011f\u0131 kullan\u0131l\u0131yordu, ancak bu art\u0131k kullan\u0131mdan kald\u0131r\u0131lm\u0131\u015f ve yerine <code>templatefile<\/code> fonksiyonu \u00f6nerilmektedir.<\/p>\n<h4><code>templatefile<\/code> Fonksiyonu<\/h4>\n<p><code>templatefile<\/code> fonksiyonu, bir \u015fablon dosyas\u0131n\u0131 okur ve verilen de\u011fi\u015fkenlerle i\u015fleyerek dinamik bir dize d\u00f6nd\u00fcr\u00fcr. Bu fonksiyon, herhangi bir Terraform ifadesi i\u00e7inde kullan\u0131labilir.<\/p>\n<p><strong>\u00d6rnek \u015eablon Dosyas\u0131 (<code>user-data.sh.tpl<\/code>):<\/strong><\/p>\n<pre><code class=\"language-bash\">#!\/bin\/bash\nsudo apt-get update -y\nsudo apt-get install -y nginx\nsudo systemctl start nginx\necho \"Hello from ${instance_name} in ${environment}!\" | sudo tee \/var\/www\/html\/index.html<\/code><\/pre>\n<p><strong>Terraform Yap\u0131land\u0131rmas\u0131nda Kullan\u0131m\u0131:<\/strong><\/p>\n<pre><code class=\"language-terraform\"># main.tf\nresource \"aws_instance\" \"web\" {\n  ami           = var.ami_id\n  instance_type = var.instance_type\n  user_data     = templatefile(\"${path.module}\/user-data.sh.tpl\", {\n    instance_name = \"MyWebApp\"\n    environment   = \"production\"\n  })\n\n  tags = {\n    Name = \"Web Server\"\n  }\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte:<br \/>\n*   <code>templatefile<\/code> fonksiyonu, <code>user-data.sh.tpl<\/code> dosyas\u0131n\u0131 okur.<br \/>\n*   <code>instance_name<\/code> ve <code>environment<\/code> de\u011fi\u015fkenleri, \u015fablon i\u00e7inde <code>${variable_name}<\/code> syntax&#8217;\u0131 ile referans al\u0131n\u0131r.<br \/>\n*   <code>path.module<\/code> ifadesi, i\u00e7inde bulunulan mod\u00fcl\u00fcn dizin yolunu belirtir, bu da \u015fablon dosyas\u0131n\u0131n konumunu dinamik olarak bulmaya yard\u0131mc\u0131 olur.<\/p>\n<h4>Kullan\u0131m Senaryolar\u0131<\/h4>\n<p>*   <strong>User Data (Kullan\u0131c\u0131 Verileri):<\/strong> EC2 veya di\u011fer VM&#8217;lerin ilk ba\u015flat\u0131l\u0131\u015f\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131lacak betikleri dinamik olarak olu\u015fturmak i\u00e7in en yayg\u0131n kullan\u0131m alan\u0131d\u0131r. Bu betikler, yaz\u0131l\u0131m kurulumu, yap\u0131land\u0131rma veya ba\u015flang\u0131\u00e7 ayarlar\u0131n\u0131 i\u00e7erebilir.<br \/>\n*   <strong>Yap\u0131land\u0131rma Dosyalar\u0131:<\/strong> Uygulama sunucular\u0131 (Nginx, Apache), veritabanlar\u0131 veya di\u011fer hizmetler i\u00e7in dinamik yap\u0131land\u0131rma dosyalar\u0131 olu\u015fturmak. \u00d6rne\u011fin, bir veritaban\u0131 ba\u011flant\u0131 dizesi veya API anahtar\u0131 gibi hassas bilgileri \u015fablonlar arac\u0131l\u0131\u011f\u0131yla enjekte etmek.<br \/>\n*   <strong>Dinamik Betikler:<\/strong> Belirli ko\u015fullara veya giri\u015flere g\u00f6re de\u011fi\u015fen, karma\u015f\u0131k komut dosyalar\u0131 olu\u015fturmak.<\/p>\n<h3>Mod\u00fcller ve \u015eablonlar Birlikte Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h3>\n<p>Mod\u00fcller ve \u015fablonlar, yeniden kullan\u0131labilir altyap\u0131 olu\u015fturmada birbirlerini tamamlayan ara\u00e7lard\u0131r. Bir mod\u00fcl, genel bir altyap\u0131 bile\u015fenini (\u00f6rne\u011fin, bir web sunucusu) tan\u0131mlarken, \u015fablonlar bu bile\u015fenin dinamik olarak \u00f6zelle\u015ftirilmesi gereken k\u0131s\u0131mlar\u0131n\u0131 (\u00f6rne\u011fin, web sunucusunun ba\u015flang\u0131\u00e7 beti\u011fi) sa\u011flar.<\/p>\n<h4>\u00d6rnek Senaryo: Dinamik Kullan\u0131c\u0131 Verileri ile EC2 \u00d6rne\u011fi<\/h4>\n<p>Bir web sunucusu mod\u00fcl\u00fc olu\u015fturdu\u011fumuzu ve bu mod\u00fcl\u00fcn, EC2 \u00f6rne\u011finin <code>user_data<\/code> alan\u0131n\u0131 kullanarak bir web sunucusunu otomatik olarak yap\u0131land\u0131rmas\u0131n\u0131 istedi\u011fimizi varsayal\u0131m. <code>user_data<\/code> i\u00e7eri\u011fi, da\u011f\u0131t\u0131lan ortama (geli\u015ftirme, \u00fcretim) veya uygulaman\u0131n ad\u0131na g\u00f6re de\u011fi\u015febilir.<\/p>\n<p><strong>Mod\u00fcl Dizini (<code>modules\/web-server-instance<\/code>):<\/strong><\/p>\n<pre><code class=\"language-\">modules\/web-server-instance\/\n\u251c\u2500\u2500 main.tf\n\u251c\u2500\u2500 variables.tf\n\u251c\u2500\u2500 outputs.tf\n\u2514\u2500\u2500 templates\/\n    \u2514\u2500\u2500 user-data.sh.tpl<\/code><\/pre>\n<p><strong><code>modules\/web-server-instance\/variables.tf<\/code>:<\/strong><\/p>\n<pre><code class=\"language-terraform\">variable \"ami_id\" {\n  description = \"The AMI ID for the EC2 instance.\"\n  type        = string\n}\n\nvariable \"instance_type\" {\n  description = \"The EC2 instance type.\"\n  type        = string\n  default     = \"t2.micro\"\n}\n\nvariable \"app_name\" {\n  description = \"Name of the application running on this server.\"\n  type        = string\n}\n\nvariable \"environment\" {\n  description = \"Deployment environment (e.g., dev, prod).\"\n  type        = string\n}\n\nvariable \"additional_packages\" {\n  description = \"List of additional packages to install.\"\n  type        = list(string)\n  default     = []\n}<\/code><\/pre>\n<p><strong><code>modules\/web-server-instance\/main.tf<\/code>:<\/strong><\/p>\n<pre><code class=\"language-terraform\">resource \"aws_instance\" \"web\" {\n  ami           = var.ami_id\n  instance_type = var.instance_type\n\n  user_data = templatefile(\"${path.module}\/templates\/user-data.sh.tpl\", {\n    app_name            = var.app_name\n    environment         = var.environment\n    additional_packages = var.additional_packages\n  })\n\n  tags = {\n    Name        = \"${var.app_name}-${var.environment}-web\"\n    Environment = var.environment\n  }\n}\n\noutput \"instance_public_ip\" {\n  description = \"Public IP address of the web server instance.\"\n  value       = aws_instance.web.public_ip\n}<\/code><\/pre>\n<p><strong><code>modules\/web-server-instance\/templates\/user-data.sh.tpl<\/code>:<\/strong><\/p>\n<pre><code class=\"language-bash\">#!\/bin\/bash\nsudo apt-get update -y\nsudo apt-get install -y nginx\n%{~ for pkg in additional_packages ~}\nsudo apt-get install -y ${pkg}\n%{~ endfor ~}\nsudo systemctl start nginx\necho \"Welcome to ${app_name} in ${environment}!\" | sudo tee \/var\/www\/html\/index.html<\/code><\/pre>\n<p>Yukar\u0131daki \u015fablonda, Terraform&#8217;un \u015fablonlama dilinin d\u00f6ng\u00fc (<code>for<\/code>) ve ko\u015fullu (<code>if<\/code>) ifadeleri gibi geli\u015fmi\u015f \u00f6zelliklerini kulland\u0131k. Bu sayede, <code>additional_packages<\/code> listesindeki her paket i\u00e7in dinamik olarak <code>apt-get install<\/code> komutu eklenecektir.<\/p>\n<p><strong>Ana Yap\u0131land\u0131rma (<code>root\/main.tf<\/code>):<\/strong><\/p>\n<pre><code class=\"language-terraform\"># root\/main.tf\nprovider \"aws\" {\n  region = \"eu-central-1\"\n}\n\nvariable \"aws_ami_id\" {\n  description = \"AWS AMI ID for Ubuntu 20.04 LTS\"\n  type        = string\n  default     = \"ami-08d4885777176166e\" # \u00d6rnek AMI ID\n}\n\nmodule \"dev_web_server\" {\n  source              = \".\/modules\/web-server-instance\"\n  ami_id              = var.aws_ami_id\n  instance_type       = \"t2.micro\"\n  app_name            = \"MyBlog\"\n  environment         = \"development\"\n  additional_packages = [\"git\", \"apache2-utils\"]\n}\n\nmodule \"prod_web_server\" {\n  source              = \".\/modules\/web-server-instance\"\n  ami_id              = var.aws_ami_id\n  instance_type       = \"t3.medium\"\n  app_name            = \"MyBlog\"\n  environment         = \"production\"\n  additional_packages = [\"fail2ban\", \"apache2-utils\"]\n}\n\noutput \"dev_web_server_ip\" {\n  value = module.dev_web_server.instance_public_ip\n}\n\noutput \"prod_web_server_ip\" {\n  value = module.prod_web_server.instance_public_ip\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>web-server-instance<\/code> mod\u00fcl\u00fc iki farkl\u0131 ortam (geli\u015ftirme ve \u00fcretim) i\u00e7in iki kez \u00e7a\u011fr\u0131l\u0131yor. Her \u00e7a\u011fr\u0131da, mod\u00fcl\u00fcn <code>app_name<\/code>, <code>environment<\/code> ve <code>additional_packages<\/code> de\u011fi\u015fkenleri farkl\u0131 de\u011ferler al\u0131yor. Mod\u00fcl i\u00e7indeki <code>user_data<\/code> \u015fablonu, bu de\u011fi\u015fkenleri kullanarak her bir EC2 \u00f6rne\u011fi i\u00e7in \u00f6zel bir ba\u015flang\u0131\u00e7 beti\u011fi olu\u015fturuyor. Bu, altyap\u0131 da\u011f\u0131t\u0131mlar\u0131nda tutarl\u0131l\u0131k sa\u011flarken ayn\u0131 zamanda gerekli esnekli\u011fi de sunar.<\/p>\n<h3>En \u0130yi Uygulamalar<\/h3>\n<p>Terraform mod\u00fclleri ve \u015fablonlar\u0131n\u0131 kullan\u0131rken, verimlili\u011fi ve s\u00fcrd\u00fcr\u00fclebilirli\u011fi art\u0131rmak i\u00e7in baz\u0131 en iyi uygulamalar\u0131 takip etmek \u00f6nemlidir:<\/p>\n<h4>Mod\u00fcl Dizini Yap\u0131s\u0131<\/h4>\n<p>Mod\u00fcl dizini yap\u0131s\u0131, mod\u00fcllerin anla\u015f\u0131labilir ve y\u00f6netilebilir olmas\u0131n\u0131 sa\u011flamal\u0131d\u0131r. Tutarl\u0131 bir yap\u0131, yeni geli\u015ftiricilerin projeye dahil olmas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r. \u00d6nerilen yap\u0131:<\/p>\n<pre><code class=\"language-\">.\n\u251c\u2500\u2500 modules\/\n\u2502   \u251c\u2500\u2500 vpc\/\n\u2502   \u2502   \u251c\u2500\u2500 main.tf\n\u2502   \u2502   \u251c\u2500\u2500 variables.tf\n\u2502   \u2502   \u251c\u2500\u2500 outputs.tf\n\u2502   \u2502   \u251c\u2500\u2500 versions.tf\n\u2502   \u2502   \u2514\u2500\u2500 README.md\n\u2502   \u251c\u2500\u2500 ec2-instance\/\n\u2502   \u2502   \u251c\u2500\u2500 main.tf\n\u2502   \u2502   \u251c\u2500\u2500 variables.tf\n\u2502   \u2502   \u251c\u2500\u2500 outputs.tf\n\u2502   \u2502   \u251c\u2500\u2500 templates\/\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 user-data.sh.tpl\n\u2502   \u2502   \u2514\u2500\u2500 README.md\n\u2502   \u2514\u2500\u2500 rds-database\/\n\u2502       \u2514\u2500\u2500 ...\n\u251c\u2500\u2500 environments\/\n\u2502   \u251c\u2500\u2500 dev\/\n\u2502   \u2502   \u251c\u2500\u2500 main.tf\n\u2502   \u2502   \u2514\u2500\u2500 variables.tf\n\u2502   \u251c\u2500\u2500 prod\/\n\u2502   \u2502   \u251c\u2500\u2500 main.tf\n\u2502   \u2502   \u2514\u2500\u2500 variables.tf\n\u2502   \u2514\u2500\u2500 test\/\n\u2502       \u2514\u2500\u2500 ...\n\u2514\u2500\u2500 README.md<\/code><\/pre>\n<p>Bu yap\u0131, mod\u00fclleri ayr\u0131 tutar ve her ortam\u0131n kendi mod\u00fcl \u00e7a\u011fr\u0131lar\u0131n\u0131 ve yap\u0131land\u0131rmalar\u0131n\u0131 i\u00e7ermesine olanak tan\u0131r.<\/p>\n<h4>Ortak Mod\u00fcl K\u00fct\u00fcphanesi<\/h4>\n<p>Kurulu\u015funuz i\u00e7inde tekrar tekrar kullan\u0131lacak mod\u00fclleri merkezi bir Git deposunda veya \u00f6zel bir Terraform Registry&#8217;de tutun. Bu, mod\u00fcl ke\u015ffini kolayla\u015ft\u0131r\u0131r, s\u00fcr\u00fcm kontrol\u00fcn\u00fc merkezile\u015ftirir ve ekipler aras\u0131 tutarl\u0131l\u0131\u011f\u0131 sa\u011flar. Her mod\u00fcl, kendi s\u00fcr\u00fcm etiketleriyle (\u00f6rne\u011fin, <code>v1.0.0<\/code>) yay\u0131nlanmal\u0131d\u0131r.<\/p>\n<h4>Test Etme<\/h4>\n<p>Mod\u00fcllerin g\u00fcvenilir oldu\u011fundan emin olmak i\u00e7in kapsaml\u0131 bir \u015fekilde test edilmeleri gerekir.<br \/>\n*   <strong><code>terraform validate<\/code><\/strong>: Yap\u0131land\u0131rma s\u00f6zdizimini kontrol eder.<br \/>\n*   <strong><code>terraform plan<\/code><\/strong>: Ger\u00e7ek de\u011fi\u015fiklikleri uygulamadan \u00f6nce ne olaca\u011f\u0131n\u0131 g\u00f6sterir.<br \/>\n*   <strong>Linting (TFLint):<\/strong> Kod kalitesi ve stil denetimi yapar.<br \/>\n*   <strong>Entegrasyon Testleri (Terratest):<\/strong> Ger\u00e7ek kaynaklar\u0131 da\u011f\u0131tarak ve beklenen davran\u0131\u015flar\u0131 do\u011frulayarak u\u00e7tan uca testler yapar. Bu, mod\u00fcl\u00fcn beklenen \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 garanti eder.<\/p>\n<h4>CI\/CD Entegrasyonu<\/h4>\n<p>Mod\u00fcl geli\u015ftirme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini otomatikle\u015ftirin. CI\/CD (S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m) boru hatlar\u0131, mod\u00fcllerin her de\u011fi\u015fikli\u011finde otomatik olarak test edilmesini, do\u011frulanmas\u0131n\u0131 ve hatta yeni s\u00fcr\u00fcmlerinin yay\u0131nlanmas\u0131n\u0131 sa\u011flayabilir. Bu, hatalar\u0131 erken yakalar ve da\u011f\u0131t\u0131m h\u0131z\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<h4>Terraform Registry Kullan\u0131m\u0131<\/h4>\n<p>Hem halka a\u00e7\u0131k hem de \u00f6zel Terraform Registry&#8217;ler, mod\u00fclleri payla\u015fmak ve y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc ara\u00e7lard\u0131r. Halka a\u00e7\u0131k Registry, topluluk mod\u00fcllerini ke\u015ffetmek ve kullanmak i\u00e7in harikad\u0131r. \u00d6zel Registry ise, kurulu\u015funuzun kendi dahili mod\u00fcl k\u00fct\u00fcphanesini olu\u015fturmak ve y\u00f6netmek i\u00e7in idealdir. Bu, mod\u00fcl s\u00fcr\u00fcmlerinin y\u00f6netilmesini ve mod\u00fcl belgelemesinin otomatik olarak sunulmas\u0131n\u0131 basitle\u015ftirir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Terraform mod\u00fclleri ve \u015fablonlar\u0131, altyap\u0131y\u0131 kod olarak y\u00f6netme (IaC) prati\u011finin temel ta\u015flar\u0131d\u0131r. Bu ara\u00e7lar, karma\u015f\u0131k altyap\u0131 yap\u0131land\u0131rmalar\u0131n\u0131 daha k\u00fc\u00e7\u00fck, y\u00f6netilebilir ve yeniden kullan\u0131labilir par\u00e7alara ay\u0131rarak IaC&#8217;nin sundu\u011fu avantajlar\u0131 en \u00fcst d\u00fczeye \u00e7\u0131kar\u0131r. Mod\u00fcller, altyap\u0131 bile\u015fenlerini soyutlayarak ve parametrele\u015ftirerek tutarl\u0131l\u0131k, h\u0131z ve ekip i\u015fbirli\u011fi sa\u011flarken, \u015fablonlar dinamik i\u00e7erik olu\u015fturma yetene\u011fiyle altyap\u0131n\u0131n \u00f6zelle\u015ftirilmesini kolayla\u015ft\u0131r\u0131r.<\/p>\n<p>\u0130yi tasarlanm\u0131\u015f, belgelenmi\u015f ve test edilmi\u015f mod\u00fcller, kurulu\u015flar\u0131n altyap\u0131 da\u011f\u0131t\u0131mlar\u0131n\u0131 standartla\u015ft\u0131rmas\u0131na, hatalar\u0131 azaltmas\u0131na ve operasyonel verimlili\u011fi art\u0131rmas\u0131na olanak tan\u0131r. Mod\u00fcller ve \u015fablonlar birlikte kullan\u0131ld\u0131\u011f\u0131nda, dinamik ve esnek altyap\u0131 \u00e7\u00f6z\u00fcmleri olu\u015fturmak i\u00e7in g\u00fc\u00e7l\u00fc bir sinerji yarat\u0131rlar. Bu makalede a\u00e7\u0131klanan prensipleri ve en iyi uygulamalar\u0131 takip ederek, ekipler daha s\u00fcrd\u00fcr\u00fclebilir, \u00f6l\u00e7eklenebilir ve g\u00fcvenilir altyap\u0131 ortamlar\u0131 in\u015fa edebilirler. Gelecekteki altyap\u0131 projelerinizde bu ara\u00e7lar\u0131 etkin bir \u015fekilde kullanarak, IaC yolculu\u011funuzda \u00f6nemli bir ad\u0131m atm\u0131\u015f olacaks\u0131n\u0131z.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Terraform Mod\u00fclleri ve \u015eablonlar\u0131 ile Yeniden Kullan\u0131labilir Altyap\u0131 Olu\u015fturma\nGiri\u015f\nModern yaz\u0131l\u0131m geli\u015ftirme ve operasyon s\u00fcre\u00e7lerinde","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-31774","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 Mod\u00fclleri ve \u015eablonlar\u0131 ile Yeniden Kullan\u0131labilir Altyap\u0131 Olu\u015fturma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\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-modulleri-ve-sablonlari-ile-yeniden-kullanilabilir-altyapi-olusturma\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Terraform Mod\u00fclleri ve \u015eablonlar\u0131 ile Yeniden Kullan\u0131labilir Altyap\u0131 Olu\u015fturma\" \/>\n<meta property=\"og:description\" content=\"Terraform Mod\u00fclleri ve \u015eablonlar\u0131 ile Yeniden Kullan\u0131labilir Altyap\u0131 Olu\u015fturma Giri\u015f Modern yaz\u0131l\u0131m geli\u015ftirme ve operasyon s\u00fcre\u00e7lerinde\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/terraform-modulleri-ve-sablonlari-ile-yeniden-kullanilabilir-altyapi-olusturma\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-13T18:41:11+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=\"16 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-modulleri-ve-sablonlari-ile-yeniden-kullanilabilir-altyapi-olusturma\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-modulleri-ve-sablonlari-ile-yeniden-kullanilabilir-altyapi-olusturma\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Terraform Mod\u00fclleri ve \u015eablonlar\u0131 ile Yeniden Kullan\u0131labilir Altyap\u0131 Olu\u015fturma\",\"datePublished\":\"2025-10-13T18:41:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-modulleri-ve-sablonlari-ile-yeniden-kullanilabilir-altyapi-olusturma\/\"},\"wordCount\":2586,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/terraform-modulleri-ve-sablonlari-ile-yeniden-kullanilabilir-altyapi-olusturma\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-modulleri-ve-sablonlari-ile-yeniden-kullanilabilir-altyapi-olusturma\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/terraform-modulleri-ve-sablonlari-ile-yeniden-kullanilabilir-altyapi-olusturma\/\",\"name\":\"Terraform Mod\u00fclleri ve \u015eablonlar\u0131 ile Yeniden Kullan\u0131labilir Altyap\u0131 Olu\u015fturma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-13T18:41:11+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-modulleri-ve-sablonlari-ile-yeniden-kullanilabilir-altyapi-olusturma\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/terraform-modulleri-ve-sablonlari-ile-yeniden-kullanilabilir-altyapi-olusturma\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-modulleri-ve-sablonlari-ile-yeniden-kullanilabilir-altyapi-olusturma\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Terraform Mod\u00fclleri ve \u015eablonlar\u0131 ile Yeniden Kullan\u0131labilir Altyap\u0131 Olu\u015fturma\"}]},{\"@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 Mod\u00fclleri ve \u015eablonlar\u0131 ile Yeniden Kullan\u0131labilir Altyap\u0131 Olu\u015fturma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","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-modulleri-ve-sablonlari-ile-yeniden-kullanilabilir-altyapi-olusturma\/","og_locale":"tr_TR","og_type":"article","og_title":"Terraform Mod\u00fclleri ve \u015eablonlar\u0131 ile Yeniden Kullan\u0131labilir Altyap\u0131 Olu\u015fturma","og_description":"Terraform Mod\u00fclleri ve \u015eablonlar\u0131 ile Yeniden Kullan\u0131labilir Altyap\u0131 Olu\u015fturma Giri\u015f Modern yaz\u0131l\u0131m geli\u015ftirme ve operasyon s\u00fcre\u00e7lerinde","og_url":"https:\/\/fatihsoysal.com\/blog\/terraform-modulleri-ve-sablonlari-ile-yeniden-kullanilabilir-altyapi-olusturma\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-13T18:41:11+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"16 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/terraform-modulleri-ve-sablonlari-ile-yeniden-kullanilabilir-altyapi-olusturma\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/terraform-modulleri-ve-sablonlari-ile-yeniden-kullanilabilir-altyapi-olusturma\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Terraform Mod\u00fclleri ve \u015eablonlar\u0131 ile Yeniden Kullan\u0131labilir Altyap\u0131 Olu\u015fturma","datePublished":"2025-10-13T18:41:11+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/terraform-modulleri-ve-sablonlari-ile-yeniden-kullanilabilir-altyapi-olusturma\/"},"wordCount":2586,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/terraform-modulleri-ve-sablonlari-ile-yeniden-kullanilabilir-altyapi-olusturma\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/terraform-modulleri-ve-sablonlari-ile-yeniden-kullanilabilir-altyapi-olusturma\/","url":"https:\/\/fatihsoysal.com\/blog\/terraform-modulleri-ve-sablonlari-ile-yeniden-kullanilabilir-altyapi-olusturma\/","name":"Terraform Mod\u00fclleri ve \u015eablonlar\u0131 ile Yeniden Kullan\u0131labilir Altyap\u0131 Olu\u015fturma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-13T18:41:11+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/terraform-modulleri-ve-sablonlari-ile-yeniden-kullanilabilir-altyapi-olusturma\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/terraform-modulleri-ve-sablonlari-ile-yeniden-kullanilabilir-altyapi-olusturma\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/terraform-modulleri-ve-sablonlari-ile-yeniden-kullanilabilir-altyapi-olusturma\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Terraform Mod\u00fclleri ve \u015eablonlar\u0131 ile Yeniden Kullan\u0131labilir Altyap\u0131 Olu\u015fturma"}]},{"@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\/31774","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=31774"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31774\/revisions"}],"predecessor-version":[{"id":31775,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31774\/revisions\/31775"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31774"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31774"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31774"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}