{"id":36123,"date":"2025-12-08T16:01:12","date_gmt":"2025-12-08T13:01:12","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/terraform-temiz-proje-yapisi-en-iyi-uygulamalar-ve-stratejiler\/"},"modified":"2025-12-08T16:01:12","modified_gmt":"2025-12-08T13:01:12","slug":"terraform-temiz-proje-yapisi-en-iyi-uygulamalar-ve-stratejiler","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/terraform-temiz-proje-yapisi-en-iyi-uygulamalar-ve-stratejiler\/","title":{"rendered":"Terraform Temiz Proje Yap\u0131s\u0131: En \u0130yi Uygulamalar ve Stratejiler"},"content":{"rendered":"<p><body><\/p>\n<p>Da\u011f\u0131n\u0131k ve y\u00f6netimi zor bir altyap\u0131 kod taban\u0131yla bo\u011fu\u015fmak, geli\u015ftirme s\u00fcre\u00e7lerinizi yava\u015flatabilir, hatalara yol a\u00e7abilir ve ekip verimlili\u011fini d\u00fc\u015f\u00fcrebilir. Peki, karma\u015f\u0131k Terraform projelerinizi anla\u015f\u0131l\u0131r, s\u00fcrd\u00fcr\u00fclebilir ve \u00f6l\u00e7eklenebilir bir yap\u0131ya nas\u0131l d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz?<\/p>\n<p>Bulut altyap\u0131lar\u0131n\u0131n y\u00f6netimi, g\u00fcn\u00fcm\u00fcz teknoloji d\u00fcnyas\u0131n\u0131n vazge\u00e7ilmez bir par\u00e7as\u0131 haline gelmi\u015ftir. Infrastructure as Code (IaC) felsefesiyle bu y\u00f6netimi otomatikle\u015ftiren Terraform, sundu\u011fu esneklik ve geni\u015f ekosistem sayesinde pek \u00e7ok kurulu\u015f taraf\u0131ndan tercih edilmektedir. Ancak Terraform&#8217;un g\u00fcc\u00fc, do\u011fru bir proje yap\u0131s\u0131yla birle\u015fmedi\u011finde bir kabusa d\u00f6n\u00fc\u015febilir. Ba\u015flang\u0131\u00e7ta k\u00fc\u00e7\u00fck bir proje i\u00e7in tek bir <code>.tf<\/code> dosyas\u0131 yeterli gibi g\u00f6r\u00fcnse de, altyap\u0131n\u0131z b\u00fcy\u00fcd\u00fck\u00e7e bu yakla\u015f\u0131m s\u00fcrd\u00fcr\u00fclemez hale gelir. Bir AWS VPC&#8217;den EC2 \u00f6rneklerine, veritabanlar\u0131ndan depolama servislerine kadar geni\u015fleyen bir ekosistemde, t\u00fcm kaynaklar\u0131 tek bir yerde y\u00f6netmeye \u00e7al\u0131\u015fmak, &#8220;spagetti kod&#8221; olarak tabir edilen karma\u015f\u0131k ve anla\u015f\u0131lmas\u0131 g\u00fc\u00e7 bir yap\u0131 ortaya \u00e7\u0131kar\u0131r. Bu durum, yeni ekip \u00fcyelerinin projeye adaptasyonunu zorla\u015ft\u0131r\u0131r, hatalar\u0131n tespitini geciktirir ve en \u00f6nemlisi, altyap\u0131n\u0131zdaki de\u011fi\u015fikliklerin riskini art\u0131r\u0131r. Bir hatan\u0131n t\u00fcm sistemi \u00e7\u00f6kertme potansiyeli, temiz bir Terraform proje yap\u0131s\u0131n\u0131n ne kadar hayati oldu\u011funu g\u00f6zler \u00f6n\u00fcne serer. \u0130\u015fte bu noktada, iyi d\u00fc\u015f\u00fcn\u00fclm\u00fc\u015f bir Terraform dizin yap\u0131s\u0131, projenizin okunabilirli\u011fini, bak\u0131m\u0131n\u0131 ve \u00f6l\u00e7eklenebilirli\u011fini do\u011frudan etkiler. Bu sadece teknik bir tercih de\u011fil, ayn\u0131 zamanda ekip i\u015fbirli\u011fini art\u0131ran ve operasyonel verimlili\u011fi y\u00fckselten stratejik bir karard\u0131r. Temiz bir yap\u0131, kodunuzu daha mod\u00fcler hale getirir, yeniden kullan\u0131labilirli\u011fi art\u0131r\u0131r ve b\u00f6ylece daha h\u0131zl\u0131 ve g\u00fcvenilir da\u011f\u0131t\u0131mlar yapman\u0131za olanak tan\u0131r. Bir d\u00fc\u015f\u00fcn\u00fcn, yeni bir \u00f6zelli\u011fi devreye alman\u0131z veya mevcut bir servisi g\u00fcncellemeniz gerekti\u011finde, ilgili kod blo\u011funu an\u0131nda bulup g\u00fcvenle de\u011fi\u015fiklik yapabilmek ne kadar b\u00fcy\u00fck bir avantajd\u0131r. Aksi takdirde, her de\u011fi\u015fiklik bir &#8220;kumar&#8221; haline gelebilir ve &#8220;Acaba neyi bozaca\u011f\u0131m?&#8221; endi\u015fesiyle s\u00fcrekli y\u00fczle\u015fmek zorunda kal\u0131rs\u0131n\u0131z. Bu nedenle, projelerinizde en ba\u015f\u0131ndan itibaren temiz ve d\u00fczenli bir Terraform yap\u0131s\u0131 kurmak, gelecekteki ba\u015f a\u011fr\u0131lar\u0131n\u0131 engellemenin en etkili yoludur.<\/p>\n<h2 id=\"terraform-temel-kavramlari-nelerdir-ve-neden-bilmeliyiz\">Terraform Temel Kavramlar\u0131 Nelerdir ve Neden Bilmeliyiz?<\/h2>\n<p>Terraform&#8217;un temiz ve d\u00fczenli bir yap\u0131s\u0131n\u0131 anlamak i\u00e7in \u00f6ncelikle temel ta\u015flar\u0131n\u0131 kavramak \u015fartt\u0131r. Bu temel kavramlar, sadece Terraform&#8217;un nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 de\u011fil, ayn\u0131 zamanda neden belirli bir proje yap\u0131s\u0131na ihtiya\u00e7 duydu\u011fumuzu da a\u00e7\u0131klar. Terraform&#8217;u s\u0131f\u0131rdan \u00f6\u011frenen birisi i\u00e7in bu kavramlar, adeta bir yapbozun par\u00e7alar\u0131 gibidir ve her birinin do\u011fru yere oturdu\u011fundan emin olmal\u0131y\u0131z.<\/p>\n<ul>\n<li>\n        <strong>Providers (Sa\u011flay\u0131c\u0131lar):<\/strong> Terraform&#8217;un herhangi bir bulut veya SaaS platformu ile ileti\u015fim kurmas\u0131n\u0131 sa\u011flayan eklentilerdir. AWS, Azure, Google Cloud, Kubernetes gibi platformlar i\u00e7in ayr\u0131 sa\u011flay\u0131c\u0131lar bulunur. Projenizin ba\u015f\u0131nda hangi sa\u011flay\u0131c\u0131lar\u0131 kullanaca\u011f\u0131n\u0131z\u0131 belirtmeniz gerekir. Bu, Terraform&#8217;a hangi API&#8217;lerle konu\u015faca\u011f\u0131n\u0131 s\u00f6yler. \u00d6rne\u011fin, bir AWS sa\u011flay\u0131c\u0131s\u0131, Terraform&#8217;un AWS kaynaklar\u0131n\u0131 olu\u015fturmas\u0131na, de\u011fi\u015ftirmesine ve silmesine izin verir.\n    <\/li>\n<li>\n        <strong>Resources (Kaynaklar):<\/strong> Altyap\u0131n\u0131z\u0131n en temel yap\u0131 ta\u015flar\u0131d\u0131r. Sanal makineler, veritabanlar\u0131, depolama alanlar\u0131, a\u011f bile\u015fenleri gibi her \u015fey birer kaynakt\u0131r. Her kaynak, sa\u011flay\u0131c\u0131 taraf\u0131ndan tan\u0131mlan\u0131r ve belirli \u00f6zellikleri (boyut, b\u00f6lge, isim vb.) vard\u0131r. <code>aws_s3_bucket<\/code>, <code>azurerm_virtual_machine<\/code> gibi \u00f6rnekler bu kategoriye girer. Kaynaklar, Terraform&#8217;un as\u0131l i\u015fini yapt\u0131\u011f\u0131 yerdir.\n    <\/li>\n<li>\n        <strong>Variables (De\u011fi\u015fkenler):<\/strong> Terraform kodunuzu dinamikle\u015ftirmek ve yeniden kullan\u0131labilir hale getirmek i\u00e7in kullan\u0131l\u0131r. Ortamlar aras\u0131 farkl\u0131l\u0131klar\u0131 (\u00f6rne\u011fin, geli\u015ftirme ve \u00fcretim ortamlar\u0131 i\u00e7in farkl\u0131 sanal makine boyutlar\u0131) y\u00f6netmek i\u00e7in de\u011fi\u015fkenler idealdir. Ayr\u0131ca, hassas bilgileri (veritaban\u0131 \u015fifreleri gibi) do\u011frudan koda yazmak yerine de\u011fi\u015fkenler arac\u0131l\u0131\u011f\u0131yla iletmek g\u00fcvenlik a\u00e7\u0131s\u0131ndan \u00f6nemlidir. Bu, ayn\u0131 kodun farkl\u0131 senaryolara uyarlanmas\u0131na olanak tan\u0131r.\n    <\/li>\n<li>\n        <strong>Outputs (\u00c7\u0131kt\u0131lar):<\/strong> Terraform&#8217;un uygulad\u0131\u011f\u0131 de\u011fi\u015fiklikler sonucunda elde edilen de\u011ferleri d\u0131\u015far\u0131 aktarmak i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, olu\u015fturdu\u011funuz bir EC2 \u00f6rne\u011finin IP adresi veya bir veritaban\u0131n\u0131n ba\u011flant\u0131 dizgesi bir \u00e7\u0131kt\u0131 olarak tan\u0131mlanabilir. Bu \u00e7\u0131kt\u0131lar, ba\u015fka Terraform mod\u00fcllerinde veya di\u011fer otomasyon ara\u00e7lar\u0131nda kullan\u0131labilir. B\u00f6ylece, bir mod\u00fcl\u00fcn \u00fcretti\u011fi bilgiyi ba\u015fka bir mod\u00fcl kolayca t\u00fcketebilir.\n    <\/li>\n<li>\n        <strong>Modules (Mod\u00fcller):<\/strong> Terraform kodunu mant\u0131ksal birimlere ay\u0131rmak i\u00e7in kullan\u0131lan kapsay\u0131c\u0131lard\u0131r. Bir mod\u00fcl, birka\u00e7 kayna\u011f\u0131 bir araya getirerek belirli bir i\u015flevi (\u00f6rne\u011fin, bir web sunucusu altyap\u0131s\u0131 veya bir veritaban\u0131 k\u00fcmesi) soyutlayabilir. Mod\u00fcller, kodun yeniden kullan\u0131labilirli\u011fini art\u0131r\u0131r, karma\u015f\u0131kl\u0131\u011f\u0131 azalt\u0131r ve b\u00fcy\u00fck projelerin y\u00f6netimini kolayla\u015ft\u0131r\u0131r. Yerel mod\u00fcller (ayn\u0131 depo i\u00e7inde) veya uzak mod\u00fcller (Git reposu, Terraform Registry) \u015feklinde olabilirler. Mod\u00fcller, temiz bir proje yap\u0131s\u0131n\u0131n kalbidir.\n    <\/li>\n<li>\n        <strong>State (Durum):<\/strong> Terraform&#8217;un altyap\u0131n\u0131z\u0131n mevcut durumunu takip etti\u011fi bir dosyad\u0131r (varsay\u0131lan olarak <code>terraform.tfstate<\/code>). Bu dosya, Terraform&#8217;un hangi kaynaklar\u0131 y\u00f6netti\u011fini, bu kaynaklar\u0131n \u00f6zelliklerini ve sizin kodunuzla ger\u00e7ek altyap\u0131 aras\u0131ndaki e\u015fle\u015fmeyi i\u00e7erir. Durum dosyas\u0131 kritik \u00f6neme sahiptir ve genellikle uzak bir depoda (S3, Azure Blob Storage, GCS gibi) saklanarak ekip i\u015fbirli\u011fi ve veri g\u00fcvenli\u011fi sa\u011flan\u0131r. Uzak durum y\u00f6netimi, birden fazla geli\u015ftiricinin ayn\u0131 altyap\u0131 \u00fczerinde g\u00fcvenle \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar ve kazara \u00e7ak\u0131\u015fmalar\u0131 \u00f6nler.<\/li>\n<\/ul>\n<p>Bu temel kavramlar\u0131 anlamak, sadece Terraform kodunu yazman\u0131za de\u011fil, ayn\u0131 zamanda neden belirli bir proje yap\u0131s\u0131n\u0131n daha iyi oldu\u011funu, mod\u00fcllerin neden vazge\u00e7ilmez oldu\u011funu ve durum y\u00f6netiminin kritikli\u011fini kavraman\u0131za yard\u0131mc\u0131 olacakt\u0131r. Her bir kavram, daha \u00f6l\u00e7eklenebilir ve s\u00fcrd\u00fcr\u00fclebilir bir altyap\u0131 olu\u015fturman\u0131n bir ad\u0131m\u0131d\u0131r.<\/p>\n<h2 id=\"minimalist-bir-terraform-projesi-nasil-olusturulur\">Minimalist Bir Terraform Projesi Nas\u0131l Olu\u015fturulur?<\/h2>\n<p>Temiz bir Terraform proje yap\u0131s\u0131n\u0131n ilk ad\u0131m\u0131, temel dosya organizasyonunu do\u011fru kurmaktan ge\u00e7er. Yeni ba\u015flayanlar i\u00e7in karma\u015f\u0131k mod\u00fcl yap\u0131lar\u0131 veya \u00e7oklu ortam stratejileri yerine, basit ve anla\u015f\u0131l\u0131r bir yap\u0131 ile ba\u015flamak, \u00f6\u011frenme e\u011frisini d\u00fc\u015f\u00fcr\u00fcr ve ilk projelerinizi daha y\u00f6netilebilir k\u0131lar. Minimalist bir proje, genellikle ana kaynaklar\u0131, de\u011fi\u015fkenleri ve \u00e7\u0131kt\u0131lar\u0131 ayr\u0131 dosyalarda tan\u0131mlayarak net bir ayr\u0131m sa\u011flar. Bu yakla\u015f\u0131m, tek bir b\u00fcy\u00fck <code>.tf<\/code> dosyas\u0131na t\u00fcm kodu y\u0131\u011fmaktan \u00e7ok daha iyidir.<\/p>\n<p>\u0130\u015fte en temel dosya yap\u0131s\u0131 ve her bir dosyan\u0131n amac\u0131:<\/p>\n<ul>\n<li>\n        <strong><code>main.tf<\/code>:<\/strong> Bu dosya, projenizin ana kaynak tan\u0131mlamalar\u0131n\u0131 i\u00e7erir. Sa\u011flay\u0131c\u0131 (provider) konfig\u00fcrasyonu ve olu\u015fturmak istedi\u011finiz altyap\u0131 kaynaklar\u0131 (\u00f6rne\u011fin, bir S3 kovas\u0131, bir VPC veya bir veritaban\u0131) burada yer al\u0131r.\n    <\/li>\n<li>\n        <strong><code>variables.tf<\/code>:<\/strong> T\u00fcm giri\u015f de\u011fi\u015fkenlerinin tan\u0131mland\u0131\u011f\u0131 yerdir. Bu de\u011fi\u015fkenler, kodunuzu daha esnek hale getirir ve farkl\u0131 ortamlar veya kullan\u0131m senaryolar\u0131 i\u00e7in parametrelerin kolayca ayarlanmas\u0131n\u0131 sa\u011flar. De\u011fi\u015fkenlerin a\u00e7\u0131klamalar\u0131 ve varsay\u0131lan de\u011ferleri burada belirtilir.\n    <\/li>\n<li>\n        <strong><code>outputs.tf<\/code>:<\/strong> Terraform uyguland\u0131ktan sonra elde etmek istedi\u011finiz t\u00fcm \u00e7\u0131kt\u0131 de\u011ferlerini bar\u0131nd\u0131r\u0131r. Olu\u015fturulan kaynaklar\u0131n eri\u015fim u\u00e7 noktalar\u0131, kimlikleri veya di\u011fer \u00f6nemli bilgileri burada tan\u0131mlayarak, bu de\u011ferleri ba\u015fka sistemlerde veya mod\u00fcllerde kullanabilirsiniz.\n    <\/li>\n<li>\n        <strong><code>versions.tf<\/code>:<\/strong> Terraform CLI ve kullan\u0131lan sa\u011flay\u0131c\u0131lar\u0131n versiyon k\u0131s\u0131tlamalar\u0131n\u0131 i\u00e7erir. Bu, ekip \u00fcyeleri aras\u0131nda tutarl\u0131 bir geli\u015ftirme ortam\u0131 sa\u011flamak ve ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131n\u0131 \u00f6nlemek i\u00e7in \u00f6nemlidir. Ayr\u0131ca uzak durum (remote state) konfig\u00fcrasyonu da burada yer alabilir.\n    <\/li>\n<\/ul>\n<p>\u015eimdi, bu minimalist yap\u0131y\u0131 kullanarak AWS \u00fczerinde basit bir S3 kovas\u0131 olu\u015fturan bir \u00f6rne\u011fi inceleyelim:<\/p>\n<p><strong>Dizin Yap\u0131s\u0131:<\/strong><\/p>\n<pre><code class=\"language-bash\">\n.\n\u251c\u2500\u2500 main.tf\n\u251c\u2500\u2500 variables.tf\n\u251c\u2500\u2500 outputs.tf\n\u2514\u2500\u2500 versions.tf\n<\/pre>\n<p><\/code><\/p>\n<p><strong><code>versions.tf<\/code> i\u00e7eri\u011fi:<\/strong><\/p>\n<pre><code class=\"language-hcl\">\nterraform {\n  required_version = \"~> 1.0\"\n  required_providers {\n    aws = {\n      source  = \"hashicorp\/aws\"\n      version = \"~> 4.0\"\n    }\n  }\n\n  backend \"s3\" {\n    bucket = \"my-terraform-state-bucket-12345\" # Kendi benzersiz kova ad\u0131n\u0131z\u0131 kullan\u0131n\n    key    = \"dev\/s3-bucket\/terraform.tfstate\"\n    region = \"us-east-1\"\n    encrypt = true\n  }\n}\n\nprovider \"aws\" {\n  region = \"us-east-1\"\n}\n<\/pre>\n<p><\/code><\/p>\n<div class=\"expert-tip\">\n  Uzak durum (remote state) konfig\u00fcrasyonu, \u00f6zellikle tak\u0131m ortamlar\u0131nda kritik \u00f6neme sahiptir. Terraform durum dosyas\u0131n\u0131n S3 gibi g\u00fcvenli ve s\u00fcr\u00fcm\u00fc tutulan bir yerde saklanmas\u0131, veri kayb\u0131n\u0131 \u00f6nler ve paralel de\u011fi\u015fikliklerde \u00e7ak\u0131\u015fmalar\u0131 engeller. Ayr\u0131ca, durum dosyan\u0131z\u0131 \u015fifrelemeyi asla unutmay\u0131n!\n<\/div>\n<p><strong><code>variables.tf<\/code> i\u00e7eri\u011fi:<\/strong><\/p>\n<pre><code class=\"language-hcl\">\nvariable \"bucket_name\" {\n  description = \"Olu\u015fturulacak S3 kovan\u0131n ad\u0131.\"\n  type        = string\n  default     = \"my-unique-application-bucket-example\" # Her zaman benzersiz olmal\u0131\n}\n\nvariable \"acl_type\" {\n  description = \"S3 kovan\u0131n eri\u015fim kontrol listesi (ACL).\"\n  type        = string\n  default     = \"private\"\n}\n<\/pre>\n<p><\/code><\/p>\n<p><strong><code>main.tf<\/code> i\u00e7eri\u011fi:<\/strong><\/p>\n<pre><code class=\"language-hcl\">\nresource \"aws_s3_bucket\" \"example_bucket\" {\n  bucket = var.bucket_name\n\n  tags = {\n    Name        = var.bucket_name\n    Environment = \"development\"\n    Project     = \"MinimalistTerraform\"\n  }\n}\n\nresource \"aws_s3_bucket_acl\" \"example_bucket_acl\" {\n  bucket = aws_s3_bucket.example_bucket.id\n  acl    = var.acl_type\n}\n\nresource \"aws_s3_bucket_versioning\" \"example_bucket_versioning\" {\n  bucket = aws_s3_bucket.example_bucket.id\n  versioning_configuration {\n    status = \"Enabled\"\n  }\n}\n<\/pre>\n<p><\/code><\/p>\n<p><strong><code>outputs.tf<\/code> i\u00e7eri\u011fi:<\/strong><\/p>\n<pre><code class=\"language-hcl\">\noutput \"s3_bucket_id\" {\n  description = \"Olu\u015fturulan S3 kovan\u0131n ID'si.\"\n  value       = aws_s3_bucket.example_bucket.id\n}\n\noutput \"s3_bucket_arn\" {\n  description = \"Olu\u015fturulan S3 kovan\u0131n ARN'i.\"\n  value       = aws_s3_bucket.example_bucket.arn\n}\n\noutput \"s3_bucket_website_endpoint\" {\n  description = \"S3 kovan\u0131n web sitesi u\u00e7 noktas\u0131 (e\u011fer etkinse).\"\n  value       = \"http:\/\/${aws_s3_bucket.example_bucket.website_endpoint}\"\n  sensitive   = false # Hassas bilgi de\u011fil\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131y\u0131 olu\u015fturduktan sonra, terminalinizde projenizin k\u00f6k dizinine gidip \u015fu komutlar\u0131 \u00e7al\u0131\u015ft\u0131rabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">\nterraform init       # Terraform'u ba\u015flat\u0131r ve sa\u011flay\u0131c\u0131lar\u0131 indirir\nterraform validate   # Yap\u0131land\u0131rma dosyalar\u0131n\u0131 do\u011frular\nterraform plan       # De\u011fi\u015fiklikleri \u00f6nizler\nterraform apply      # De\u011fi\u015fiklikleri uygular\n<\/pre>\n<p><\/code><\/p>\n<p>Bu minimalist yakla\u015f\u0131m, Terraform'a yeni ba\u015flayanlar i\u00e7in harika bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r. Her dosyan\u0131n belirli bir sorumlulu\u011fu olmas\u0131, projenizi daha okunakl\u0131 ve y\u00f6netilebilir k\u0131lar. \u0130lerleyen a\u015famalarda, bu yap\u0131y\u0131 mod\u00fcllerle geni\u015fleterek daha karma\u015f\u0131k altyap\u0131lar in\u015fa edebilirsiniz.<\/p>\n<h2 id=\"moduler-yaklasim-ile-terraform-projelerimizi-nasil-olceklendiririz\">Mod\u00fcler Yakla\u015f\u0131m ile Terraform Projelerimizi Nas\u0131l \u00d6l\u00e7eklendiririz?<\/h2>\n<p>Minimalist bir Terraform projesi, ba\u015flang\u0131\u00e7 i\u00e7in harika olsa da, ger\u00e7ek d\u00fcnya senaryolar\u0131nda altyap\u0131n\u0131z h\u0131zla b\u00fcy\u00fcr ve karma\u015f\u0131kla\u015f\u0131r. Bu noktada \"mod\u00fcler yakla\u015f\u0131m\" devreye girer. Mod\u00fcller, Terraform kodunuzu mant\u0131ksal, yeniden kullan\u0131labilir birimlere ay\u0131rman\u0131n en g\u00fc\u00e7l\u00fc yoludur. Bir mod\u00fcl, belirli bir amaca hizmet eden bir dizi kaynak (\u00f6rne\u011fin, bir VPC, bir Kubernetes k\u00fcmesi, bir veritaban\u0131 grubu) i\u00e7erebilir ve bu sayede ayn\u0131 altyap\u0131 bile\u015fenlerini farkl\u0131 projelerde veya ortamlarda kolayca kullanman\u0131z\u0131 sa\u011flar. Mod\u00fclerlik, kod tekrar\u0131n\u0131 \u00f6nler, kod kalitesini art\u0131r\u0131r ve b\u00fcy\u00fck projelerin y\u00f6netimini basitle\u015ftirir.<\/p>\n<h3 id=\"moduller-nedir-ve-neden-kullanilir\">Mod\u00fcller Nedir ve Neden Kullan\u0131l\u0131r?<\/h3>\n<p>Mod\u00fcller, temel olarak bir veya daha fazla Terraform yap\u0131land\u0131rma dosyas\u0131n\u0131 i\u00e7eren bir dizindir. Kendi i\u00e7inde <code>main.tf<\/code>, <code>variables.tf<\/code>, <code>outputs.tf<\/code> gibi dosyalar\u0131 bar\u0131nd\u0131r\u0131r ve d\u0131\u015far\u0131dan parametre al\u0131p \u00e7\u0131kt\u0131 \u00fcretebilirler. Mod\u00fcllerin ba\u015fl\u0131ca faydalar\u0131 \u015funlard\u0131r:<\/p>\n<ul>\n<li>\n        <strong>Yeniden Kullan\u0131labilirlik:<\/strong> Bir kerede tan\u0131mlad\u0131\u011f\u0131n\u0131z bir VPC mod\u00fcl\u00fcn\u00fc, geli\u015ftirme, test ve \u00fcretim gibi farkl\u0131 ortamlarda tekrar tekrar kullanabilirsiniz. Bu, her ortam i\u00e7in s\u0131f\u0131rdan kod yazma ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r.\n    <\/li>\n<li>\n        <strong>Tutarl\u0131l\u0131k:<\/strong> Mod\u00fcller sayesinde, t\u00fcm altyap\u0131 bile\u015fenleriniz belirli standartlara ve en iyi uygulamalara uygun olarak da\u011f\u0131t\u0131l\u0131r. Bu, manuel hatalar\u0131 azalt\u0131r ve altyap\u0131n\u0131z\u0131n genel kalitesini art\u0131r\u0131r.\n    <\/li>\n<li>\n        <strong>Soyutlama:<\/strong> Mod\u00fcller, karma\u015f\u0131k altyap\u0131 detaylar\u0131n\u0131 son kullan\u0131c\u0131lardan veya \u00fcst d\u00fczey mod\u00fcllerden gizler. Kullan\u0131c\u0131lar sadece mod\u00fcl\u00fcn giri\u015flerini ve \u00e7\u0131kt\u0131lar\u0131n\u0131 bilerek, temel implementasyon detaylar\u0131na girmeden altyap\u0131 olu\u015fturabilirler.\n    <\/li>\n<li>\n        <strong>Bak\u0131m Kolayl\u0131\u011f\u0131:<\/strong> Bir mod\u00fcldeki bir hata veya iyile\u015ftirme, sadece o mod\u00fclde yap\u0131lmas\u0131 gereken de\u011fi\u015fiklikle \u00e7\u00f6z\u00fcl\u00fcr ve bu de\u011fi\u015fiklik, mod\u00fcl\u00fc kullanan t\u00fcm yerlere yans\u0131t\u0131l\u0131r. Bu, bak\u0131m maliyetlerini \u00f6nemli \u00f6l\u00e7\u00fcde d\u00fc\u015f\u00fcr\u00fcr.\n    <\/li>\n<\/ul>\n<h3 id=\"modul-dizin-yapisi-nasil-olusturulur\">Mod\u00fcl Dizin Yap\u0131s\u0131 Nas\u0131l Olu\u015fturulur?<\/h3>\n<p>Temiz bir mod\u00fcler yap\u0131 i\u00e7in yayg\u0131n bir yakla\u015f\u0131m, projenizin k\u00f6k dizininde bir <code>modules<\/code> klas\u00f6r\u00fc olu\u015fturmak ve her mod\u00fcl\u00fc kendi alt dizininde bar\u0131nd\u0131rmakt\u0131r. \u00d6rne\u011fin, bir S3 kovas\u0131 ve bir VPC i\u00e7in ayr\u0131 mod\u00fclleriniz olabilir.<\/p>\n<p><strong>Dizin Yap\u0131s\u0131 \u00d6rne\u011fi:<\/strong><\/p>\n<pre><code class=\"language-bash\">\n.\n\u251c\u2500\u2500 main.tf           # Ana ortam yap\u0131land\u0131rmas\u0131 (\u00f6rne\u011fin dev ortam\u0131)\n\u251c\u2500\u2500 variables.tf\n\u251c\u2500\u2500 outputs.tf\n\u251c\u2500\u2500 versions.tf\n\u2514\u2500\u2500 modules\/\n    \u251c\u2500\u2500 s3-bucket\/\n    \u2502   \u251c\u2500\u2500 main.tf\n    \u2502   \u251c\u2500\u2500 variables.tf\n    \u2502   \u2514\u2500\u2500 outputs.tf\n    \u2514\u2500\u2500 vpc\/\n        \u251c\u2500\u2500 main.tf\n        \u251c\u2500\u2500 variables.tf\n        \u2514\u2500\u2500 outputs.tf\n<\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi, yukar\u0131daki minimalist S3 kova \u00f6rne\u011fini bir mod\u00fcl haline getirelim:<\/p>\n<p><strong><code>modules\/s3-bucket\/main.tf<\/code> i\u00e7eri\u011fi:<\/strong><\/p>\n<pre><code class=\"language-hcl\">\nresource \"aws_s3_bucket\" \"this\" {\n  bucket = var.name\n\n  tags = var.tags\n}\n\nresource \"aws_s3_bucket_acl\" \"this\" {\n  bucket = aws_s3_bucket.this.id\n  acl    = var.acl_type\n}\n\nresource \"aws_s3_bucket_versioning\" \"this\" {\n  bucket = aws_s3_bucket.this.id\n  versioning_configuration {\n    status = \"Enabled\"\n  }\n}\n<\/pre>\n<p><\/code><\/p>\n<p><strong><code>modules\/s3-bucket\/variables.tf<\/code> i\u00e7eri\u011fi:<\/strong><\/p>\n<pre><code class=\"language-hcl\">\nvariable \"name\" {\n  description = \"S3 kovan\u0131n ad\u0131.\"\n  type        = string\n}\n\nvariable \"acl_type\" {\n  description = \"S3 kovan\u0131n eri\u015fim kontrol listesi (ACL).\"\n  type        = string\n  default     = \"private\"\n}\n\nvariable \"tags\" {\n  description = \"Kova i\u00e7in etiketler.\"\n  type        = map(string)\n  default     = {}\n}\n<\/pre>\n<p><\/code><\/p>\n<p><strong><code>modules\/s3-bucket\/outputs.tf<\/code> i\u00e7eri\u011fi:<\/strong><\/p>\n<pre><code class=\"language-hcl\">\noutput \"id\" {\n  description = \"Olu\u015fturulan S3 kovan\u0131n ID'si.\"\n  value       = aws_s3_bucket.this.id\n}\n\noutput \"arn\" {\n  description = \"Olu\u015fturulan S3 kovan\u0131n ARN'i.\"\n  value       = aws_s3_bucket.this.arn\n}\n<\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi bu mod\u00fcl\u00fc ana yap\u0131land\u0131rma dosyam\u0131zdan nas\u0131l \u00e7a\u011f\u0131raca\u011f\u0131m\u0131za bakal\u0131m (<code>main.tf<\/code>):<\/p>\n<pre><code class=\"language-hcl\">\n# main.tf dosyas\u0131nda mod\u00fcl\u00fc \u00e7a\u011f\u0131rma\nmodule \"app_s3_bucket\" {\n  source = \".\/modules\/s3-bucket\"\n\n  name     = \"my-app-prod-bucket-${random_id.bucket_suffix.hex}\" # Benzersiz bir isim \u00fcretmek i\u00e7in\n  acl_type = \"private\"\n  tags = {\n    Environment = \"production\"\n    Service     = \"WebApp\"\n  }\n}\n\nresource \"random_id\" \"bucket_suffix\" {\n  byte_length = 4\n}\n\noutput \"prod_bucket_arn\" {\n  description = \"\u00dcretim ortam\u0131 S3 kovan\u0131n ARN'i.\"\n  value       = module.app_s3_bucket.arn\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki <code>main.tf<\/code> dosyas\u0131nda, bir <code>random_id<\/code> kayna\u011f\u0131n\u0131 kullanarak her uygulamada benzersiz bir kova ad\u0131 sa\u011flamak i\u00e7in basit bir y\u00f6ntem g\u00f6sterilmi\u015ftir. Bu, tekrarlayan ve benzersiz olmas\u0131 gereken kaynak adlar\u0131 i\u00e7in pratik bir yakla\u015f\u0131md\u0131r. Ayr\u0131ca, mod\u00fcl\u00fcn <code>outputs.tf<\/code> dosyas\u0131ndan tan\u0131mlad\u0131\u011f\u0131m\u0131z \u00e7\u0131kt\u0131lar\u0131 ana yap\u0131land\u0131rmam\u0131zda nas\u0131l kullanabildi\u011fimizi de g\u00f6rebilirsiniz.<\/p>\n<h3 id=\"vaka-analizi-microservices-altyapisi-icin-modul-kullanimi\">Vaka Analizi: Microservices Altyap\u0131s\u0131 \u0130\u00e7in Mod\u00fcl Kullan\u0131m\u0131<\/h3>\n<p>B\u00fcy\u00fck bir e-ticaret \u015firketi d\u00fc\u015f\u00fcn\u00fcn. Her bir mikroservis (\u00fcr\u00fcn katalogu, sepet, \u00f6deme vb.) kendi izole altyap\u0131s\u0131n\u0131 gerektiriyor: bir ECS servisi, bir Load Balancer, bir Aurora veritaban\u0131, bir SQS kuyru\u011fu ve ilgili IAM rolleri. Bu bile\u015fenlerin her biri i\u00e7in ayr\u0131 ayr\u0131 Terraform kodu yazmak, inan\u0131lmaz bir kod tekrar\u0131na ve bak\u0131m zorlu\u011funa yol a\u00e7acakt\u0131r. Bunun yerine, \u015firket a\u015fa\u011f\u0131daki gibi bir mod\u00fcler yap\u0131 kullanabilir:<\/p>\n<ol>\n<li>\n        <strong><code>modules\/ecs-service\/<\/code>:<\/strong> Bir ECS servisi, g\u00f6rev tan\u0131mlamalar\u0131, otomatik \u00f6l\u00e7eklendirme politikalar\u0131 ve ilgili IAM rolleri i\u00e7in bir mod\u00fcl.\n    <\/li>\n<li>\n        <strong><code>modules\/rds-database\/<\/code>:<\/strong> Bir Aurora veritaban\u0131 k\u00fcmesi, parametre gruplar\u0131, alt a\u011f gruplar\u0131 ve g\u00fcvenlik gruplar\u0131 i\u00e7in bir mod\u00fcl.\n    <\/li>\n<li>\n        <strong><code>modules\/alb-listener\/<\/code>:<\/strong> Bir Application Load Balancer (ALB) dinleyicisi ve hedef grubu i\u00e7in bir mod\u00fcl.\n    <\/li>\n<li>\n        <strong><code>modules\/sqs-queue\/<\/code>:<\/strong> Bir SQS kuyru\u011fu ve eri\u015fim politikalar\u0131 i\u00e7in bir mod\u00fcl.\n    <\/li>\n<\/ol>\n<p>Her mikroservis i\u00e7in, ana yap\u0131land\u0131rma dosyalar\u0131 (\u00f6rne\u011fin, <code>environments\/production\/microservice-catalog\/main.tf<\/code>) bu mod\u00fclleri \u00e7a\u011f\u0131r\u0131r ve her bir servisin \u00f6zel ihtiya\u00e7lar\u0131na g\u00f6re de\u011fi\u015fkenleri iletir. Bu yakla\u015f\u0131m sayesinde, yeni bir mikroservis devreye al\u0131nmas\u0131 gerekti\u011finde, mevcut mod\u00fcller kullan\u0131larak birka\u00e7 dakika i\u00e7inde altyap\u0131 olu\u015fturulabilir. Ayr\u0131ca, herhangi bir mod\u00fclde yap\u0131lan bir iyile\u015ftirme (\u00f6rne\u011fin, g\u00fcvenlik yamas\u0131), mod\u00fcl\u00fc kullanan t\u00fcm mikroservisler i\u00e7in otomatik olarak ge\u00e7erli hale gelir. Bu, hem geli\u015ftirme h\u0131z\u0131n\u0131 art\u0131r\u0131r hem de altyap\u0131daki tutarl\u0131l\u0131\u011f\u0131 ve g\u00fcvenli\u011fi sa\u011flar.<\/p>\n<p>Mod\u00fcler yakla\u015f\u0131m, Terraform projelerinizin \u00f6l\u00e7eklenebilirli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini sa\u011flamak i\u00e7in temel bir stratejidir. Projeniz b\u00fcy\u00fcd\u00fck\u00e7e, bu yap\u0131, kodunuzu d\u00fczenli tutman\u0131n ve ekip i\u015fbirli\u011fini kolayla\u015ft\u0131rman\u0131n en etkili yolu olacakt\u0131r.<\/p>\n<h2 id=\"ortam-bazli-proje-yapilari-gelistirme-test-ve-uretim-ortamlarini-nasil-yonetiriz\">Ortam Bazl\u0131 Proje Yap\u0131lar\u0131: Geli\u015ftirme, Test ve \u00dcretim Ortamlar\u0131n\u0131 Nas\u0131l Y\u00f6netiriz?<\/h2>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde, farkl\u0131 ortamlar (geli\u015ftirme, test, haz\u0131rl\u0131k, \u00fcretim) aras\u0131nda ayr\u0131m yapmak kritik \u00f6neme sahiptir. Her ortam\u0131n kendine \u00f6zg\u00fc gereksinimleri, kaynak boyutlar\u0131, g\u00fcvenlik politikalar\u0131 ve eri\u015fim kontrolleri olabilir. Temiz bir Terraform proje yap\u0131s\u0131, bu ortamlar\u0131 etkin bir \u015fekilde y\u00f6netmek i\u00e7in net ve ayr\u0131lm\u0131\u015f bir strateji sunmal\u0131d\u0131r. Terraform'da ortamlar\u0131 y\u00f6netmenin birka\u00e7 yolu olsa da, en yayg\u0131n ve \u00f6nerilen y\u00f6ntemlerden biri, her ortam i\u00e7in ayr\u0131 bir dizin yap\u0131s\u0131 kullanmakt\u0131r.<\/p>\n<h3 id=\"dizin-bazli-ortam-yonetimi-nedir\">Dizin Bazl\u0131 Ortam Y\u00f6netimi Nedir?<\/h3>\n<p>Dizin bazl\u0131 ortam y\u00f6netimi, her bir ortam i\u00e7in (<code>dev<\/code>, <code>test<\/code>, <code>prod<\/code> gibi) ayr\u0131 bir \u00fcst d\u00fczey dizin olu\u015fturmay\u0131 ve bu dizinlerin i\u00e7inde o ortama \u00f6zg\u00fc Terraform yap\u0131land\u0131rmalar\u0131n\u0131 bar\u0131nd\u0131rmay\u0131 ifade eder. Bu yakla\u015f\u0131m, Terraform Workspaces'e g\u00f6re daha \u015feffaf ve y\u00f6netilebilir olarak kabul edilir \u00e7\u00fcnk\u00fc her ortam\u0131n durumu, de\u011fi\u015fkenleri ve hatta Terraform s\u00fcr\u00fcm\u00fc birbirinden fiziksel olarak ayr\u0131lm\u0131\u015ft\u0131r.<\/p>\n<p><strong>Dizin Yap\u0131s\u0131 \u00d6rne\u011fi:<\/strong><\/p>\n<pre><code class=\"language-bash\">\n.\n\u251c\u2500\u2500 modules\/               # Yeniden kullan\u0131labilir Terraform mod\u00fclleri\n\u2502   \u251c\u2500\u2500 vpc\/\n\u2502   \u251c\u2500\u2500 web-app\/\n\u2502   \u2514\u2500\u2500 database\/\n\u251c\u2500\u2500 environments\/\n\u2502   \u251c\u2500\u2500 dev\/\n\u2502   \u2502   \u251c\u2500\u2500 main.tf        # Dev ortam\u0131 kaynaklar\u0131\n\u2502   \u2502   \u251c\u2500\u2500 variables.tf   # Dev ortam\u0131na \u00f6zel de\u011fi\u015fkenler\n\u2502   \u2502   \u2514\u2500\u2500 versions.tf    # Dev ortam\u0131na \u00f6zel sa\u011flay\u0131c\u0131\/backend konfig\u00fcrasyonu\n\u2502   \u251c\u2500\u2500 test\/\n\u2502   \u2502   \u251c\u2500\u2500 main.tf        # Test ortam\u0131 kaynaklar\u0131\n\u2502   \u2502   \u251c\u2500\u2500 variables.tf\n\u2502   \u2502   \u2514\u2500\u2500 versions.tf\n\u2502   \u2514\u2500\u2500 prod\/\n\u2502       \u251c\u2500\u2500 main.tf        # Prod ortam\u0131 kaynaklar\u0131\n\u2502       \u251c\u2500\u2500 variables.tf\n\u2502       \u2514\u2500\u2500 versions.tf\n\u251c\u2500\u2500 .terraformignore\n\u2514\u2500\u2500 README.md\n<\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131da, <code>modules<\/code> dizini alt\u0131nda tan\u0131mlanan mod\u00fcller, <code>environments<\/code> dizini alt\u0131ndaki her bir ortam taraf\u0131ndan \u00e7a\u011fr\u0131l\u0131r. Her ortam dizini (<code>dev<\/code>, <code>test<\/code>, <code>prod<\/code>), kendi i\u00e7inde ayr\u0131 bir Terraform proje k\u00f6k\u00fc olarak i\u015flev g\u00f6r\u00fcr. Bu, her ortam\u0131n kendi Terraform durum dosyas\u0131na (<code>terraform.tfstate<\/code>) sahip olaca\u011f\u0131 anlam\u0131na gelir ve bu durum dosyalar\u0131 birbirine kar\u0131\u015fmaz.<\/p>\n<h3 id=\"ortam-dizinlerinde-moduller-nasil-kullanilir\">Ortam Dizinlerinde Mod\u00fcller Nas\u0131l Kullan\u0131l\u0131r?<\/h3>\n<p>Her ortam\u0131n <code>main.tf<\/code> dosyas\u0131, <code>modules<\/code> dizini alt\u0131ndaki payla\u015f\u0131lan mod\u00fclleri \u00e7a\u011f\u0131r\u0131r. Ancak, her ortam\u0131n kendine \u00f6zg\u00fc <code>variables.tf<\/code> dosyas\u0131 sayesinde, ayn\u0131 mod\u00fcl farkl\u0131 parametrelerle da\u011f\u0131t\u0131labilir. \u00d6rne\u011fin, geli\u015ftirme ortam\u0131nda daha k\u00fc\u00e7\u00fck boyutlu sunucular veya daha az replikasyonlu veritabanlar\u0131 kullan\u0131labilirken, \u00fcretim ortam\u0131nda daha g\u00fc\u00e7l\u00fc kaynaklar devreye al\u0131nabilir.<\/p>\n<p><strong><code>environments\/dev\/main.tf<\/code> i\u00e7eri\u011fi:<\/strong><\/p>\n<pre><code class=\"language-hcl\">\n# dev\/main.tf\n\nterraform {\n  required_version = \"~> 1.0\"\n  required_providers {\n    aws = {\n      source  = \"hashicorp\/aws\"\n      version = \"~> 4.0\"\n    }\n  }\n  backend \"s3\" {\n    bucket = \"my-company-terraform-state\"\n    key    = \"dev\/my-app\/terraform.tfstate\"\n    region = \"us-east-1\"\n    encrypt = true\n  }\n}\n\nprovider \"aws\" {\n  region = \"us-east-1\"\n}\n\nmodule \"app_vpc\" {\n  source = \"..\/..\/modules\/vpc\" # \u00dcst dizindeki mod\u00fcl\u00fc \u00e7a\u011f\u0131r\u0131r\n\n  name = \"dev-app-vpc\"\n  cidr_block = \"10.0.0.0\/16\"\n  public_subnet_cidrs = [\"10.0.1.0\/24\", \"10.0.2.0\/24\"]\n  private_subnet_cidrs = [\"10.0.10.0\/24\", \"10.0.11.0\/24\"]\n  \n  tags = {\n    Environment = \"development\"\n    Project     = \"MyApp\"\n  }\n}\n\nmodule \"web_application\" {\n  source = \"..\/..\/modules\/web-app\"\n\n  vpc_id          = module.app_vpc.vpc_id\n  public_subnet_ids = module.app_vpc.public_subnet_ids\n  instance_type   = var.web_app_instance_type # De\u011fi\u015fkenden gelir\n  desired_capacity = var.web_app_desired_capacity\n\n  tags = {\n    Environment = \"development\"\n    Component   = \"WebServer\"\n  }\n}\n\noutput \"dev_app_url\" {\n  description = \"Geli\u015ftirme ortam\u0131 web uygulamas\u0131n\u0131n URL'i.\"\n  value       = module.web_application.app_url\n}\n<\/pre>\n<p><\/code><\/p>\n<p><strong><code>environments\/dev\/variables.tf<\/code> i\u00e7eri\u011fi:<\/strong><\/p>\n<pre><code class=\"language-hcl\">\n# dev\/variables.tf\n\nvariable \"web_app_instance_type\" {\n  description = \"Web uygulamas\u0131 EC2 \u00f6rne\u011fi tipi.\"\n  type        = string\n  default     = \"t2.micro\" # Geli\u015ftirme ortam\u0131 i\u00e7in daha k\u00fc\u00e7\u00fck\n}\n\nvariable \"web_app_desired_capacity\" {\n  description = \"Web uygulamas\u0131 auto-scaling grubu i\u00e7in istenen kapasite.\"\n  type        = number\n  default     = 1 # Geli\u015ftirme ortam\u0131 i\u00e7in tek \u00f6rnek\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Benzer \u015fekilde, <code>environments\/prod\/<\/code> dizininde de ayn\u0131 mod\u00fcller \u00e7a\u011fr\u0131labilir, ancak <code>prod\/variables.tf<\/code> dosyas\u0131nda <code>instance_type = \"m5.large\"<\/code> ve <code>desired_capacity = 3<\/code> gibi farkl\u0131 de\u011ferler tan\u0131mlanabilir. Bu sayede, ayn\u0131 kod taban\u0131n\u0131 kullanarak her ortama \u00f6zel altyap\u0131lar\u0131 da\u011f\u0131tabilirsiniz.<\/p>\n<div class=\"expert-tip\">\n  Her ortam i\u00e7in farkl\u0131 bir remote state (uzak durum) konfig\u00fcrasyonu kullanmak, ortamlar aras\u0131 izolasyonu sa\u011flamak i\u00e7in hayati \u00f6neme sahiptir. Bir ortamda yap\u0131lan de\u011fi\u015fikliklerin, yanl\u0131\u015fl\u0131kla di\u011fer ortamlar\u0131n durum dosyas\u0131n\u0131 etkilemesini engeller. Bu, genellikle <code>versions.tf<\/code> i\u00e7inde veya ayr\u0131 bir <code>backend.tf<\/code> dosyas\u0131nda yap\u0131land\u0131r\u0131l\u0131r.\n<\/div>\n<p><strong>Terraform Workspaces vs. Dizin Bazl\u0131 Yakla\u015f\u0131m:<\/strong><\/p>\n<p>Terraform'un yerle\u015fik Workspaces \u00f6zelli\u011fi de ortam y\u00f6netimi i\u00e7in kullan\u0131labilir, ancak genellikle daha basit projeler veya ge\u00e7ici ortamlar i\u00e7in uygundur. Workspaces, ayn\u0131 proje dizininde birden fazla state dosyas\u0131 olu\u015fturman\u0131za olanak tan\u0131r. Ancak, Workspaces, mod\u00fcl k\u0131s\u0131tlamalar\u0131 veya farkl\u0131 sa\u011flay\u0131c\u0131 versiyonlar\u0131 gibi ortam bazl\u0131 farkl\u0131l\u0131klar\u0131 y\u00f6netmekte dizin bazl\u0131 yakla\u015f\u0131ma g\u00f6re daha az esneklik sunar. B\u00fcy\u00fck ve karma\u015f\u0131k projeler i\u00e7in, dizin bazl\u0131 yakla\u015f\u0131m genellikle daha temiz, daha anla\u015f\u0131l\u0131r ve daha g\u00fcvenli bir tercihtir.<\/p>\n<p>Ortam bazl\u0131 dizin yap\u0131s\u0131, altyap\u0131n\u0131z\u0131n tutarl\u0131 bir \u015fekilde y\u00f6netilmesini, de\u011fi\u015fikliklerin izlenmesini ve ekipler aras\u0131 i\u015fbirli\u011fini kolayla\u015ft\u0131rarak Terraform projelerinizin olgunlu\u011funu ve g\u00fcvenilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Her ortam\u0131n kendi \"micro-Terraform projesi\" gibi hareket etmesi, olu\u015fabilecek hatalar\u0131 izole etmenize ve daha g\u00fcvenli da\u011f\u0131t\u0131mlar yapman\u0131za olanak tan\u0131r.<\/p>\n<h2 id=\"terraform-best-practices-temiz-kodu-surdurulebilir-kilmak-icin-ipuclari\">Terraform Best Practices: Temiz Kodu S\u00fcrd\u00fcr\u00fclebilir K\u0131lmak \u0130\u00e7in \u0130pu\u00e7lar\u0131<\/h2>\n<p>Terraform projelerinizin sadece ilk ba\u015fta temiz olmas\u0131 yeterli de\u011fildir; zamanla b\u00fcy\u00fcd\u00fck\u00e7e ve geli\u015ftik\u00e7e bu temizli\u011fi korumak \u00e7ok daha \u00f6nemlidir. \u0130yi uygulamalar, kodun kalitesini, okunabilirli\u011fini ve bak\u0131m kolayl\u0131\u011f\u0131n\u0131 do\u011frudan etkiler. \u0130\u015fte Terraform kodunuzu s\u00fcrd\u00fcr\u00fclebilir k\u0131lmak i\u00e7in uygulayabilece\u011finiz baz\u0131 ileri d\u00fczey ipu\u00e7lar\u0131 ve en iyi uygulamalar:<\/p>\n<h3 id=\"tutarlilik-ve-adlandirma-kurallari-neden-onemlidir\">Tutarl\u0131l\u0131k ve Adland\u0131rma Kurallar\u0131 Neden \u00d6nemlidir?<\/h3>\n<p>Adland\u0131rma, yaz\u0131l\u0131m geli\u015ftirmede zorlu bir konudur ve Terraform i\u00e7in de farkl\u0131 de\u011fildir. Kaynaklar\u0131n, mod\u00fcllerin, de\u011fi\u015fkenlerin ve \u00e7\u0131kt\u0131lar\u0131n tutarl\u0131 bir \u015fekilde adland\u0131r\u0131lmas\u0131, kod taban\u0131n\u0131z\u0131n okunabilirli\u011fini inan\u0131lmaz derecede art\u0131r\u0131r. \u00d6rne\u011fin:<\/p>\n<ul>\n<li>\n        <strong>Kaynak Adland\u0131rmas\u0131:<\/strong> <code>aws_s3_bucket.my_app_bucket<\/code> yerine <code>aws_s3_bucket.app<\/code> veya <code>aws_s3_bucket.main<\/code> gibi genel isimler tercih edin. Ger\u00e7ek S3 kova ad\u0131n\u0131 (<code>my-app-prod-bucket<\/code>) de\u011fi\u015fkenlerden al\u0131n.\n    <\/li>\n<li>\n        <strong>De\u011fi\u015fken Adland\u0131rmas\u0131:<\/strong> Anla\u015f\u0131l\u0131r, a\u00e7\u0131klay\u0131c\u0131 ve k\u00fc\u00e7\u00fck harflerle alt \u00e7izgi kullanarak (<code>snake_case<\/code>) adland\u0131r\u0131n (\u00f6rne\u011fin, <code>instance_type<\/code>, <code>vpc_cidr_block<\/code>).\n    <\/li>\n<li>\n        <strong>Dosya Adland\u0131rmas\u0131:<\/strong> Dosyalar\u0131n\u0131z\u0131 i\u015flevlerine g\u00f6re adland\u0131r\u0131n (<code>main.tf<\/code>, <code>variables.tf<\/code>, <code>outputs.tf<\/code>, <code>providers.tf<\/code>, <code>versions.tf<\/code>). Karma\u015f\u0131k senaryolarda <code>networking.tf<\/code>, <code>compute.tf<\/code> gibi daha spesifik dosyalar da kullanabilirsiniz.\n    <\/li>\n<\/ul>\n<h3 id=\"terraform-fmt-ve-validate-kullanimi\">Terraform fmt ve Validate Kullan\u0131m\u0131<\/h3>\n<p>Bu iki Terraform komutu, kod kalitesini korumak i\u00e7in vazge\u00e7ilmezdir:<\/p>\n<ul>\n<li>\n        <strong><code>terraform fmt<\/code>:<\/strong> Terraform yap\u0131land\u0131rma dosyalar\u0131n\u0131z\u0131 otomatik olarak standart bir formata getirir. Bu, t\u00fcm ekip \u00fcyelerinin ayn\u0131 kod stiline sahip olmas\u0131n\u0131 sa\u011flar ve okunabilirli\u011fi art\u0131r\u0131r. Bunu CI\/CD boru hatt\u0131n\u0131z\u0131n bir par\u00e7as\u0131 haline getirin.\n    <\/li>\n<li>\n        <strong><code>terraform validate<\/code>:<\/strong> Yap\u0131land\u0131rma dosyalar\u0131n\u0131z\u0131n s\u00f6zdizimsel olarak do\u011fru olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. Hata ay\u0131klama s\u00fcre\u00e7lerini h\u0131zland\u0131r\u0131r ve da\u011f\u0131t\u0131m \u00f6ncesi sorunlar\u0131 tespit etmenize yard\u0131mc\u0131 olur. Her commit \u00f6ncesi veya CI\/CD'de mutlaka \u00e7al\u0131\u015ft\u0131r\u0131lmal\u0131d\u0131r.\n    <\/li>\n<\/ul>\n<h3 id=\"remote-state-yonetimi-ve-kilitleme\">Remote State Y\u00f6netimi ve Kilitleme<\/h3>\n<p>Terraform'un durum dosyas\u0131 (<code>.tfstate<\/code>), altyap\u0131n\u0131z\u0131n anl\u0131k bir g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc tutar ve kritik \u00f6neme sahiptir. Bu dosyay\u0131 yerel makinenizde b\u0131rakmak, veri kayb\u0131 ve ekip i\u015fbirli\u011fi sorunlar\u0131na yol a\u00e7ar. Uzak durum (Remote State) kullanarak durumu g\u00fcvenli bir \u015fekilde saklamal\u0131s\u0131n\u0131z:<\/p>\n<ul>\n<li>\n        <strong>S3 (AWS), Azure Blob Storage (Azure), GCS (Google Cloud):<\/strong> Durum dosyalar\u0131n\u0131 bu hizmetlerde depolay\u0131n. Bu, s\u00fcr\u00fcm kontrol\u00fcn\u00fc, \u015fifrelemeyi ve eri\u015fim kontrol\u00fcn\u00fc sa\u011flar.\n    <\/li>\n<li>\n        <strong>Durum Kilitleme:<\/strong> Ayn\u0131 anda birden fazla Terraform i\u015flemi \u00e7al\u0131\u015ft\u0131r\u0131l\u0131rsa, durum dosyas\u0131nda \u00e7ak\u0131\u015fmalar meydana gelebilir. Uzak durum arka u\u00e7lar\u0131 (backend) genellikle yerle\u015fik durum kilitleme mekanizmalar\u0131 sunar (\u00f6rne\u011fin, AWS DynamoDB ile S3 backend). Bu mekanizmalar\u0131 mutlaka etkinle\u015ftirin.\n    <\/li>\n<\/ul>\n<h3 id=\"hassas-veri-yonetimi-ve-guvenlik\">Hassas Veri Y\u00f6netimi ve G\u00fcvenlik<\/h3>\n<p>Parolalar, API anahtarlar\u0131 gibi hassas bilgileri Terraform kodunuzda veya de\u011fi\u015fken dosyalar\u0131n\u0131zda d\u00fcz metin olarak saklamaktan ka\u00e7\u0131n\u0131n. Bunun yerine, g\u00fcvenli bir s\u0131r y\u00f6netimi \u00e7\u00f6z\u00fcm\u00fc kullan\u0131n:<\/p>\n<ul>\n<li>\n        <strong>AWS Secrets Manager \/ Azure Key Vault \/ Google Secret Manager:<\/strong> Bulut sa\u011flay\u0131c\u0131lar\u0131n\u0131n s\u0131r y\u00f6netim hizmetlerini kullanarak hassas verileri depolay\u0131n ve Terraform kodunuzdan bu hizmetlere ba\u015fvurun.\n    <\/li>\n<li>\n        <strong>HashiCorp Vault:<\/strong> Daha karma\u015f\u0131k senaryolar ve \u00e7oklu bulut ortamlar\u0131 i\u00e7in Vault gibi ba\u011f\u0131ms\u0131z bir s\u0131r y\u00f6netim \u00e7\u00f6z\u00fcm\u00fc tercih edilebilir.\n    <\/li>\n<li>\n        <strong><code>sensitive = true<\/code>:<\/strong> \u00c7\u0131kt\u0131larda veya de\u011fi\u015fkenlerde hassas veriler varsa, bunlar\u0131 Terraform CLI'da g\u00f6r\u00fcnmez yapmak i\u00e7in <code>sensitive = true<\/code> \u00f6zelli\u011fini kullan\u0131n.<\/p>\n<pre><code class=\"language-hcl\">\noutput \"db_password\" {\n  value     = aws_rds_cluster.main.master_password\n  sensitive = true\n}\n        <\/pre>\n<p><\/code>\n    <\/li>\n<\/ul>\n<h3 id=\"makefile-veya-betikler-ile-otomasyon\">Makefile veya Betikler ile Otomasyon<\/h3>\n<p>Tekrar eden Terraform komutlar\u0131n\u0131 (<code>init<\/code>, <code>plan<\/code>, <code>apply<\/code>, <code>validate<\/code>, <code>fmt<\/code>) otomatikle\u015ftirmek i\u00e7in <code>Makefile<\/code> veya basit shell betikleri kullan\u0131n. Bu, ekip \u00fcyelerinin do\u011fru komutlar\u0131 do\u011fru s\u0131rayla \u00e7al\u0131\u015ft\u0131rmas\u0131n\u0131 sa\u011flar ve hata yapma olas\u0131l\u0131\u011f\u0131n\u0131 azalt\u0131r. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-makefile\">\n.PHONY: init plan apply validate fmt\n\ninit:\n\tterraform init\n\nplan:\n\tterraform plan\n\napply:\n\tterraform apply\n\nvalidate:\n\tterraform validate\n\nfmt:\n\tterraform fmt -recursive\n<\/pre>\n<p><\/code><\/p>\n<pre><code class=\"language-bash\"><\/pre>\n<p><\/code><br \/>\n# Kullan\u0131m \u00f6rne\u011fi<br \/>\nmake init<br \/>\nmake plan<br \/>\n<\/code><\/p>\n<h3 id=\"readme-md-dosyalari\">README.md Dosyalar\u0131<\/h3>\n<p>Her mod\u00fcl\u00fcn veya ortam\u0131n k\u00f6k dizininde kapsaml\u0131 bir <code>README.md<\/code> dosyas\u0131 bulundurun. Bu dosyalar \u015funlar\u0131 i\u00e7ermelidir:<\/p>\n<ul>\n<li>Mod\u00fcl\u00fcn veya ortam\u0131n amac\u0131.<\/li>\n<li>Kullan\u0131lan Terraform versiyonu ve sa\u011flay\u0131c\u0131lar.<\/li>\n<li>Giri\u015f de\u011fi\u015fkenleri (a\u00e7\u0131klamalar\u0131 ve \u00f6rnek de\u011ferleriyle).<\/li>\n<li>\u00c7\u0131kt\u0131lar (a\u00e7\u0131klamalar\u0131yla).<\/li>\n<li>\u00d6rnek kullan\u0131m senaryolar\u0131.<\/li>\n<li>\u00d6nemli notlar veya ba\u011f\u0131ml\u0131l\u0131klar.<\/li>\n<\/ul>\n<div class=\"expert-tip\">\n  Mod\u00fcl geli\u015ftirmede, \"tek sorumluluk prensibi\"ne uymaya \u00e7al\u0131\u015f\u0131n. Her mod\u00fcl tek bir mant\u0131ksal i\u015flevi yerine getirmelidir (\u00f6rne\u011fin, bir mod\u00fcl sadece bir VPC olu\u015ftururken, di\u011feri bir veritaban\u0131 cluster'\u0131 olu\u015fturmal\u0131d\u0131r). Bu, mod\u00fcllerinizi daha odakl\u0131, test edilebilir ve yeniden kullan\u0131labilir k\u0131lar.\n<\/div>\n<p>Bu en iyi uygulamalar\u0131 benimsemek, Terraform projelerinizin uzun vadede s\u00fcrd\u00fcr\u00fclebilirli\u011fini, g\u00fcvenilirli\u011fini ve ekip verimlili\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131racakt\u0131r. Temiz bir yap\u0131, sadece estetik bir tercih de\u011fil, ayn\u0131 zamanda operasyonel m\u00fckemmelli\u011fin temelidir.<\/p>\n<h2 id=\"temiz-bir-terraform-proje-yapisi-hangi-faydalari-saglar\">Temiz Bir Terraform Proje Yap\u0131s\u0131 Hangi Faydalar\u0131 Sa\u011flar?<\/h2>\n<p>Bu yolculuk boyunca, Terraform projelerimizi minimalist bir ba\u015flang\u0131\u00e7tan al\u0131p, mod\u00fcler yakla\u015f\u0131mlar ve ortam bazl\u0131 dizin yap\u0131lar\u0131yla nas\u0131l \u00f6l\u00e7eklendirip olgunla\u015ft\u0131rd\u0131\u011f\u0131m\u0131z\u0131 inceledik. \"Geli\u015ftirme, Test ve \u00dcretim ortamlar\u0131n\u0131 nas\u0131l y\u00f6netiriz?\" ve \"Temiz kodu s\u00fcrd\u00fcr\u00fclebilir k\u0131lmak i\u00e7in ipu\u00e7lar\u0131\" ba\u015fl\u0131klar\u0131 alt\u0131nda ise ileri d\u00fczey teknikleri ve en iyi uygulamalar\u0131 masaya yat\u0131rd\u0131k. Peki, t\u00fcm bu \u00e7aban\u0131n neticesinde ne elde ediyoruz? Temiz ve iyi yap\u0131land\u0131r\u0131lm\u0131\u015f bir Terraform projesi, sadece kodunuzu de\u011fil, ayn\u0131 zamanda operasyonel s\u00fcre\u00e7lerinizi ve ekip dinamiklerinizi de d\u00f6n\u00fc\u015ft\u00fcren bir dizi somut fayda sa\u011flar.<\/p>\n<p>En ba\u015fta, <strong>bak\u0131m kolayl\u0131\u011f\u0131<\/strong> gelir. Da\u011f\u0131n\u0131k kod tabanlar\u0131nda en k\u00fc\u00e7\u00fck bir de\u011fi\u015fikli\u011fi yapmak bile saatler s\u00fcrebilir, hatta haftalar. Temiz bir yap\u0131da ise, belirli bir kayna\u011f\u0131n veya mod\u00fcl\u00fcn nerede oldu\u011funu an\u0131nda bulabilir, de\u011fi\u015fiklikleri g\u00fcvenle uygulayabilirsiniz. Bu, \"spagetti altyap\u0131 kodu\" nedeniyle ya\u015fanan s\u0131k\u0131nt\u0131lara kesin bir \u00e7\u00f6z\u00fcm sunar. \u0130kinci olarak, <strong>ekip i\u015fbirli\u011fi<\/strong> \u00f6nemli \u00f6l\u00e7\u00fcde geli\u015fir. Mod\u00fcler ve tutarl\u0131 bir yap\u0131, yeni ekip \u00fcyelerinin projeye adaptasyon s\u00fcrecini h\u0131zland\u0131r\u0131r, \u00e7\u00fcnk\u00fc kodun amac\u0131 ve i\u015fleyi\u015fi daha \u015feffaft\u0131r. Herkes ayn\u0131 standartlarda kod yazd\u0131\u011f\u0131nda, kod incelemeleri daha verimli hale gelir ve \u00e7ak\u0131\u015fmalar azal\u0131r.<\/p>\n<p>\u00dc\u00e7\u00fcnc\u00fc bir fayda, <strong>yeniden kullan\u0131labilirlik<\/strong> ve <strong>tutarl\u0131l\u0131kt\u0131r<\/strong>. Mod\u00fcller sayesinde, bir kerede tan\u0131mlad\u0131\u011f\u0131n\u0131z altyap\u0131 bile\u015fenlerini farkl\u0131 projelerde veya ortamlarda tekrar tekrar kullanabilirsiniz. Bu, kod tekrar\u0131n\u0131 \u00f6nler ve t\u00fcm altyap\u0131n\u0131z\u0131n belirlenen standartlara uygun olarak da\u011f\u0131t\u0131lmas\u0131n\u0131 sa\u011flar. B\u00f6ylece, geli\u015ftirme ortam\u0131ndaki bir VPC ile \u00fcretim ortam\u0131ndaki bir VPC aras\u0131nda yap\u0131sal bir tutars\u0131zl\u0131k ya\u015fama riskiniz en aza iner. D\u00f6rd\u00fcnc\u00fc olarak, <strong>hata oran\u0131 d\u00fc\u015fer ve da\u011f\u0131t\u0131mlar h\u0131zlan\u0131r<\/strong>. \u0130yi yap\u0131land\u0131r\u0131lm\u0131\u015f kod, daha az hata i\u00e7erir ve potansiyel sorunlar\u0131n daha erken a\u015famada tespit edilmesini sa\u011flar. Otomatik testler ve do\u011frulama ara\u00e7lar\u0131yla birle\u015fti\u011finde, da\u011f\u0131t\u0131m s\u00fcre\u00e7leri daha h\u0131zl\u0131 ve daha g\u00fcvenilir hale gelir, bu da pazar s\u00fcresini k\u0131salt\u0131r.<\/p>\n<p>Son olarak, <strong>\u00f6l\u00e7eklenebilirlik<\/strong> ve <strong>esneklik<\/strong> artar. Altyap\u0131n\u0131z b\u00fcy\u00fcd\u00fck\u00e7e veya i\u015f gereksinimleriniz de\u011fi\u015ftik\u00e7e, mod\u00fcler yap\u0131, mevcut bile\u015fenleri etkilemeden yeni \u00f6zellikler eklemenize veya mevcut olanlar\u0131 g\u00fcncellemenize olanak tan\u0131r. Bu esneklik, i\u015fletmelerin de\u011fi\u015fen ko\u015fullara daha h\u0131zl\u0131 adapte olmas\u0131na yard\u0131mc\u0131 olur. K\u0131sacas\u0131, temiz bir Terraform proje yap\u0131s\u0131na yat\u0131r\u0131m yapmak, sadece teknik bir tercih de\u011fil, ayn\u0131 zamanda uzun vadeli operasyonel ba\u015far\u0131 ve s\u00fcrd\u00fcr\u00fclebilir b\u00fcy\u00fcme i\u00e7in stratejik bir zorunluluktur. Bu yap\u0131, hem bug\u00fcn\u00fcn hem de yar\u0131n\u0131n altyap\u0131 ihtiya\u00e7lar\u0131n\u0131 kar\u015f\u0131layacak g\u00fc\u00e7l\u00fc bir temel olu\u015fturur.<\/p>\n<h2 id=\"s\u0131kca-sorulan-sorular\">S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<h3 id=\"terraform-modulleri-yerine-kopyala-yapistir-kullanmak-neden-kotu-bir-fikirdir\">Terraform mod\u00fclleri yerine kopyala-yap\u0131\u015ft\u0131r kullanmak neden k\u00f6t\u00fc bir fikirdir?<\/h3>\n<p>Kopyala-yap\u0131\u015ft\u0131r, kod tekrar\u0131na yol a\u00e7ar ve her de\u011fi\u015fiklik yap\u0131ld\u0131\u011f\u0131nda t\u00fcm kopyalar\u0131n g\u00fcncellenmesini gerektirir. Bu durum, hatalar\u0131n yay\u0131lmas\u0131na, bak\u0131m maliyetlerinin artmas\u0131na ve altyap\u0131 bile\u015fenleri aras\u0131nda tutars\u0131zl\u0131\u011fa neden olur. Mod\u00fcller, bu sorunlar\u0131 \u00e7\u00f6zerek kodun yeniden kullan\u0131labilirli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini sa\u011flar.<\/p>\n<h3 id=\"uzak-durum-remote-state-yonetimi-neden bu kadar \u00f6nemlidir\">Uzak durum (remote state) y\u00f6netimi neden bu kadar \u00f6nemlidir?<\/h3>\n<p>Uzak durum y\u00f6netimi, Terraform durum dosyas\u0131n\u0131n merkezi ve g\u00fcvenli bir konumda (\u00f6rne\u011fin S3, Azure Blob Storage) saklanmas\u0131n\u0131 sa\u011flar. Bu, ekip \u00fcyeleri aras\u0131nda tutarl\u0131l\u0131k sa\u011flar, ayn\u0131 anda birden fazla ki\u015finin \u00e7al\u0131\u015f\u0131rken \u00e7ak\u0131\u015fmalar\u0131 \u00f6nler (kilitleme mekanizmalar\u0131 ile) ve olas\u0131 veri kayb\u0131na kar\u015f\u0131 koruma sunar. Ayr\u0131ca hassas verilerin yerel makinelerde kalmas\u0131n\u0131 engeller.<\/p>\n<h3 id=\"farkli-ortamlar-icin-gelistirme-test-uretim-terraform-kodunu-nasil-ayirmaliyim\">Farkl\u0131 ortamlar (geli\u015ftirme, test, \u00fcretim) i\u00e7in Terraform kodunu nas\u0131l ay\u0131rmal\u0131y\u0131m?<\/h3>\n<p>En iyi uygulama, her ortam i\u00e7in ayr\u0131 dizinler olu\u015fturmakt\u0131r (\u00f6rne\u011fin, <code>environments\/dev<\/code>, <code>environments\/prod<\/code>). Her dizin kendi Terraform yap\u0131land\u0131rmas\u0131n\u0131 ve uzak durumunu bar\u0131nd\u0131r\u0131r. Ortak altyap\u0131 bile\u015fenleri i\u00e7in payla\u015f\u0131lan mod\u00fcller kullan\u0131larak kod tekrar\u0131 \u00f6nlenir ve her ortam\u0131n kendi de\u011fi\u015fken de\u011ferleriyle \u00f6zelle\u015ftirilmesi sa\u011flan\u0131r.<\/p>\n<h3 id=\"hassas-verileri-terraform-ile-nasil-yonetmeliyim\">Hassas verileri Terraform ile nas\u0131l y\u00f6netmeliyim?<\/h3>\n<p>Parolalar, API anahtarlar\u0131 gibi hassas bilgileri do\u011frudan Terraform kodunda veya de\u011fi\u015fken dosyalar\u0131nda d\u00fcz metin olarak saklamay\u0131n. Bunun yerine, AWS Secrets Manager, Azure Key Vault, HashiCorp Vault gibi s\u0131r y\u00f6netim hizmetlerini kullan\u0131n. Terraform, bu hizmetlerden s\u0131rlar\u0131 dinamik olarak \u00e7ekebilir. Ayr\u0131ca, hassas \u00e7\u0131kt\u0131lar\u0131 CLI'da gizlemek i\u00e7in <code>sensitive = true<\/code> \u00f6zniteli\u011fini kullan\u0131n.<\/p>\n<h3 id=\"terraform-fmt-ve-terraform-validate-komutlari-ne ise yarar\"><code>terraform fmt<\/code> ve <code>terraform validate<\/code> komutlar\u0131 ne i\u015fe yarar?<\/h3>\n<p><code>terraform fmt<\/code>, Terraform yap\u0131land\u0131rma dosyalar\u0131n\u0131z\u0131 otomatik olarak standart bir formata getirir ve kod stilini tutarl\u0131 hale getirir. <code>terraform validate<\/code> ise, kodunuzun s\u00f6zdizimsel olarak do\u011fru olup olmad\u0131\u011f\u0131n\u0131 kontrol eder ve referanslar\u0131n ge\u00e7erlili\u011fini do\u011frular. Bu komutlar, kod kalitesini art\u0131rmak ve da\u011f\u0131t\u0131m \u00f6ncesi hatalar\u0131 yakalamak i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Da\u011f\u0131n\u0131k ve y\u00f6netimi zor bir altyap\u0131 kod taban\u0131yla bo\u011fu\u015fmak, geli\u015ftirme s\u00fcre\u00e7lerinizi yava\u015flatabilir, hatalara yol a\u00e7abilir ve ekip verimlili\u011fini&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-36123","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 Temiz Proje Yap\u0131s\u0131: En \u0130yi Uygulamalar ve Stratejiler<\/title>\n<meta name=\"description\" content=\"Da\u011f\u0131n\u0131k ve y\u00f6netimi zor bir altyap\u0131 kod taban\u0131yla bo\u011fu\u015fmak, geli\u015ftirme s\u00fcre\u00e7lerinizi yava\u015flatabilir, hatalara yol a\u00e7abilir ve ekip verimlili\u011fini d\u00fc\u015f\u00fcrebilir. Peki, karma\u015f\u0131k Terraform projelerinizi anla\u015f\u0131l\u0131r, s\u00fcrd\u00fcr\u00fclebilir ve \u00f6l\u00e7eklenebilir bir yap\u0131ya nas\u0131l d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz?\" \/>\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-temiz-proje-yapisi-en-iyi-uygulamalar-ve-stratejiler\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Terraform Temiz Proje Yap\u0131s\u0131: En \u0130yi Uygulamalar ve Stratejiler\" \/>\n<meta property=\"og:description\" content=\"Da\u011f\u0131n\u0131k ve y\u00f6netimi zor bir altyap\u0131 kod taban\u0131yla bo\u011fu\u015fmak, geli\u015ftirme s\u00fcre\u00e7lerinizi yava\u015flatabilir, hatalara yol a\u00e7abilir ve ekip verimlili\u011fini d\u00fc\u015f\u00fcrebilir. Peki, karma\u015f\u0131k Terraform projelerinizi anla\u015f\u0131l\u0131r, s\u00fcrd\u00fcr\u00fclebilir ve \u00f6l\u00e7eklenebilir bir yap\u0131ya nas\u0131l d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz?\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/terraform-temiz-proje-yapisi-en-iyi-uygulamalar-ve-stratejiler\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-08T13:01:12+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=\"27 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-temiz-proje-yapisi-en-iyi-uygulamalar-ve-stratejiler\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-temiz-proje-yapisi-en-iyi-uygulamalar-ve-stratejiler\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Terraform Temiz Proje Yap\u0131s\u0131: En \u0130yi Uygulamalar ve Stratejiler\",\"datePublished\":\"2025-12-08T13:01:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-temiz-proje-yapisi-en-iyi-uygulamalar-ve-stratejiler\/\"},\"wordCount\":4638,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/terraform-temiz-proje-yapisi-en-iyi-uygulamalar-ve-stratejiler\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-temiz-proje-yapisi-en-iyi-uygulamalar-ve-stratejiler\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/terraform-temiz-proje-yapisi-en-iyi-uygulamalar-ve-stratejiler\/\",\"name\":\"Terraform Temiz Proje Yap\u0131s\u0131: En \u0130yi Uygulamalar ve Stratejiler\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-08T13:01:12+00:00\",\"description\":\"Da\u011f\u0131n\u0131k ve y\u00f6netimi zor bir altyap\u0131 kod taban\u0131yla bo\u011fu\u015fmak, geli\u015ftirme s\u00fcre\u00e7lerinizi yava\u015flatabilir, hatalara yol a\u00e7abilir ve ekip verimlili\u011fini d\u00fc\u015f\u00fcrebilir. Peki, karma\u015f\u0131k Terraform projelerinizi anla\u015f\u0131l\u0131r, s\u00fcrd\u00fcr\u00fclebilir ve \u00f6l\u00e7eklenebilir bir yap\u0131ya nas\u0131l d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz?\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-temiz-proje-yapisi-en-iyi-uygulamalar-ve-stratejiler\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/terraform-temiz-proje-yapisi-en-iyi-uygulamalar-ve-stratejiler\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-temiz-proje-yapisi-en-iyi-uygulamalar-ve-stratejiler\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Terraform Temiz Proje Yap\u0131s\u0131: En \u0130yi Uygulamalar ve Stratejiler\"}]},{\"@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 Temiz Proje Yap\u0131s\u0131: En \u0130yi Uygulamalar ve Stratejiler","description":"Da\u011f\u0131n\u0131k ve y\u00f6netimi zor bir altyap\u0131 kod taban\u0131yla bo\u011fu\u015fmak, geli\u015ftirme s\u00fcre\u00e7lerinizi yava\u015flatabilir, hatalara yol a\u00e7abilir ve ekip verimlili\u011fini d\u00fc\u015f\u00fcrebilir. Peki, karma\u015f\u0131k Terraform projelerinizi anla\u015f\u0131l\u0131r, s\u00fcrd\u00fcr\u00fclebilir ve \u00f6l\u00e7eklenebilir bir yap\u0131ya nas\u0131l d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz?","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-temiz-proje-yapisi-en-iyi-uygulamalar-ve-stratejiler\/","og_locale":"tr_TR","og_type":"article","og_title":"Terraform Temiz Proje Yap\u0131s\u0131: En \u0130yi Uygulamalar ve Stratejiler","og_description":"Da\u011f\u0131n\u0131k ve y\u00f6netimi zor bir altyap\u0131 kod taban\u0131yla bo\u011fu\u015fmak, geli\u015ftirme s\u00fcre\u00e7lerinizi yava\u015flatabilir, hatalara yol a\u00e7abilir ve ekip verimlili\u011fini d\u00fc\u015f\u00fcrebilir. Peki, karma\u015f\u0131k Terraform projelerinizi anla\u015f\u0131l\u0131r, s\u00fcrd\u00fcr\u00fclebilir ve \u00f6l\u00e7eklenebilir bir yap\u0131ya nas\u0131l d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz?","og_url":"https:\/\/fatihsoysal.com\/blog\/terraform-temiz-proje-yapisi-en-iyi-uygulamalar-ve-stratejiler\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-08T13:01:12+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"27 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/terraform-temiz-proje-yapisi-en-iyi-uygulamalar-ve-stratejiler\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/terraform-temiz-proje-yapisi-en-iyi-uygulamalar-ve-stratejiler\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Terraform Temiz Proje Yap\u0131s\u0131: En \u0130yi Uygulamalar ve Stratejiler","datePublished":"2025-12-08T13:01:12+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/terraform-temiz-proje-yapisi-en-iyi-uygulamalar-ve-stratejiler\/"},"wordCount":4638,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/terraform-temiz-proje-yapisi-en-iyi-uygulamalar-ve-stratejiler\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/terraform-temiz-proje-yapisi-en-iyi-uygulamalar-ve-stratejiler\/","url":"https:\/\/fatihsoysal.com\/blog\/terraform-temiz-proje-yapisi-en-iyi-uygulamalar-ve-stratejiler\/","name":"Terraform Temiz Proje Yap\u0131s\u0131: En \u0130yi Uygulamalar ve Stratejiler","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-08T13:01:12+00:00","description":"Da\u011f\u0131n\u0131k ve y\u00f6netimi zor bir altyap\u0131 kod taban\u0131yla bo\u011fu\u015fmak, geli\u015ftirme s\u00fcre\u00e7lerinizi yava\u015flatabilir, hatalara yol a\u00e7abilir ve ekip verimlili\u011fini d\u00fc\u015f\u00fcrebilir. Peki, karma\u015f\u0131k Terraform projelerinizi anla\u015f\u0131l\u0131r, s\u00fcrd\u00fcr\u00fclebilir ve \u00f6l\u00e7eklenebilir bir yap\u0131ya nas\u0131l d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz?","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/terraform-temiz-proje-yapisi-en-iyi-uygulamalar-ve-stratejiler\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/terraform-temiz-proje-yapisi-en-iyi-uygulamalar-ve-stratejiler\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/terraform-temiz-proje-yapisi-en-iyi-uygulamalar-ve-stratejiler\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Terraform Temiz Proje Yap\u0131s\u0131: En \u0130yi Uygulamalar ve Stratejiler"}]},{"@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\/36123","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=36123"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36123\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36123"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36123"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36123"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}