{"id":32982,"date":"2025-10-28T04:41:15","date_gmt":"2025-10-28T01:41:15","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=32982"},"modified":"2025-10-28T04:41:15","modified_gmt":"2025-10-28T01:41:15","slug":"terraform-degiskenleri-bagimliliklari-ve-kosullu-yapilar-kullanarak-esnekligi-artirma","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-bagimliliklari-ve-kosullu-yapilar-kullanarak-esnekligi-artirma\/","title":{"rendered":"Terraform De\u011fi\u015fkenleri, Ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve Ko\u015fullu Yap\u0131lar Kullanarak Esnekli\u011fi Art\u0131rma"},"content":{"rendered":"<p><body><\/p>\n<h2>Terraform De\u011fi\u015fkenleri, Ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve Ko\u015fullu Yap\u0131lar Kullanarak Esnekli\u011fi Art\u0131rma<\/h2>\n<p>Altyap\u0131 otomasyonu, modern yaz\u0131l\u0131m geli\u015ftirme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinin temel ta\u015flar\u0131ndan biridir. Manuel i\u015flemlerin yerini alarak h\u0131z\u0131, tutarl\u0131l\u0131\u011f\u0131 ve \u00f6l\u00e7eklenebilirli\u011fi art\u0131ran ara\u00e7lar aras\u0131nda Terraform, &#8220;altyap\u0131y\u0131 kod olarak&#8221; (Infrastructure as Code &#8211; IaC) prensibini benimseyen lider \u00e7\u00f6z\u00fcmlerden biridir. Ancak altyap\u0131y\u0131 sadece kodlamak yeterli de\u011fildir; bu kodun farkl\u0131 ortamlar, de\u011fi\u015fen gereksinimler ve gelecekteki geni\u015flemeler kar\u015f\u0131s\u0131nda esnek ve uyarlanabilir olmas\u0131 hayati \u00f6nem ta\u015f\u0131r. Bu makale, Terraform&#8217;un sundu\u011fu \u00fc\u00e7 temel mekanizma olan de\u011fi\u015fkenler (variables), ba\u011f\u0131ml\u0131l\u0131klar (dependencies) ve ko\u015fullu yap\u0131lar (conditionals) arac\u0131l\u0131\u011f\u0131yla altyap\u0131 kodunuzun esnekli\u011fini nas\u0131l art\u0131rabilece\u011finizi detayl\u0131 bir \u015fekilde inceleyecektir. Bu ara\u00e7lar\u0131 etkili bir \u015fekilde birle\u015ftirerek, dinamik, yeniden kullan\u0131labilir ve s\u00fcrd\u00fcr\u00fclebilir altyap\u0131 \u00e7\u00f6z\u00fcmleri olu\u015fturman\u0131n yollar\u0131n\u0131 ke\u015ffedece\u011fiz.<\/p>\n<h2>Terraform De\u011fi\u015fkenleri: Esnek Yap\u0131 Ta\u015flar\u0131<\/h2>\n<p>Terraform de\u011fi\u015fkenleri, altyap\u0131 yap\u0131land\u0131rmalar\u0131n\u0131 parametrele\u015ftirmemizi sa\u011flayarak kodumuzun farkl\u0131 senaryolara kolayca adapte olabilmesine olanak tan\u0131r. Statik de\u011ferler yerine dinamik girdiler kullanarak, ayn\u0131 Terraform kodunu farkl\u0131 ortamlar (geli\u015ftirme, test, \u00fcretim), farkl\u0131 b\u00f6lgeler veya farkl\u0131 m\u00fc\u015fteri gereksinimleri i\u00e7in uygulayabiliriz. Terraform, \u00fc\u00e7 ana de\u011fi\u015fken t\u00fcr\u00fc sunar: giri\u015f de\u011fi\u015fkenleri, yerel de\u011fi\u015fkenler ve \u00e7\u0131k\u0131\u015f de\u011fi\u015fkenleri.<\/p>\n<h3>Giri\u015f De\u011fi\u015fkenleri (<code>variable<\/code> bloklar\u0131)<\/h3>\n<p>Giri\u015f de\u011fi\u015fkenleri, bir Terraform yap\u0131land\u0131rmas\u0131na d\u0131\u015far\u0131dan de\u011fer sa\u011flamak i\u00e7in kullan\u0131l\u0131r. Bu sayede, altyap\u0131 kodunuzu de\u011fi\u015ftirmeden farkl\u0131 da\u011f\u0131t\u0131m senaryolar\u0131n\u0131 y\u00f6netebilirsiniz. \u00d6rne\u011fin, bir sanal makinenin boyutunu, bir veritaban\u0131 ad\u0131n\u0131 veya da\u011f\u0131t\u0131m ortam\u0131n\u0131 bir de\u011fi\u015fken arac\u0131l\u0131\u011f\u0131yla belirleyebilirsiniz.<\/p>\n<p>Bir giri\u015f de\u011fi\u015fkeni <code>variables.tf<\/code> gibi bir dosyada a\u015fa\u011f\u0131daki gibi tan\u0131mlan\u0131r:<\/p>\n<pre><code class=\"language-terraform\">variable \"environment\" {\n  description = \"Da\u011f\u0131t\u0131m ortam\u0131 (dev, staging, prod)\"\n  type        = string\n  default     = \"dev\"\n  validation {\n    condition     = contains([\"dev\", \"staging\", \"prod\"], var.environment)\n    error_message = \"Ortam de\u011feri 'dev', 'staging' veya 'prod' olmal\u0131d\u0131r.\"\n  }\n}\n\nvariable \"instance_type\" {\n  description = \"EC2 instance tipi\"\n  type        = string\n  default     = \"t2.micro\"\n}\n\nvariable \"db_password\" {\n  description = \"Veritaban\u0131 parolas\u0131\"\n  type        = string\n  sensitive   = true\n}<\/code><\/pre>\n<p>*   <code>description<\/code>: De\u011fi\u015fkenin amac\u0131n\u0131 a\u00e7\u0131klayan bir metin. \u0130yi yaz\u0131lm\u0131\u015f a\u00e7\u0131klamalar, kodun okunabilirli\u011fini ve anla\u015f\u0131l\u0131rl\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<br \/>\n*   <code>type<\/code>: De\u011fi\u015fkenin alabilece\u011fi veri t\u00fcr\u00fcn\u00fc belirtir (string, number, bool, list, map, object, set). Tip k\u0131s\u0131tlamalar\u0131, yanl\u0131\u015f veri giri\u015fi nedeniyle olu\u015fabilecek hatalar\u0131 engeller.<br \/>\n*   <code>default<\/code>: De\u011fi\u015fken i\u00e7in varsay\u0131lan bir de\u011fer tan\u0131mlar. E\u011fer d\u0131\u015far\u0131dan bir de\u011fer sa\u011flanmazsa bu de\u011fer kullan\u0131l\u0131r. Bu, iste\u011fe ba\u011fl\u0131 parametreler i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<br \/>\n*   <code>sensitive<\/code>: De\u011fi\u015fkenin hassas veri i\u00e7erdi\u011fini belirtir. <code>terraform plan<\/code> veya <code>terraform apply<\/code> \u00e7\u0131kt\u0131lar\u0131nda bu de\u011fi\u015fkenin de\u011feri gizlenir. G\u00fcvenlik a\u00e7\u0131s\u0131ndan kritik bir \u00f6zelliktir.<br \/>\n*   <code>validation<\/code>: De\u011fi\u015fkenin de\u011ferini do\u011frulamak i\u00e7in \u00f6zel kurallar tan\u0131mlaman\u0131za olanak tan\u0131r. Ko\u015ful ba\u015far\u0131s\u0131z olursa, belirtilen <code>error_message<\/code> ile bir hata d\u00f6nd\u00fcr\u00fcl\u00fcr.<\/p>\n<p>Giri\u015f de\u011fi\u015fkenlerine de\u011fer ataman\u0131n birka\u00e7 yolu vard\u0131r:<br \/>\n*   <strong>Varsay\u0131lan de\u011ferler:<\/strong> De\u011fi\u015fken tan\u0131m\u0131nda belirtilen <code>default<\/code> de\u011feri.<br \/>\n<em>   <strong><code>terraform.tfvars<\/code> dosyalar\u0131:<\/strong> <code>terraform.tfvars<\/code> veya <code><\/em>.auto.tfvars<\/code> uzant\u0131l\u0131 dosyalar otomatik olarak y\u00fcklenir. \u00d6rne\u011fin, <code>environment = \"prod\"<\/code>.<br \/>\n*   <strong>CLI arg\u00fcmanlar\u0131:<\/strong> <code>terraform apply -var=\"environment=prod\"<\/code>.<br \/>\n*   <strong>Ortam de\u011fi\u015fkenleri:<\/strong> <code>TF_VAR_environment=prod<\/code> gibi ortam de\u011fi\u015fkenleri.<\/p>\n<p>Bu mekanizmalar, ayn\u0131 Terraform kodunu farkl\u0131 yap\u0131land\u0131rmalarla \u00e7al\u0131\u015ft\u0131rma esnekli\u011fi sa\u011flar.<\/p>\n<h3>Yerel De\u011fi\u015fkenler (<code>locals<\/code> bloklar\u0131)<\/h3>\n<p>Yerel de\u011fi\u015fkenler, bir mod\u00fcl veya yap\u0131land\u0131rma i\u00e7inde karma\u015f\u0131k ifadeleri basitle\u015ftirmek, tekrar eden de\u011ferleri merkezi hale getirmek ve kodun okunabilirli\u011fini art\u0131rmak i\u00e7in kullan\u0131l\u0131r. Genellikle, birden fazla kaynak taraf\u0131ndan kullan\u0131lan veya karma\u015f\u0131k mant\u0131k i\u00e7eren de\u011ferleri hesaplamak i\u00e7in tercih edilirler.<\/p>\n<pre><code class=\"language-terraform\">locals {\n  common_tags = {\n    Project     = \"MyWebApp\"\n    Environment = var.environment\n    ManagedBy   = \"Terraform\"\n  }\n  instance_name = \"${var.environment}-${var.instance_type}-instance\"\n}\n\nresource \"aws_instance\" \"web\" {\n  ami           = \"ami-0abcdef1234567890\" # \u00d6rnek AMI\n  instance_type = var.instance_type\n  tags          = local.common_tags\n}<\/code><\/pre>\n<p><code>locals<\/code> bloklar\u0131, kodunuzda &#8220;Don&#8217;t Repeat Yourself&#8221; (DRY) prensibini uygulaman\u0131za yard\u0131mc\u0131 olur. Karma\u015f\u0131k hesaplamalar\u0131 tek bir yerde yaparak, kodunuzu daha az hataya a\u00e7\u0131k ve daha kolay s\u00fcrd\u00fcr\u00fclebilir hale getirirsiniz.<\/p>\n<h3>\u00c7\u0131k\u0131\u015f De\u011fi\u015fkenleri (<code>output<\/code> bloklar\u0131)<\/h3>\n<p>\u00c7\u0131k\u0131\u015f de\u011fi\u015fkenleri, bir Terraform yap\u0131land\u0131rmas\u0131n\u0131n veya mod\u00fcl\u00fcn\u00fcn d\u0131\u015f d\u00fcnyaya sundu\u011fu de\u011ferlerdir. Bu de\u011ferler, ba\u015fka bir Terraform yap\u0131land\u0131rmas\u0131 taraf\u0131ndan girdi olarak kullan\u0131labilir, CI\/CD boru hatlar\u0131nda t\u00fcketilebilir veya kullan\u0131c\u0131ya \u00f6nemli bilgileri (\u00f6rne\u011fin, bir y\u00fck dengeleyicinin DNS ad\u0131, bir veritaban\u0131n\u0131n ba\u011flant\u0131 dizgesi) g\u00f6stermek i\u00e7in kullan\u0131labilir.<\/p>\n<pre><code class=\"language-terraform\">output \"web_server_ip\" {\n  description = \"Web sunucusunun genel IP adresi\"\n  value       = aws_instance.web.public_ip\n}\n\noutput \"db_endpoint\" {\n  description = \"Veritaban\u0131 ba\u011flant\u0131 adresi\"\n  value       = aws_db_instance.main.address\n  sensitive   = true\n}<\/code><\/pre>\n<p>\u00c7\u0131k\u0131\u015f de\u011fi\u015fkenleri, mod\u00fcler Terraform mimarilerinde kritik bir rol oynar. Bir mod\u00fcl\u00fcn sa\u011flad\u0131\u011f\u0131 altyap\u0131 bile\u015fenlerinin \u00f6zelliklerini di\u011fer mod\u00fcllere veya \u00fcst d\u00fczey yap\u0131land\u0131rmalara aktararak, altyap\u0131 bile\u015fenleri aras\u0131nda etkili bir ileti\u015fim ve entegrasyon sa\u011flarlar. <code>sensitive<\/code> flag&#8217;i burada da hassas bilgilerin konsol \u00e7\u0131kt\u0131lar\u0131nda g\u00f6r\u00fcnmesini engeller.<\/p>\n<h2>Terraform Ba\u011f\u0131ml\u0131l\u0131klar\u0131: Kaynaklar Aras\u0131 \u0130li\u015fkileri Y\u00f6netme<\/h2>\n<p>Terraform, altyap\u0131 kaynaklar\u0131 aras\u0131ndaki ili\u015fkileri (ba\u011f\u0131ml\u0131l\u0131klar\u0131) anlayarak kaynaklar\u0131n do\u011fru s\u0131rayla olu\u015fturulmas\u0131n\u0131, g\u00fcncellenmesini ve silinmesini sa\u011flar. Bu, altyap\u0131n\u0131z\u0131n tutarl\u0131 ve \u00f6ng\u00f6r\u00fclebilir bir durumda kalmas\u0131n\u0131 garanti eder. \u0130ki t\u00fcr ba\u011f\u0131ml\u0131l\u0131k vard\u0131r: \u00f6rt\u00fcl\u00fc ba\u011f\u0131ml\u0131l\u0131klar ve a\u00e7\u0131k ba\u011f\u0131ml\u0131l\u0131klar.<\/p>\n<h3>\u00d6rt\u00fcl\u00fc Ba\u011f\u0131ml\u0131l\u0131klar<\/h3>\n<p>Terraform&#8217;un en g\u00fc\u00e7l\u00fc \u00f6zelliklerinden biri, kaynaklar aras\u0131ndaki ba\u011f\u0131ml\u0131l\u0131klar\u0131 otomatik olarak alg\u0131layabilmesidir. Bir kaynak, ba\u015fka bir kayna\u011f\u0131n niteli\u011fine (\u00f6rne\u011fin, ID, IP adresi, DNS ad\u0131) referans verdi\u011finde, Terraform bu iki kaynak aras\u0131nda \u00f6rt\u00fcl\u00fc bir ba\u011f\u0131ml\u0131l\u0131k oldu\u011funu anlar. Bu, referans verilen kayna\u011f\u0131n, referans veren kaynaktan \u00f6nce olu\u015fturulmas\u0131 gerekti\u011fi anlam\u0131na gelir.<\/p>\n<pre><code class=\"language-terraform\">resource \"aws_vpc\" \"main\" {\n  cidr_block = \"10.0.0.0\/16\"\n  tags = {\n    Name = \"main-vpc\"\n  }\n}\n\nresource \"aws_subnet\" \"public\" {\n  vpc_id            = aws_vpc.main.id # aws_vpc.main kayna\u011f\u0131na referans\n  cidr_block        = \"10.0.1.0\/24\"\n  availability_zone = \"us-east-1a\"\n}\n\nresource \"aws_instance\" \"web\" {\n  ami           = \"ami-0abcdef1234567890\"\n  instance_type = \"t2.micro\"\n  subnet_id     = aws_subnet.public.id # aws_subnet.public kayna\u011f\u0131na referans\n}<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte:<br \/>\n*   <code>aws_subnet.public<\/code>, <code>aws_vpc.main<\/code>&#8216;in <code>id<\/code>&#8216;sine referans verdi\u011fi i\u00e7in, VPC&#8217;nin alt a\u011fdan \u00f6nce olu\u015fturulmas\u0131 gerekir.<br \/>\n*   <code>aws_instance.web<\/code>, <code>aws_subnet.public<\/code>&#8216;in <code>id<\/code>&#8216;sine referans verdi\u011fi i\u00e7in, alt a\u011f\u0131n EC2 instance&#8217;\u0131ndan \u00f6nce olu\u015fturulmas\u0131 gerekir.<\/p>\n<p>Terraform, bu referanslar\u0131 analiz ederek bir kaynak grafi\u011fi (resource graph) olu\u015fturur ve kaynaklar\u0131 bu grafikteki s\u0131raya g\u00f6re y\u00f6netir. Bu, \u00e7o\u011fu senaryoda yeterli ve tercih edilen bir y\u00f6ntemdir, \u00e7\u00fcnk\u00fc kodun daha temiz ve anla\u015f\u0131l\u0131r kalmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>A\u00e7\u0131k Ba\u011f\u0131ml\u0131l\u0131klar (<code>depends_on<\/code>)<\/h3>\n<p>Baz\u0131 durumlarda, Terraform&#8217;un otomatik olarak alg\u0131layamad\u0131\u011f\u0131, ancak belirli bir s\u0131ran\u0131n garanti edilmesi gereken ba\u011f\u0131ml\u0131l\u0131klar olabilir. Bu gibi durumlar i\u00e7in <code>depends_on<\/code> meta-arg\u00fcman\u0131 kullan\u0131l\u0131r. <code>depends_on<\/code>, bir kayna\u011f\u0131n belirtilen di\u011fer kaynaklar tamamlanana kadar olu\u015fturulmas\u0131n\u0131 veya g\u00fcncellenmesini geciktirir.<\/p>\n<pre><code class=\"language-terraform\">resource \"aws_s3_bucket\" \"my_bucket\" {\n  bucket = \"my-unique-bucket-name-12345\"\n}\n\nresource \"aws_iam_policy\" \"s3_access\" {\n  name        = \"s3-access-policy\"\n  description = \"Allows read access to my S3 bucket\"\n  policy      = jsonencode({\n    Version   = \"2012-10-17\"\n    Statement = [\n      {\n        Action   = [\"s3:GetObject\"]\n        Effect   = \"Allow\"\n        Resource = \"${aws_s3_bucket.my_bucket.arn}\/*\"\n      },\n    ]\n  })\n}\n\nresource \"aws_iam_user\" \"app_user\" {\n  name = \"app-user\"\n}\n\nresource \"aws_iam_user_policy_attachment\" \"app_user_s3_attach\" {\n  user       = aws_iam_user.app_user.name\n  policy_arn = aws_iam_policy.s3_access.arn\n  depends_on = [\n    aws_s3_bucket.my_bucket # S3 kovas\u0131 ve IAM politikas\u0131 haz\u0131r olmadan kullan\u0131c\u0131n\u0131n politikas\u0131 atanmas\u0131n\n  ]\n}<\/code><\/pre>\n<p><code>depends_on<\/code> genellikle \u015fu durumlarda kullan\u0131l\u0131r:<br \/>\n*   Bir kayna\u011f\u0131n olu\u015fturulmas\u0131 veya g\u00fcncellenmesi, ba\u015fka bir kayna\u011f\u0131n varl\u0131\u011f\u0131n\u0131 gerektiren ancak do\u011frudan bir nitelik referans\u0131 olmayan senaryolar.<br \/>\n*   Sa\u011flay\u0131c\u0131 (provider) yap\u0131land\u0131rmalar\u0131 gibi, do\u011frudan bir kaynak \u00e7\u0131kt\u0131s\u0131 \u00fcretmeyen ancak bir eylemi tetikleyen durumlarda.<br \/>\n*   Baz\u0131 nadir &#8220;race condition&#8221; durumlar\u0131n\u0131 \u00f6nlemek i\u00e7in.<\/p>\n<p>Ancak, <code>depends_on<\/code> gereksiz yere kullan\u0131ld\u0131\u011f\u0131nda kodun okunabilirli\u011fini azalt\u0131r ve kaynak grafi\u011fini manuel olarak y\u00f6netmek zorunda kal\u0131rs\u0131n\u0131z. M\u00fcmk\u00fcn oldu\u011funca \u00f6rt\u00fcl\u00fc ba\u011f\u0131ml\u0131l\u0131klar\u0131 kullanmaya \u00f6zen g\u00f6sterin.<\/p>\n<h3>Kaynak Grafi\u011fi ve Paralel Y\u00fcr\u00fctme<\/h3>\n<p>Terraform, yap\u0131land\u0131rman\u0131zdaki t\u00fcm kaynaklar\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131 temsil eden bir y\u00f6nl\u00fc d\u00f6ng\u00fcsel grafik (Directed Acyclic Graph &#8211; DAG) olu\u015fturur. Bu grafik, kaynaklar\u0131n olu\u015fturulma, g\u00fcncellenme ve silinme s\u0131ras\u0131n\u0131 belirler. Ba\u011f\u0131ms\u0131z kaynaklar veya ba\u011f\u0131ml\u0131l\u0131k zincirlerinin farkl\u0131 dallar\u0131ndaki kaynaklar paralel olarak y\u00fcr\u00fct\u00fclebilir, bu da da\u011f\u0131t\u0131m s\u00fcresini \u00f6nemli \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r. Ba\u011f\u0131ml\u0131l\u0131klar\u0131 do\u011fru bir \u015fekilde tan\u0131mlamak, hem altyap\u0131n\u0131z\u0131n tutarl\u0131l\u0131\u011f\u0131n\u0131 garanti eder hem de da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizin verimlili\u011fini art\u0131r\u0131r.<\/p>\n<h2>Terraform Ko\u015fullu Mant\u0131k: Dinamik Kararlar Alma<\/h2>\n<p>Esnek bir altyap\u0131 kodunun en \u00f6nemli y\u00f6nlerinden biri, belirli ko\u015fullara ba\u011fl\u0131 olarak farkl\u0131 kararlar alabilmesidir. Terraform, bu t\u00fcr dinamik davran\u0131\u015flar\u0131 sa\u011flamak i\u00e7in \u00e7e\u015fitli ko\u015fullu yap\u0131lar\u0131 sunar.<\/p>\n<h3><code>count<\/code> Meta-arg\u00fcman\u0131: Ko\u015fullu Kaynak Olu\u015fturma ve \u00c7oklama<\/h3>\n<p><code>count<\/code> meta-arg\u00fcman\u0131, bir kayna\u011f\u0131n s\u0131f\u0131r veya daha fazla \u00f6rne\u011fini olu\u015fturmak i\u00e7in kullan\u0131l\u0131r. <code>count<\/code> de\u011feri s\u0131f\u0131r ise, kaynak olu\u015fturulmaz. Bu, belirli ko\u015fullar alt\u0131nda bir kayna\u011f\u0131n varl\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in g\u00fc\u00e7l\u00fc bir mekanizmad\u0131r.<\/p>\n<pre><code class=\"language-terraform\">variable \"create_s3_bucket\" {\n  description = \"S3 kovas\u0131 olu\u015fturulmal\u0131 m\u0131?\"\n  type        = bool\n  default     = true\n}\n\nresource \"aws_s3_bucket\" \"my_bucket\" {\n  count  = var.create_s3_bucket ? 1 : 0 # De\u011fi\u015fkene g\u00f6re kova olu\u015ftur\n  bucket = \"my-conditional-bucket-${count.index}\"\n}\n\nvariable \"num_web_servers\" {\n  description = \"Ka\u00e7 adet web sunucusu olu\u015fturulacak?\"\n  type        = number\n  default     = 1\n}\n\nresource \"aws_instance\" \"web\" {\n  count         = var.num_web_servers # De\u011fi\u015fkene g\u00f6re birden fazla instance olu\u015ftur\n  ami           = \"ami-0abcdef1234567890\"\n  instance_type = \"t2.micro\"\n  tags = {\n    Name = \"web-server-${count.index}\"\n  }\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>create_s3_bucket<\/code> de\u011fi\u015fkeni <code>false<\/code> olarak ayarlan\u0131rsa S3 kovas\u0131 olu\u015fturulmayacakt\u0131r. Benzer \u015fekilde, <code>num_web_servers<\/code> de\u011fi\u015fkeni sayesinde kolayca birden fazla web sunucusu \u00f6rne\u011fi olu\u015fturulabilir. <code>count.index<\/code> de\u011feri, her bir \u00f6rnek i\u00e7in benzersiz isimler veya di\u011fer nitelikler olu\u015fturmak i\u00e7in kullan\u0131labilir.<\/p>\n<h3><code>for_each<\/code> Meta-arg\u00fcman\u0131: Daha Geli\u015fmi\u015f \u0130terasyon<\/h3>\n<p><code>for_each<\/code> meta-arg\u00fcman\u0131, <code>count<\/code>&#8216;a benzer \u015fekilde kaynak \u00f6rnekleri olu\u015fturmak i\u00e7in kullan\u0131l\u0131r, ancak bir harita (map) veya setin (set) elemanlar\u0131 \u00fczerinden iterasyon yapar. Bu, her bir kayna\u011fa daha anlaml\u0131 anahtarlar ataman\u0131za ve daha dinamik koleksiyonlar olu\u015fturman\u0131za olanak tan\u0131r.<\/p>\n<pre><code class=\"language-terraform\">variable \"security_groups\" {\n  description = \"Ortama \u00f6zg\u00fc g\u00fcvenlik grubu kurallar\u0131 haritas\u0131\"\n  type = map(object({\n    description = string\n    ingress_ports = list(number)\n    egress_ports  = list(number)\n  }))\n  default = {\n    \"web\" = {\n      description = \"Web sunucusu g\u00fcvenlik grubu\"\n      ingress_ports = [80, 443]\n      egress_ports  = [0] # T\u00fcm \u00e7\u0131k\u0131\u015fa izin ver\n    },\n    \"db\" = {\n      description = \"Veritaban\u0131 g\u00fcvenlik grubu\"\n      ingress_ports = [3306]\n      egress_ports  = [0]\n    }\n  }\n}\n\nresource \"aws_security_group\" \"app_sgs\" {\n  for_each    = var.security_groups\n  name        = \"${each.key}-sg-${var.environment}\"\n  description = each.value.description\n  vpc_id      = aws_vpc.main.id\n\n  dynamic \"ingress\" {\n    for_each = each.value.ingress_ports\n    content {\n      from_port   = ingress.value\n      to_port     = ingress.value\n      protocol    = \"tcp\"\n      cidr_blocks = [\"0.0.0.0\/0\"]\n    }\n  }\n\n  dynamic \"egress\" {\n    for_each = each.value.egress_ports\n    content {\n      from_port   = egress.value\n      to_port     = egress.value\n      protocol    = \"tcp\"\n      cidr_blocks = [\"0.0.0.0\/0\"]\n    }\n  }\n}<\/code><\/pre>\n<p><code>for_each<\/code> ile olu\u015fturulan kaynaklar, <code>each.key<\/code> ve <code>each.value<\/code> kullan\u0131larak benzersiz bir \u015fekilde tan\u0131mlan\u0131r. Bu, \u00f6zellikle farkl\u0131 \u00f6zelliklere sahip benzer kaynaklar\u0131 (\u00f6rne\u011fin, farkl\u0131 g\u00fcvenlik gruplar\u0131, farkl\u0131 a\u011f aray\u00fczleri) y\u00f6netirken <code>count<\/code>&#8216;tan daha esnek bir yakla\u015f\u0131m sunar. Kaynaklar, harita anahtarlar\u0131 \u00fczerinden referans al\u0131nabilir, bu da de\u011fi\u015fikliklerin daha \u00f6ng\u00f6r\u00fclebilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Ternary Operat\u00f6r (<code>condition ? true_val : false_val<\/code>)<\/h3>\n<p>Ternary operat\u00f6r, bir ko\u015fula ba\u011fl\u0131 olarak bir niteli\u011fe farkl\u0131 de\u011ferler atamak i\u00e7in kullan\u0131l\u0131r. Tek bir sat\u0131rda basit ko\u015fullu mant\u0131k uygulamak i\u00e7in olduk\u00e7a kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code class=\"language-terraform\">variable \"is_production\" {\n  description = \"Ortam \u00fcretim mi?\"\n  type        = bool\n  default     = false\n}\n\nresource \"aws_instance\" \"app_server\" {\n  ami           = \"ami-0abcdef1234567890\"\n  instance_type = var.is_production ? \"m5.large\" : \"t2.micro\" # \u00dcretimse m5.large, de\u011filse t2.micro\n  tags = {\n    Environment = var.is_production ? \"Production\" : \"Development\"\n  }\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>is_production<\/code> de\u011fi\u015fkenine ba\u011fl\u0131 olarak EC2 instance tipi ve <code>Environment<\/code> etiketi dinamik olarak belirlenir. Bu, ayn\u0131 kod taban\u0131n\u0131 kullanarak farkl\u0131 ortamlar i\u00e7in farkl\u0131 yap\u0131land\u0131rmalar sa\u011flaman\u0131n basit ve etkili bir yoludur.<\/p>\n<h3><code>dynamic<\/code> Bloklar: Ko\u015fullu \u0130\u00e7 Bloklar<\/h3>\n<p><code>dynamic<\/code> bloklar, bir kayna\u011f\u0131n i\u00e7inde tekrarlayan veya ko\u015fullu olarak olu\u015fturulmas\u0131 gereken i\u00e7 bloklar\u0131 (nested blocks) y\u00f6netmek i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, bir g\u00fcvenlik grubunun <code>ingress<\/code> veya <code>egress<\/code> kurallar\u0131 gibi.<\/p>\n<p>Yukar\u0131daki <code>aws_security_group<\/code> \u00f6rne\u011finde, <code>dynamic \"ingress\"<\/code> ve <code>dynamic \"egress\"<\/code> bloklar\u0131, <code>security_groups<\/code> de\u011fi\u015fkenindeki <code>ingress_ports<\/code> ve <code>egress_ports<\/code> listelerine g\u00f6re dinamik olarak g\u00fcvenlik kurallar\u0131 olu\u015fturur. Bu, karma\u015f\u0131k kaynak yap\u0131land\u0131rmalar\u0131n\u0131 daha mod\u00fcler ve okunabilir hale getirir. Her bir kural, <code>ingress.value<\/code> veya <code>egress.value<\/code> ile kendi port numaras\u0131n\u0131 alarak benzersiz bir \u015fekilde tan\u0131mlan\u0131r.<\/p>\n<h3><code>lifecycle<\/code> Blo\u011fu: Kaynak Davran\u0131\u015f\u0131n\u0131 Kontrol Etme<\/h3>\n<p><code>lifecycle<\/code> blo\u011fu, Terraform&#8217;un bir kayna\u011f\u0131 nas\u0131l y\u00f6netti\u011fi \u00fczerinde ek kontrol sa\u011flar. Bu, \u00f6zellikle operasyonel s\u00fcreklilik ve g\u00fcvenlik a\u00e7\u0131s\u0131ndan \u00f6nemlidir.<\/p>\n<pre><code class=\"language-terraform\">resource \"aws_s3_bucket\" \"critical_data\" {\n  bucket = \"my-critical-data-bucket\"\n\n  lifecycle {\n    prevent_destroy = true # Bu kovan\u0131n yanl\u0131\u015fl\u0131kla silinmesini engelle\n    ignore_changes  = [tags.ManagedBy] # Sadece bu etiketteki de\u011fi\u015fiklikleri yoksay\n  }\n}<\/code><\/pre>\n<p>*   <code>prevent_destroy = true<\/code>: Bu bayrak, kayna\u011f\u0131n <code>terraform destroy<\/code> komutuyla yanl\u0131\u015fl\u0131kla silinmesini engeller. Kritik \u00fcretim kaynaklar\u0131 i\u00e7in vazge\u00e7ilmez bir g\u00fcvenlik \u00f6nlemidir.<br \/>\n*   <code>ignore_changes = [...]<\/code>: Belirli niteliklerdeki d\u0131\u015f de\u011fi\u015fiklikleri Terraform&#8217;un yoksaymas\u0131n\u0131 sa\u011flar. \u00d6rne\u011fin, bir etiket manuel olarak de\u011fi\u015ftirildi\u011finde Terraform&#8217;un bu de\u011fi\u015fikli\u011fi geri almas\u0131n\u0131 veya kayna\u011f\u0131 yeniden olu\u015fturmas\u0131n\u0131 engelleyebilirsiniz.<br \/>\n*   <code>create_before_destroy = true<\/code>: Bir kaynak g\u00fcncellendi\u011finde, Terraform \u00f6nce yeni s\u00fcr\u00fcm\u00fc olu\u015fturur, ard\u0131ndan eski s\u00fcr\u00fcm\u00fc siler. Bu, kesintisiz g\u00fcncellemeler i\u00e7in \u00f6nemlidir.<\/p>\n<p><code>lifecycle<\/code> blo\u011fu, altyap\u0131n\u0131z\u0131n beklenmedik de\u011fi\u015fikliklere veya hatal\u0131 silme i\u015flemlerine kar\u015f\u0131 daha dayan\u0131kl\u0131 olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h2>Esnekli\u011fi Art\u0131rmak \u0130\u00e7in Bu Kavramlar\u0131 Birle\u015ftirmek<\/h2>\n<p>Terraform&#8217;un ger\u00e7ek g\u00fcc\u00fc, de\u011fi\u015fkenler, ba\u011f\u0131ml\u0131l\u0131klar ve ko\u015fullu yap\u0131lar\u0131n bir araya getirilmesiyle ortaya \u00e7\u0131kar. Bu \u00fc\u00e7 mekanizma, karma\u015f\u0131k ve dinamik altyap\u0131 senaryolar\u0131n\u0131 y\u00f6netmek i\u00e7in sinerjik bir \u015fekilde \u00e7al\u0131\u015f\u0131r.<\/p>\n<h3>Ortama \u00d6zg\u00fc Yap\u0131land\u0131rmalar<\/h3>\n<p>En yayg\u0131n kullan\u0131m senaryolar\u0131ndan biri, ayn\u0131 Terraform kodunu farkl\u0131 da\u011f\u0131t\u0131m ortamlar\u0131 (dev, staging, prod) i\u00e7in uyarlamakt\u0131r.<br \/>\n*   <strong>De\u011fi\u015fkenler:<\/strong> Bir <code>environment<\/code> de\u011fi\u015fkeni tan\u0131mlayarak ba\u015flar\u0131z.<br \/>\n*   <strong>Ko\u015fullular:<\/strong> Bu de\u011fi\u015fkene ba\u011fl\u0131 olarak <code>count<\/code> meta-arg\u00fcman\u0131 ile kaynak say\u0131s\u0131n\u0131 (\u00f6rne\u011fin, \u00fcretimde 3 web sunucusu, geli\u015ftirmede 1), ternary operat\u00f6r ile kaynak boyutunu (\u00f6rne\u011fin, \u00fcretimde <code>m5.large<\/code>, geli\u015ftirmede <code>t2.micro<\/code>) veya <code>for_each<\/code> ile farkl\u0131 g\u00fcvenlik kurallar\u0131n\u0131 dinamik olarak ayarlayabiliriz.<br \/>\n*   <strong>\u00d6rnek:<\/strong> <code>var.environment == \"prod\" ? 3 : 1<\/code> ifadesi, \u00fcretim ortam\u0131nda daha fazla kaynak \u00f6rne\u011fi olu\u015ftururken, di\u011fer ortamlarda daha az kaynak sa\u011flar. Bu, maliyetleri optimize ederken \u00fcretim ortam\u0131n\u0131n \u00f6l\u00e7eklenebilirli\u011fini garanti eder.<\/p>\n<h3>Mod\u00fcler Mimari ve Yeniden Kullan\u0131labilirlik<\/h3>\n<p>Terraform mod\u00fclleri, altyap\u0131 kodunu mant\u0131ksal birimlere ay\u0131rarak yeniden kullan\u0131labilirli\u011fi art\u0131r\u0131r.<br \/>\n*   <strong>De\u011fi\u015fkenler:<\/strong> Mod\u00fcller, giri\u015f de\u011fi\u015fkenleri arac\u0131l\u0131\u011f\u0131yla yap\u0131land\u0131r\u0131labilir ve farkl\u0131 senaryolara uyarlanabilir.<br \/>\n*   <strong>\u00c7\u0131k\u0131\u015f De\u011fi\u015fkenleri:<\/strong> Bir mod\u00fcl\u00fcn sa\u011flad\u0131\u011f\u0131 altyap\u0131 bile\u015fenlerinin nitelikleri, \u00e7\u0131k\u0131\u015f de\u011fi\u015fkenleri arac\u0131l\u0131\u011f\u0131yla di\u011fer mod\u00fcllerin veya k\u00f6k yap\u0131land\u0131rman\u0131n girdisi olarak kullan\u0131labilir. Bu, g\u00fc\u00e7l\u00fc ba\u011f\u0131ml\u0131l\u0131k zincirleri olu\u015fturur.<br \/>\n*   <strong>Ba\u011f\u0131ml\u0131l\u0131klar:<\/strong> Mod\u00fcller aras\u0131 ba\u011f\u0131ml\u0131l\u0131klar, \u00e7\u0131kt\u0131lar\u0131n bir mod\u00fclden di\u011ferine ak\u0131\u015f\u0131n\u0131 ve kaynaklar\u0131n do\u011fru s\u0131rayla olu\u015fturulmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong>Ko\u015fullular:<\/strong> <code>count<\/code> veya <code>for_each<\/code> ile bir mod\u00fcl\u00fcn tamam\u0131 ko\u015fullu olarak \u00e7a\u011fr\u0131labilir. \u00d6rne\u011fin, <code>create_vpc = true<\/code> de\u011fi\u015fkenine ba\u011fl\u0131 olarak bir VPC mod\u00fcl\u00fcn\u00fcn tamam\u0131n\u0131 olu\u015fturabilirsiniz. Bu, iste\u011fe ba\u011fl\u0131 altyap\u0131 bile\u015fenlerini y\u00f6netmek i\u00e7in son derece esneklik sa\u011flar.<\/p>\n<h3>Felaket Kurtarma (DR) ve Mavi\/Ye\u015fil Da\u011f\u0131t\u0131mlar<\/h3>\n<p>Bu geli\u015fmi\u015f da\u011f\u0131t\u0131m stratejileri, de\u011fi\u015fkenler ve ko\u015fullu yap\u0131larla kolayca otomatize edilebilir.<br \/>\n*   <strong>DR Senaryolar\u0131:<\/strong> Bir <code>is_dr_site<\/code> de\u011fi\u015fkeni kullanarak, felaket kurtarma sitesindeki kaynaklar\u0131n yaln\u0131zca bu de\u011fi\u015fken <code>true<\/code> oldu\u011funda olu\u015fturulmas\u0131n\u0131 sa\u011flayabilirsiniz (<code>count = var.is_dr_site ? 1 : 0<\/code>). Bu, DR altyap\u0131s\u0131n\u0131n sadece ihtiya\u00e7 duyuldu\u011funda aya\u011fa kald\u0131r\u0131lmas\u0131na veya \u00f6l\u00e7eklendirilmesine olanak tan\u0131r.<br \/>\n*   <strong>Mavi\/Ye\u015fil Da\u011f\u0131t\u0131mlar:<\/strong> <code>deployment_color<\/code> (mavi\/ye\u015fil) gibi bir de\u011fi\u015fkenle, hangi ortam\u0131n aktif olaca\u011f\u0131n\u0131 belirleyebilir ve buna g\u00f6re kaynaklar\u0131 (<code>count<\/code> veya <code>for_each<\/code> ile) olu\u015fturabilir veya y\u00f6nlendirmeyi g\u00fcncelleyebilirsiniz. Bu, kesintisiz g\u00fcncellemeler ve h\u0131zl\u0131 geri d\u00f6n\u00fc\u015f yetenekleri sa\u011flar.<\/p>\n<h3>G\u00fcvenlik ve Uyumluluk<\/h3>\n<p>De\u011fi\u015fkenler ve ko\u015fullu yap\u0131lar, g\u00fcvenlik politikalar\u0131n\u0131 ve uyumluluk gereksinimlerini altyap\u0131 kodunuza entegre etmek i\u00e7in de kullan\u0131labilir.<br \/>\n*   <strong>Hassas Veri Y\u00f6netimi:<\/strong> <code>sensitive<\/code> de\u011fi\u015fkenler, veritaban\u0131 parolalar\u0131 veya API anahtarlar\u0131 gibi hassas bilgilerin Terraform durum dosyas\u0131nda veya konsol \u00e7\u0131kt\u0131lar\u0131nda g\u00f6r\u00fcnmesini engeller.<br \/>\n*   <strong>Ko\u015fullu G\u00fcvenlik Kurallar\u0131:<\/strong> Ortam de\u011fi\u015fkenlerine veya di\u011fer de\u011fi\u015fkenlere ba\u011fl\u0131 olarak daha k\u0131s\u0131tlay\u0131c\u0131 g\u00fcvenlik grubu kurallar\u0131 veya IAM politikalar\u0131 uygulayabilirsiniz. \u00d6rne\u011fin, \u00fcretim ortam\u0131ndaki veritabanlar\u0131na yaln\u0131zca belirli IP aral\u0131klar\u0131ndan eri\u015fime izin veren kurallar\u0131 ko\u015fullu olarak etkinle\u015ftirebilirsiniz. Bu, g\u00fcvenlik duru\u015funuzu otomatik olarak g\u00fc\u00e7lendirir.<\/p>\n<h2>En \u0130yi Uygulamalar ve Dikkat Edilmesi Gerekenler<\/h2>\n<p>Esnek bir altyap\u0131 kodu yazmak harika olsa da, bu ara\u00e7lar\u0131 etkili ve s\u00fcrd\u00fcr\u00fclebilir bir \u015fekilde kullanmak i\u00e7in baz\u0131 en iyi uygulamalar\u0131 takip etmek \u00f6nemlidir.<\/p>\n<h3>De\u011fi\u015fkenleri \u0130yi Tan\u0131mlay\u0131n ve Belgeleyin<\/h3>\n<p>Her <code>variable<\/code> blo\u011fu i\u00e7in a\u00e7\u0131klay\u0131c\u0131 bir <code>description<\/code> sa\u011flay\u0131n. M\u00fcmk\u00fcnse <code>type<\/code> k\u0131s\u0131tlamalar\u0131n\u0131 kullan\u0131n ve uygun <code>default<\/code> de\u011ferleri belirleyin. <code>validation<\/code> bloklar\u0131 ile de\u011fi\u015fken de\u011ferlerini do\u011frulamak, hatalar\u0131 erken a\u015famada yakalaman\u0131za yard\u0131mc\u0131 olur. \u0130yi belgelenmi\u015f de\u011fi\u015fkenler, kodunuzu kullanan di\u011fer geli\u015ftiriciler i\u00e7in anla\u015f\u0131l\u0131rl\u0131\u011f\u0131 art\u0131r\u0131r ve yanl\u0131\u015f kullan\u0131mlar\u0131 azalt\u0131r.<\/p>\n<h3>A\u00e7\u0131k Ba\u011f\u0131ml\u0131l\u0131klardan M\u00fcmk\u00fcn Oldu\u011funca Ka\u00e7\u0131n\u0131n<\/h3>\n<p><code>depends_on<\/code> kullanmaktan m\u00fcmk\u00fcn oldu\u011funca ka\u00e7\u0131n\u0131n. \u00c7o\u011fu durumda, Terraform&#8217;un \u00f6rt\u00fcl\u00fc ba\u011f\u0131ml\u0131l\u0131k alg\u0131lama mekanizmas\u0131 yeterlidir. A\u00e7\u0131k ba\u011f\u0131ml\u0131l\u0131klar, kaynak grafi\u011fini manuel olarak y\u00f6netmeye zorlar, bu da karma\u015f\u0131kl\u0131\u011f\u0131 art\u0131r\u0131r ve kodun anla\u015f\u0131lmas\u0131n\u0131 zorla\u015ft\u0131r\u0131r. Yaln\u0131zca ger\u00e7ekten gerekli oldu\u011funda, yani do\u011frudan bir nitelik referans\u0131 kurulamad\u0131\u011f\u0131 durumlarda kullan\u0131n.<\/p>\n<h3><code>count<\/code> ve <code>for_each<\/code> Aras\u0131ndaki Fark\u0131 Anlay\u0131n<\/h3>\n<p>Her iki meta-arg\u00fcman da birden fazla kaynak \u00f6rne\u011fi olu\u015fturmak i\u00e7in kullan\u0131l\u0131r, ancak farkl\u0131 senaryolar i\u00e7in optimize edilmi\u015ftir.<br \/>\n*   <code>count<\/code>: Kaynak \u00f6rnekleri aras\u0131nda ayr\u0131m yapmak i\u00e7in bir say\u0131sal indeksin yeterli oldu\u011fu durumlarda (\u00f6rne\u011fin, 3 adet web sunucusu).<br \/>\n*   <code>for_each<\/code>: Kaynak \u00f6rneklerine daha anlaml\u0131 anahtarlar ataman\u0131z gerekti\u011finde (\u00f6rne\u011fin, &#8220;web&#8221;, &#8220;db&#8221; gibi anahtarlarla g\u00fcvenlik gruplar\u0131) veya bir harita veya setten gelen de\u011ferlerle \u00e7al\u0131\u015f\u0131rken tercih edilir. <code>for_each<\/code> genellikle daha esnek ve y\u00f6netilebilir kaynak koleksiyonlar\u0131 sa\u011flar.<\/p>\n<h3>Karma\u015f\u0131kl\u0131\u011f\u0131 Y\u00f6netin<\/h3>\n<p>\u00c7ok fazla i\u00e7 i\u00e7e ko\u015fullu ifade, karma\u015f\u0131k <code>locals<\/code> bloklar\u0131 veya a\u015f\u0131r\u0131 dinamik yap\u0131lar kodunuzu okunaks\u0131z ve y\u00f6netilemez hale getirebilir. M\u00fcmk\u00fcn oldu\u011funca kodu mod\u00fcllere ay\u0131rarak veya daha basit mant\u0131klar kullanarak karma\u015f\u0131kl\u0131\u011f\u0131 azaltmaya \u00e7al\u0131\u015f\u0131n. Her zaman okunabilirlik ve s\u00fcrd\u00fcr\u00fclebilirli\u011fi g\u00f6z \u00f6n\u00fcnde bulundurun.<\/p>\n<h3>G\u00fcvenli\u011fi \u00d6n Planda Tutun<\/h3>\n<p>Hassas veriler i\u00e7in <code>sensitive<\/code> bayra\u011f\u0131n\u0131 kullanarak bu verilerin Terraform \u00e7\u0131kt\u0131lar\u0131nda g\u00f6r\u00fcnmesini engelleyin. Ko\u015fullu mant\u0131kla g\u00fcvenlik politikalar\u0131n\u0131 otomatik olarak uygulayarak (\u00f6rne\u011fin, \u00fcretim ortam\u0131 i\u00e7in daha k\u0131s\u0131tlay\u0131c\u0131 a\u011f kurallar\u0131), altyap\u0131n\u0131z\u0131n g\u00fcvenli\u011fini art\u0131r\u0131n. <code>lifecycle<\/code> blo\u011fundaki <code>prevent_destroy<\/code> gibi \u00f6zelliklerle kritik kaynaklar\u0131n yanl\u0131\u015fl\u0131kla silinmesini engelleyin.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Terraform, altyap\u0131y\u0131 kod olarak y\u00f6netme konusunda e\u015fsiz yetenekler sunar. Ancak, sadece altyap\u0131y\u0131 kodlamak de\u011fil, ayn\u0131 zamanda bu kodu esnek, uyarlanabilir ve s\u00fcrd\u00fcr\u00fclebilir k\u0131lmak da b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. Bu makalede ele ald\u0131\u011f\u0131m\u0131z de\u011fi\u015fkenler, ba\u011f\u0131ml\u0131l\u0131klar ve ko\u015fullu yap\u0131lar, bu esnekli\u011fi sa\u011flaman\u0131n temel ara\u00e7lar\u0131d\u0131r.<\/p>\n<p>*   <strong>De\u011fi\u015fkenler<\/strong>, altyap\u0131 kodunuzu parametrele\u015ftirerek farkl\u0131 ortamlar ve senaryolar i\u00e7in yeniden kullan\u0131labilir hale getirir.<br \/>\n*   <strong>Ba\u011f\u0131ml\u0131l\u0131klar<\/strong>, kaynaklar\u0131n do\u011fru s\u0131rayla olu\u015fturulmas\u0131n\u0131 garanti ederek altyap\u0131n\u0131z\u0131n tutarl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong>Ko\u015fullu yap\u0131lar<\/strong> (<code>count<\/code>, <code>for_each<\/code>, ternary operat\u00f6r, <code>dynamic<\/code> bloklar, <code>lifecycle<\/code> blo\u011fu), altyap\u0131n\u0131z\u0131n dinamik gereksinimlere g\u00f6re \u015fekil almas\u0131na ve ak\u0131ll\u0131 kararlar almas\u0131na olanak tan\u0131r.<\/p>\n<p>Bu \u00fc\u00e7 mekanizmay\u0131 birle\u015ftirerek, DevOps ekipleri de\u011fi\u015fen i\u015f ihtiya\u00e7lar\u0131na h\u0131zla yan\u0131t verebilen, maliyetleri optimize eden ve g\u00fcvenli\u011fi art\u0131ran sa\u011flam ve uyarlanabilir altyap\u0131lar olu\u015fturabilirler. Terraform&#8217;u bu ileri d\u00fczey \u00f6zellikleriyle kullanmak, altyap\u0131 otomasyonunuzu bir sonraki seviyeye ta\u015f\u0131yacak ve bulut ortamlar\u0131n\u0131z\u0131n y\u00f6netiminde size \u00f6nemli bir avantaj sa\u011flayacakt\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Terraform De\u011fi\u015fkenleri, Ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve Ko\u015fullu Yap\u0131lar Kullanarak Esnekli\u011fi Art\u0131rma\nAltyap\u0131 otomasyonu, modern yaz\u0131l\u0131m geli\u015ftirme v","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-32982","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 De\u011fi\u015fkenleri, Ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve Ko\u015fullu Yap\u0131lar Kullanarak Esnekli\u011fi Art\u0131rma - 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-degiskenleri-bagimliliklari-ve-kosullu-yapilar-kullanarak-esnekligi-artirma\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Terraform De\u011fi\u015fkenleri, Ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve Ko\u015fullu Yap\u0131lar Kullanarak Esnekli\u011fi Art\u0131rma\" \/>\n<meta property=\"og:description\" content=\"Terraform De\u011fi\u015fkenleri, Ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve Ko\u015fullu Yap\u0131lar Kullanarak Esnekli\u011fi Art\u0131rma Altyap\u0131 otomasyonu, modern yaz\u0131l\u0131m geli\u015ftirme v\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-bagimliliklari-ve-kosullu-yapilar-kullanarak-esnekligi-artirma\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-28T01:41:15+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=\"19 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-bagimliliklari-ve-kosullu-yapilar-kullanarak-esnekligi-artirma\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-bagimliliklari-ve-kosullu-yapilar-kullanarak-esnekligi-artirma\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Terraform De\u011fi\u015fkenleri, Ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve Ko\u015fullu Yap\u0131lar Kullanarak Esnekli\u011fi Art\u0131rma\",\"datePublished\":\"2025-10-28T01:41:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-bagimliliklari-ve-kosullu-yapilar-kullanarak-esnekligi-artirma\/\"},\"wordCount\":3097,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-bagimliliklari-ve-kosullu-yapilar-kullanarak-esnekligi-artirma\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-bagimliliklari-ve-kosullu-yapilar-kullanarak-esnekligi-artirma\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-bagimliliklari-ve-kosullu-yapilar-kullanarak-esnekligi-artirma\/\",\"name\":\"Terraform De\u011fi\u015fkenleri, Ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve Ko\u015fullu Yap\u0131lar Kullanarak Esnekli\u011fi Art\u0131rma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-28T01:41:15+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-bagimliliklari-ve-kosullu-yapilar-kullanarak-esnekligi-artirma\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-bagimliliklari-ve-kosullu-yapilar-kullanarak-esnekligi-artirma\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-bagimliliklari-ve-kosullu-yapilar-kullanarak-esnekligi-artirma\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Terraform De\u011fi\u015fkenleri, Ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve Ko\u015fullu Yap\u0131lar Kullanarak Esnekli\u011fi Art\u0131rma\"}]},{\"@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 De\u011fi\u015fkenleri, Ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve Ko\u015fullu Yap\u0131lar Kullanarak Esnekli\u011fi Art\u0131rma - 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-degiskenleri-bagimliliklari-ve-kosullu-yapilar-kullanarak-esnekligi-artirma\/","og_locale":"tr_TR","og_type":"article","og_title":"Terraform De\u011fi\u015fkenleri, Ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve Ko\u015fullu Yap\u0131lar Kullanarak Esnekli\u011fi Art\u0131rma","og_description":"Terraform De\u011fi\u015fkenleri, Ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve Ko\u015fullu Yap\u0131lar Kullanarak Esnekli\u011fi Art\u0131rma Altyap\u0131 otomasyonu, modern yaz\u0131l\u0131m geli\u015ftirme v","og_url":"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-bagimliliklari-ve-kosullu-yapilar-kullanarak-esnekligi-artirma\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-28T01:41:15+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"19 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-bagimliliklari-ve-kosullu-yapilar-kullanarak-esnekligi-artirma\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-bagimliliklari-ve-kosullu-yapilar-kullanarak-esnekligi-artirma\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Terraform De\u011fi\u015fkenleri, Ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve Ko\u015fullu Yap\u0131lar Kullanarak Esnekli\u011fi Art\u0131rma","datePublished":"2025-10-28T01:41:15+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-bagimliliklari-ve-kosullu-yapilar-kullanarak-esnekligi-artirma\/"},"wordCount":3097,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-bagimliliklari-ve-kosullu-yapilar-kullanarak-esnekligi-artirma\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-bagimliliklari-ve-kosullu-yapilar-kullanarak-esnekligi-artirma\/","url":"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-bagimliliklari-ve-kosullu-yapilar-kullanarak-esnekligi-artirma\/","name":"Terraform De\u011fi\u015fkenleri, Ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve Ko\u015fullu Yap\u0131lar Kullanarak Esnekli\u011fi Art\u0131rma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-28T01:41:15+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-bagimliliklari-ve-kosullu-yapilar-kullanarak-esnekligi-artirma\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-bagimliliklari-ve-kosullu-yapilar-kullanarak-esnekligi-artirma\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-bagimliliklari-ve-kosullu-yapilar-kullanarak-esnekligi-artirma\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Terraform De\u011fi\u015fkenleri, Ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve Ko\u015fullu Yap\u0131lar Kullanarak Esnekli\u011fi Art\u0131rma"}]},{"@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\/32982","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=32982"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32982\/revisions"}],"predecessor-version":[{"id":32983,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32982\/revisions\/32983"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32982"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32982"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32982"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}