{"id":36185,"date":"2025-12-09T20:31:05","date_gmt":"2025-12-09T17:31:05","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-altyapiyi-dinamik-hale-getirme-rehberi\/"},"modified":"2025-12-09T20:31:05","modified_gmt":"2025-12-09T17:31:05","slug":"terraform-degiskenleri-altyapiyi-dinamik-hale-getirme-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-altyapiyi-dinamik-hale-getirme-rehberi\/","title":{"rendered":"Terraform De\u011fi\u015fkenleri: Altyap\u0131y\u0131 Dinamik Hale Getirme Rehberi"},"content":{"rendered":"<p><body><\/p>\n<p>Altyap\u0131 kodunuzu her ortam i\u00e7in ba\u015ftan m\u0131 yaz\u0131yorsunuz? Tek bir de\u011fer de\u011fi\u015fikli\u011fi i\u00e7in onlarca dosya m\u0131 d\u00fczenlemeniz gerekiyor? Terraform de\u011fi\u015fkenleri, bu karma\u015f\u0131kl\u0131\u011f\u0131 ortadan kald\u0131rarak altyap\u0131 kodunuzu dinamik, esnek ve yeniden kullan\u0131labilir hale getirir. Bu kapsaml\u0131 rehberde, Terraform de\u011fi\u015fkenlerini s\u0131f\u0131rdan \u00f6\u011frenin, nas\u0131l tan\u0131mlayaca\u011f\u0131n\u0131z\u0131, farkl\u0131 t\u00fcrlerini ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedin.<\/p>\n<p>Modern bulut altyap\u0131lar\u0131n\u0131n y\u00f6netimi, giderek karma\u015f\u0131kla\u015fan bir s\u00fcre\u00e7tir ve &#8220;Altyap\u0131 Kod Olarak&#8221; (Infrastructure as Code &#8211; IaC) prensibi, bu karma\u015fay\u0131 y\u00f6netmek i\u00e7in vazge\u00e7ilmez bir yakla\u015f\u0131m sunar. Terraform, bu alanda lider ara\u00e7lardan biridir. Ancak Terraform ile bile, kodunuzda s\u00fcrekli tekrar eden veya ortama \u00f6zel de\u011fi\u015fen de\u011ferler kulland\u0131\u011f\u0131n\u0131zda, h\u0131zla y\u00f6netilemez bir durum ortaya \u00e7\u0131kabilir. \u00d6rne\u011fin, bir sanal sunucunun boyutunu veya bir veritaban\u0131n\u0131n ad\u0131n\u0131 her da\u011f\u0131t\u0131m i\u00e7in ayr\u0131 ayr\u0131 kodun i\u00e7ine g\u00f6mmek, hem hata yapma olas\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r hem de kodunuzun esnekli\u011fini ciddi \u015fekilde k\u0131s\u0131tlar. \u0130\u015fte tam bu noktada Terraform de\u011fi\u015fkenleri devreye girer ve altyap\u0131 kodunuzu kuru (DRY &#8211; Don&#8217;t Repeat Yourself) ve uyarlanabilir hale getirmenin anahtar\u0131 olur.<\/p>\n<p>Peki, Terraform de\u011fi\u015fkenleri tam olarak nedir ve neden bu kadar \u00f6nemlidir? En basit ifadeyle, Terraform de\u011fi\u015fkenleri, mod\u00fcllerinizin veya konfig\u00fcrasyonlar\u0131n\u0131z\u0131n d\u0131\u015f\u0131ndan de\u011ferler kabul etmesini sa\u011flayan birer giri\u015f (input) mekanizmas\u0131d\u0131r. T\u0131pk\u0131 bir programlama dilindeki fonksiyonlara arg\u00fcman ge\u00e7irmek gibi d\u00fc\u015f\u00fcnebilirsiniz. Bu de\u011fi\u015fkenler sayesinde, ayn\u0131 Terraform kod blo\u011funu farkl\u0131 ortamlar (geli\u015ftirme, test, \u00fcretim), farkl\u0131 b\u00f6lgeler veya farkl\u0131 m\u00fc\u015fteri projeleri i\u00e7in \u00f6zelle\u015ftirilmi\u015f de\u011ferlerle defalarca kullanabilirsiniz. Bu durum, altyap\u0131n\u0131z\u0131n versiyon kontrol\u00fcn\u00fc kolayla\u015ft\u0131r\u0131r, manuel hatalar\u0131 azalt\u0131r ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi h\u0131zland\u0131r\u0131r. Altyap\u0131 kodunuzda sabitlenmi\u015f (hardcoded) de\u011ferlerden kurtularak, daha mod\u00fcler, okunabilir ve bak\u0131m\u0131 kolay \u00e7\u00f6z\u00fcmler geli\u015ftirebilirsiniz.<\/p>\n<p>\u00d6rne\u011fin, bir web uygulamas\u0131n\u0131 farkl\u0131 bulut ortamlar\u0131na (AWS, Azure, GCP) da\u011f\u0131tt\u0131\u011f\u0131n\u0131z\u0131 varsayal\u0131m. Her ortamda farkl\u0131 bir sanal makine tipi, farkl\u0131 bir depolama boyutu veya farkl\u0131 g\u00fcvenlik grubu kurallar\u0131 gerekebilir. De\u011fi\u015fkenler olmadan, her ortam i\u00e7in ayr\u0131 Terraform dosyalar\u0131 yazman\u0131z gerekebilir, bu da tekrarlayan kod ve y\u00fcksek bak\u0131m maliyeti anlam\u0131na gelir. Ancak de\u011fi\u015fkenler kullanarak, ana Terraform kodunuzu genel tutabilir, ortam spesifik detaylar\u0131 ise d\u0131\u015far\u0131dan sa\u011flanan de\u011fi\u015fken dosyalar\u0131yla y\u00f6netebilirsiniz. Bu sayede, &#8220;geli\u015ftirme&#8221; ortam\u0131nda daha k\u00fc\u00e7\u00fck ve uygun maliyetli kaynaklar kullan\u0131rken, &#8220;\u00fcretim&#8221; ortam\u0131nda y\u00fcksek performansl\u0131 ve yedekli kaynaklar\u0131 ayn\u0131 kod temeli \u00fczerinden kolayca provision edebilirsiniz. Dolay\u0131s\u0131yla, Terraform de\u011fi\u015fkenleri sadece bir kolayl\u0131k de\u011fil, ayn\u0131 zamanda sa\u011flam ve \u00f6l\u00e7eklenebilir bulut altyap\u0131s\u0131 otomasyonunun temel ta\u015f\u0131d\u0131r. Bu kavramlar\u0131 sindirerek, Terraform yolculu\u011funuzda \u00e7ok daha ileri ad\u0131mlar atabileceksiniz.<\/p>\n<h2>Terraform&#8217;da De\u011fi\u015fken Tan\u0131mlama: \u0130lk Ad\u0131mlar\u0131n\u0131z Nas\u0131l Olmal\u0131?<\/h2>\n<p>Terraform de\u011fi\u015fkenlerini kullanmaya ba\u015flaman\u0131n ilk ad\u0131m\u0131, onlar\u0131 tan\u0131mlamakt\u0131r. De\u011fi\u015fken tan\u0131mlamalar\u0131 genellikle ayr\u0131 bir <code>variables.tf<\/code> dosyas\u0131nda yap\u0131l\u0131r; bu, kodunuzun d\u00fczenini ve okunabilirli\u011fini art\u0131r\u0131r. Ancak ayn\u0131 dosya i\u00e7inde de tan\u0131mlayabilirsiniz. Bir de\u011fi\u015fkeni tan\u0131mlamak i\u00e7in, <code>variable<\/code> anahtar kelimesini ve ard\u0131ndan de\u011fi\u015fkenin ad\u0131n\u0131 kullan\u0131r\u0131z. Her de\u011fi\u015fken blo\u011fu, o de\u011fi\u015fkenin davran\u0131\u015f\u0131n\u0131 ve beklenen de\u011ferini a\u00e7\u0131klayan \u00e7e\u015fitli arg\u00fcmanlar i\u00e7erebilir. Bu arg\u00fcmanlar, de\u011fi\u015fkenin t\u00fcr\u00fcn\u00fc belirtmekten, varsay\u0131lan de\u011ferler atamaya ve hatta de\u011fer do\u011frulama kurallar\u0131 eklemeye kadar geni\u015f bir yelpazeyi kapsar.<\/p>\n<p>En temel haliyle, bir de\u011fi\u015fken blo\u011fu a\u015fa\u011f\u0131daki gibi g\u00f6r\u00fcn\u00fcr:<\/p>\n<pre><code>\nvariable \"region\" {\n  description = \"Da\u011f\u0131t\u0131m\u0131n yap\u0131laca\u011f\u0131 AWS b\u00f6lgesi.\"\n  type        = string\n  default     = \"us-east-1\"\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte:<\/p>\n<ul>\n<li><code>variable \"region\"<\/code>: Yeni bir de\u011fi\u015fken tan\u0131mlad\u0131\u011f\u0131m\u0131z\u0131 ve ad\u0131n\u0131n \"region\" oldu\u011funu belirtir.<\/li>\n<li><code>description<\/code>: Bu de\u011fi\u015fkenin ne i\u015fe yarad\u0131\u011f\u0131n\u0131 a\u00e7\u0131klayan kullan\u0131c\u0131 dostu bir metindir. \u00d6zellikle tak\u0131m \u00e7al\u0131\u015fmas\u0131nda veya gelecekteki bak\u0131mda \u00e7ok de\u011ferlidir.<\/li>\n<li><code>type<\/code>: De\u011fi\u015fkenin bekledi\u011fi veri tipini belirtir. Terraform'da <code>string<\/code>, <code>number<\/code>, <code>bool<\/code>, <code>list<\/code>, <code>map<\/code>, <code>object<\/code> ve <code>set<\/code> gibi \u00e7e\u015fitli temel ve karma\u015f\u0131k veri tipleri bulunur. Bu, yanl\u0131\u015f veri tipi giri\u015flerini engellemeye yard\u0131mc\u0131 olur.<\/li>\n<li><code>default<\/code>: E\u011fer bu de\u011fi\u015fkene harici bir de\u011fer sa\u011flanmazsa kullan\u0131lacak varsay\u0131lan de\u011feri belirler. <code>default<\/code> de\u011feri tan\u0131mland\u0131\u011f\u0131nda, de\u011fi\u015fken iste\u011fe ba\u011fl\u0131 hale gelir. E\u011fer <code>default<\/code> tan\u0131mlanmazsa, Terraform da\u011f\u0131t\u0131m s\u0131ras\u0131nda bu de\u011fi\u015fken i\u00e7in bir de\u011fer girilmesini bekler.<\/li>\n<\/ul>\n<p>Bir de\u011fi\u015fken tan\u0131mland\u0131ktan sonra, Terraform konfig\u00fcrasyonunuzun herhangi bir yerinde ona <code>var.de\u011fi\u015fken_ad\u0131<\/code> format\u0131nda eri\u015febilirsiniz. \u00d6rne\u011fin, tan\u0131mlad\u0131\u011f\u0131m\u0131z \"region\" de\u011fi\u015fkenini bir AWS sa\u011flay\u0131c\u0131s\u0131 blo\u011funda kullanmak istersek:<\/p>\n<pre><code>\nprovider \"aws\" {\n  region = var.region\n}\n\nresource \"aws_instance\" \"web\" {\n  ami           = \"ami-0abcdef1234567890\" # \u00d6rnek AMI ID\n  instance_type = \"t2.micro\"\n  tags = {\n    Name = \"MyWebServer\"\n    Environment = \"Dev\"\n  }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>provider \"aws\"<\/code> blo\u011fundaki <code>region<\/code> arg\u00fcman\u0131na do\u011frudan <code>var.region<\/code> atamas\u0131n\u0131 yaparak, b\u00f6lge de\u011ferini dinamik hale getirdik. Art\u0131k bu Terraform konfig\u00fcrasyonunu farkl\u0131 bir AWS b\u00f6lgesine da\u011f\u0131tmak istedi\u011fimizde, kodda de\u011fi\u015fiklik yapmam\u0131z gerekmez; sadece <code>region<\/code> de\u011fi\u015fkenine yeni bir de\u011fer sa\u011flamam\u0131z yeterli olur. Bu temel yakla\u015f\u0131m, Terraform ile altyap\u0131 y\u00f6netiminizi \u00e7ok daha verimli ve hatas\u0131z hale getirmenizi sa\u011flar. \u0130lerleyen b\u00f6l\u00fcmlerde, farkl\u0131 de\u011fi\u015fken t\u00fcrlerini ve bunlara nas\u0131l de\u011fer atayaca\u011f\u0131n\u0131z\u0131 daha detayl\u0131 inceleyece\u011fiz.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Her zaman de\u011fi\u015fkenlerinize anlaml\u0131 <code>description<\/code> alanlar\u0131 ekleyin. Bu, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k projelerde, di\u011fer ekip \u00fcyelerinin (veya gelecekteki sizin) de\u011fi\u015fkenlerin amac\u0131n\u0131 h\u0131zl\u0131ca anlamas\u0131na yard\u0131mc\u0131 olur.\n<\/div>\n<h2>Farkl\u0131 De\u011fi\u015fken T\u00fcrlerini Tan\u0131yal\u0131m: Hangi Veri Tipi Nerede Kullan\u0131l\u0131r?<\/h2>\n<p>Terraform, altyap\u0131 kodunuzu daha esnek hale getirmek i\u00e7in farkl\u0131 t\u00fcrlerde de\u011fi\u015fkenleri destekler. Bu veri tipleri, de\u011fi\u015fkenlerin alabilece\u011fi de\u011ferleri k\u0131s\u0131tlayarak hata yapma olas\u0131l\u0131\u011f\u0131n\u0131 azalt\u0131r ve kodunuzun daha \u00f6ng\u00f6r\u00fclebilir olmas\u0131n\u0131 sa\u011flar. Do\u011fru veri tipini se\u00e7mek, altyap\u0131 kodunuzun sa\u011flaml\u0131\u011f\u0131 ve okunabilirli\u011fi a\u00e7\u0131s\u0131ndan kritik \u00f6neme sahiptir. \u015eimdi, en s\u0131k kullan\u0131lan de\u011fi\u015fken tiplerini ve nerede kullan\u0131labileceklerini detayl\u0131ca inceleyelim.<\/p>\n<ul>\n<li><strong><code>string<\/code> (Metin):<\/strong> En yayg\u0131n kullan\u0131lan tiptir. Tek bir metin de\u011feri i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, kaynaklar\u0131n adlar\u0131, a\u00e7\u0131klay\u0131c\u0131 etiketler, b\u00f6lge adlar\u0131 gibi.<\/li>\n<pre><code>\nvariable \"instance_name\" {\n  description = \"EC2 instance'\u0131n ad\u0131.\"\n  type        = string\n  default     = \"web-server\"\n}\n    <\/pre>\n<p><\/code><\/p>\n<li><strong><code>number<\/code> (Say\u0131):<\/strong> Tam say\u0131 veya ondal\u0131k say\u0131 de\u011ferleri i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, disk boyutlar\u0131, port numaralar\u0131, kaynak adetleri gibi.<\/li>\n<pre><code>\nvariable \"instance_count\" {\n  description = \"Olu\u015fturulacak EC2 instance say\u0131s\u0131.\"\n  type        = number\n  default     = 1\n}\n    <\/pre>\n<p><\/code><\/p>\n<li><strong><code>bool<\/code> (Mant\u0131ksal):<\/strong> <code>true<\/code> veya <code>false<\/code> gibi mant\u0131ksal de\u011ferler i\u00e7in kullan\u0131l\u0131r. Bir \u00f6zelli\u011fin etkinle\u015ftirilip devre d\u0131\u015f\u0131 b\u0131rak\u0131lmas\u0131 gibi durumlarda idealdir.<\/li>\n<pre><code>\nvariable \"enable_public_ip\" {\n  description = \"EC2 instance'a public IP atan\u0131p atanmayaca\u011f\u0131n\u0131 belirtir.\"\n  type        = bool\n  default     = true\n}\n    <\/pre>\n<p><\/code><\/p>\n<li><strong><code>list<\/code> (Liste):<\/strong> Ayn\u0131 tipte birden \u00e7ok de\u011feri s\u0131ral\u0131 bir koleksiyon olarak tutmak i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, bir g\u00fcvenlik grubuna eklenecek IP adresleri listesi veya bir ASG'nin kullanaca\u011f\u0131 alt a\u011f kimlikleri listesi.<\/li>\n<pre><code>\nvariable \"allowed_cidrs\" {\n  description = \"G\u00fcvenlik grubuna eri\u015fim izni verilecek IP CIDR bloklar\u0131 listesi.\"\n  type        = list(string)\n  default     = [\"0.0.0.0\/0\"]\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Kullan\u0131m\u0131:<\/p>\n<pre><code>\nresource \"aws_security_group_rule\" \"ingress_http\" {\n  type        = \"ingress\"\n  from_port   = 80\n  to_port     = 80\n  protocol    = \"tcp\"\n  cidr_blocks = var.allowed_cidrs\n  security_group_id = aws_security_group.web_sg.id\n}\n    <\/pre>\n<p><\/code><\/p>\n<li><strong><code>map<\/code> (Harita):<\/strong> Anahtar-de\u011fer \u00e7iftlerinden olu\u015fan bir koleksiyon i\u00e7in kullan\u0131l\u0131r. Her anahtar bir dize olmal\u0131 ve de\u011ferler ayn\u0131 tipte olmal\u0131d\u0131r. Genellikle kaynak etiketleri (tags) veya genel ayar k\u00fcmeleri i\u00e7in idealdir.<\/li>\n<pre><code>\nvariable \"instance_tags\" {\n  description = \"EC2 instance i\u00e7in etiketler.\"\n  type        = map(string)\n  default = {\n    Environment = \"Development\"\n    Project     = \"WebApp\"\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Kullan\u0131m\u0131:<\/p>\n<pre><code>\nresource \"aws_instance\" \"web\" {\n  # ... di\u011fer ayarlar ...\n  tags = var.instance_tags\n}\n    <\/pre>\n<p><\/code><\/p>\n<li><strong><code>object<\/code> (Nesne):<\/strong> Farkl\u0131 tiplerde anahtar-de\u011fer \u00e7iftlerini tutabilen karma\u015f\u0131k, yap\u0131land\u0131r\u0131lm\u0131\u015f bir veri tipidir. Map'ten farkl\u0131 olarak, <code>object<\/code> i\u00e7indeki her anahtar\u0131n belirli bir tipi olmal\u0131d\u0131r ve bu tip tan\u0131mlama s\u0131ras\u0131nda belirtilir. Daha karma\u015f\u0131k veri yap\u0131lar\u0131n\u0131 tan\u0131mlamak i\u00e7in kullan\u0131l\u0131r, \u00f6rne\u011fin bir EC2 instance'\u0131n t\u00fcm konfig\u00fcrasyonunu tek bir de\u011fi\u015fkende tutmak gibi.<\/li>\n<pre><code>\nvariable \"ec2_config\" {\n  description = \"EC2 instance konfig\u00fcrasyonu.\"\n  type = object({\n    ami_id        = string\n    instance_type = string\n    disk_size_gb  = number\n    tags          = map(string)\n  })\n  default = {\n    ami_id        = \"ami-0abcdef1234567890\"\n    instance_type = \"t2.micro\"\n    disk_size_gb  = 30\n    tags = {\n      Name = \"DefaultServer\"\n    }\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Kullan\u0131m\u0131:<\/p>\n<pre><code>\nresource \"aws_instance\" \"web\" {\n  ami           = var.ec2_config.ami_id\n  instance_type = var.ec2_config.instance_type\n  root_block_device {\n    volume_size = var.ec2_config.disk_size_gb\n  }\n  tags          = var.ec2_config.tags\n}\n    <\/pre>\n<p><\/code><\/p>\n<li><strong><code>set<\/code> (K\u00fcme):<\/strong> Ayn\u0131 tipte ve benzersiz de\u011ferlerden olu\u015fan s\u0131ras\u0131z bir koleksiyondur. Listeden fark\u0131, elemanlar\u0131n s\u0131ras\u0131n\u0131n \u00f6nemli olmamas\u0131 ve her eleman\u0131n benzersiz olmas\u0131 gerekti\u011fidir. Nadiren kullan\u0131l\u0131r ancak belirli senaryolarda faydal\u0131 olabilir, \u00f6rne\u011fin bir kullan\u0131c\u0131 grubuna atanacak izinlerin listesi gibi.<\/li>\n<pre><code>\nvariable \"unique_ids\" {\n  description = \"Benzersiz kimliklerin k\u00fcmesi.\"\n  type        = set(string)\n  default     = [\"id1\", \"id2\", \"id3\"]\n}\n    <\/pre>\n<p><\/code>\n<\/ul>\n<p>Do\u011fru de\u011fi\u015fken tipini se\u00e7mek, Terraform kodunuzun daha g\u00fc\u00e7l\u00fc ve hataya kar\u015f\u0131 daha diren\u00e7li olmas\u0131n\u0131 sa\u011flar. \u00d6zellikle <code>object<\/code> tipi, karma\u015f\u0131k ve ili\u015fkili veri k\u00fcmelerini tek bir yap\u0131da grupland\u0131rarak kodunuzun mod\u00fclerli\u011fini ve okunabilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir. Bir sonraki b\u00f6l\u00fcmde, bu de\u011fi\u015fkenlere nas\u0131l de\u011fer atayaca\u011f\u0131m\u0131z\u0131 ve bu de\u011ferlerin Terraform taraf\u0131ndan nas\u0131l i\u015flendi\u011fini inceleyece\u011fiz.<\/p>\n<h2>Terraform De\u011fi\u015fkenlerine De\u011fer Atama: Esnekli\u011fi Nas\u0131l Yakalars\u0131n\u0131z?<\/h2>\n<p>De\u011fi\u015fkenleri tan\u0131mlamak kadar, onlara de\u011fer atamak da Terraform kodunuzun esnekli\u011fi i\u00e7in hayati \u00f6neme sahiptir. Terraform, bir de\u011fi\u015fkene de\u011fer sa\u011flamak i\u00e7in birden fazla y\u00f6ntem sunar ve her y\u00f6ntemin kendi kullan\u0131m senaryosu ve \u00f6ncelik s\u0131ras\u0131 vard\u0131r. Bu y\u00f6ntemleri do\u011fru bir \u015fekilde anlamak, farkl\u0131 ortamlar i\u00e7in dinamik ve uyarlanabilir altyap\u0131 da\u011f\u0131t\u0131mlar\u0131 yapman\u0131z\u0131 sa\u011flar. \u0130\u015fte Terraform'da de\u011fi\u015fkenlere de\u011fer ataman\u0131n ba\u015fl\u0131ca yollar\u0131:<\/p>\n<h3>1. Varsay\u0131lan De\u011ferler (<code>default<\/code> anahtar kelimesi)<\/h3>\n<p>Bir de\u011fi\u015fken tan\u0131mlarken bir <code>default<\/code> de\u011feri belirtirseniz, bu de\u011fi\u015fkene harici bir de\u011fer sa\u011flanmad\u0131\u011f\u0131nda bu varsay\u0131lan de\u011fer kullan\u0131l\u0131r. Bu, de\u011fi\u015fkeni iste\u011fe ba\u011fl\u0131 hale getirir ve kullan\u0131c\u0131lar\u0131n yaln\u0131zca temel kurulumdan farkl\u0131 bir \u015fey istediklerinde de\u011fer sa\u011flamas\u0131n\u0131 gerektirir.<\/p>\n<pre><code>\nvariable \"region\" {\n  description = \"Da\u011f\u0131t\u0131m\u0131n yap\u0131laca\u011f\u0131 AWS b\u00f6lgesi.\"\n  type        = string\n  default     = \"us-east-1\"\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>2. Komut Sat\u0131r\u0131 Ba\u011f\u0131ms\u0131z De\u011fi\u015fkenleri (<code>-var<\/code> bayra\u011f\u0131)<\/h3>\n<p>Tek seferlik veya h\u0131zl\u0131 testler i\u00e7in, Terraform komutlar\u0131na do\u011frudan de\u011fer ge\u00e7irebilirsiniz. Bu y\u00f6ntem, \u00f6zellikle otomasyon betiklerinde veya h\u0131zl\u0131 ge\u00e7ici de\u011fi\u015fiklikler yaparken kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code>\nterraform plan -var=\"region=eu-central-1\" -var=\"instance_count=2\"\n<\/pre>\n<p><\/code><\/p>\n<p>Bu y\u00f6ntem, de\u011fi\u015fken ad\u0131na ve de\u011ferine do\u011frudan eri\u015fim sa\u011flar ancak \u00e7ok say\u0131da de\u011fi\u015fken i\u00e7in yorucu olabilir.<\/p>\n<h3>3. Ortam De\u011fi\u015fkenleri (<code>TF_VAR_<\/code> \u00f6n eki)<\/h3>\n<p>Terraform, <code>TF_VAR_<\/code> \u00f6n ekiyle ba\u015flayan t\u00fcm ortam de\u011fi\u015fkenlerini otomatik olarak Terraform de\u011fi\u015fkenlerine d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. Bu, \u00f6zellikle CI\/CD boru hatlar\u0131nda hassas veya ortama \u00f6zel de\u011ferleri gizli tutmak i\u00e7in pop\u00fcler bir y\u00f6ntemdir.<\/p>\n<pre><code>\nexport TF_VAR_region=\"ap-southeast-2\"\nterraform apply\n<\/pre>\n<p><\/code><\/p>\n<p>Burada, <code>TF_VAR_region<\/code> ortam de\u011fi\u015fkeni, Terraform'daki <code>region<\/code> de\u011fi\u015fkenine de\u011ferini iletir.<\/p>\n<h3>4. De\u011fi\u015fken Tan\u0131mlama Dosyalar\u0131 (<code>.tfvars<\/code> uzant\u0131l\u0131 dosyalar)<\/h3>\n<p>Bu, de\u011fi\u015fken de\u011ferlerini y\u00f6netmenin en yayg\u0131n ve tavsiye edilen yoludur. Bir veya daha fazla <code>.tfvars<\/code> dosyas\u0131 olu\u015fturarak de\u011fi\u015fken de\u011ferlerini organize edebilirsiniz. \u00d6rne\u011fin, farkl\u0131 ortamlar i\u00e7in ayr\u0131 dosyalar:<\/p>\n<ul>\n<li><code>dev.tfvars<\/code>:<\/li>\n<pre><code>\nregion        = \"us-east-1\"\ninstance_type = \"t2.micro\"\ninstance_count = 1\n    <\/pre>\n<p><\/code><\/p>\n<li><code>prod.tfvars<\/code>:<\/li>\n<pre><code>\nregion        = \"us-west-2\"\ninstance_type = \"m5.large\"\ninstance_count = 3\n    <\/pre>\n<p><\/code>\n<\/ul>\n<p>Bu dosyalar\u0131 Terraform'a <code>*-var-file<\/code> bayra\u011f\u0131 ile belirtirsiniz:<\/p>\n<pre><code>\nterraform plan -var-file=\"dev.tfvars\"\nterraform apply -var-file=\"prod.tfvars\"\n<\/pre>\n<p><\/code><\/p>\n<h3>5. Otomatik Y\u00fcklenen De\u011fi\u015fken Tan\u0131mlama Dosyalar\u0131 (<code>*.auto.tfvars<\/code> veya <code>terraform.tfvars<\/code>)<\/h3>\n<p>Terraform, \u00e7al\u0131\u015fma dizinindeki <code>terraform.tfvars<\/code> veya <code>terraform.tfvars.json<\/code> adl\u0131 dosyalar\u0131 ve <code>*.auto.tfvars<\/code> veya <code>*.auto.tfvars.json<\/code> uzant\u0131l\u0131 t\u00fcm dosyalar\u0131 otomatik olarak y\u00fckler. Bu, temel veya global de\u011fi\u015fkenler i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code>\n# terraform.tfvars dosyas\u0131 i\u00e7eri\u011fi\nregion = \"eu-west-1\"\n<\/pre>\n<p><\/code><\/p>\n<p>Bu dosya, herhangi bir ek bayrak olmadan <code>terraform plan<\/code> veya <code>terraform apply<\/code> \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda otomatik olarak okunur.<\/p>\n<h3>De\u011fi\u015fken Y\u00fckleme \u00d6nceli\u011fi<\/h3>\n<p>Birden fazla y\u00f6ntemle ayn\u0131 de\u011fi\u015fkene de\u011fer atand\u0131\u011f\u0131nda, Terraform belirli bir \u00f6ncelik s\u0131ras\u0131na g\u00f6re karar verir (en y\u00fcksek \u00f6ncelikten en d\u00fc\u015f\u00fc\u011fe):<\/p>\n<ol>\n<li>Komut sat\u0131r\u0131 ba\u011f\u0131ms\u0131z de\u011fi\u015fkenleri (<code>-var<\/code> ve <code>-var-file<\/code> s\u0131ras\u0131na g\u00f6re sa\u011fdan sola)<\/li>\n<li>Ortam de\u011fi\u015fkenleri (<code>TF_VAR_<\/code>)<\/li>\n<li><code>*.auto.tfvars<\/code> veya <code>*.auto.tfvars.json<\/code> uzant\u0131l\u0131 dosyalar (alfabetik s\u0131raya g\u00f6re)<\/li>\n<li><code>terraform.tfvars<\/code> veya <code>terraform.tfvars.json<\/code> dosyas\u0131<\/li>\n<li>De\u011fi\u015fken tan\u0131mlamas\u0131ndaki <code>default<\/code> de\u011ferleri<\/li>\n<\/ol>\n<p>Bu \u00f6ncelik s\u0131ras\u0131n\u0131 anlamak, beklenmedik davran\u0131\u015flardan ka\u00e7\u0131nmak ve de\u011fi\u015fken de\u011ferlerinizin nas\u0131l \u00e7\u00f6z\u00fcmlendi\u011fini tam olarak kontrol etmek i\u00e7in kritik \u00f6neme sahiptir. \u00d6rne\u011fin, komut sat\u0131r\u0131 ile verilen bir de\u011fer, <code>.tfvars<\/code> dosyas\u0131ndaki veya varsay\u0131lan de\u011ferleri ge\u00e7ersiz k\u0131lacakt\u0131r. Bu esneklik, Terraform kullan\u0131c\u0131lar\u0131na, altyap\u0131 da\u011f\u0131t\u0131mlar\u0131n\u0131 her senaryoya uyarlamak i\u00e7in g\u00fc\u00e7l\u00fc bir kontrol sa\u011flar.<\/p>\n<h2>Karma\u015f\u0131k Yap\u0131lar ve Do\u011frulama Kurallar\u0131: G\u00fcvenli De\u011fi\u015fken Y\u00f6netimi Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>Terraform de\u011fi\u015fkenleri sadece basit de\u011ferler i\u00e7in de\u011fil, ayn\u0131 zamanda karma\u015f\u0131k yap\u0131lar\u0131 temsil etmek ve bu yap\u0131lar\u0131n belirli kurallara uygunlu\u011funu kontrol etmek i\u00e7in de kullan\u0131labilir. Bu, altyap\u0131 kodunuzun daha sa\u011flam, g\u00fcvenilir ve hata toleransl\u0131 olmas\u0131n\u0131 sa\u011flar. \u00d6zellikle b\u00fcy\u00fck ekiplerde ve kritik altyap\u0131larda, de\u011fi\u015fkenlerin do\u011fru formatta ve beklenen aral\u0131kta olmas\u0131n\u0131 sa\u011flamak, olas\u0131 sorunlar\u0131 hen\u00fcz da\u011f\u0131t\u0131m a\u015famas\u0131nda engellemek anlam\u0131na gelir.<\/p>\n<h3>Karma\u015f\u0131k De\u011fi\u015fken T\u00fcrleri: <code>object<\/code> ile Yap\u0131land\u0131r\u0131lm\u0131\u015f Veri<\/h3>\n<p>\u00d6nceki b\u00f6l\u00fcmde <code>object<\/code> tipine de\u011finmi\u015ftik, ancak derinlemesine incelemek, karma\u015f\u0131k konfig\u00fcrasyonlar\u0131 nas\u0131l y\u00f6netti\u011finizi \u00f6nemli \u00f6l\u00e7\u00fcde geli\u015ftirecektir. <code>object<\/code> tipi, farkl\u0131 veri tiplerine sahip birden fazla \u00f6zelli\u011fi tek bir de\u011fi\u015fkende grupland\u0131rman\u0131za olanak tan\u0131r. Bu, \u00f6rne\u011fin bir EC2 instance'\u0131n t\u00fcm detaylar\u0131n\u0131 (AMI, instance tipi, disk boyutu, etiketler vb.) tek bir mant\u0131ksal birimde tutmak i\u00e7in m\u00fckemmeldir. Bu yakla\u015f\u0131m, ilgili ayarlar\u0131 bir arada tutarak kodun mod\u00fclerli\u011fini ve okunabilirli\u011fini art\u0131r\u0131r.<\/p>\n<pre><code>\nvariable \"server_configuration\" {\n  description = \"Web sunucusunun detayl\u0131 konfig\u00fcrasyonunu i\u00e7erir.\"\n  type = object({\n    ami_id        = string\n    instance_type = string\n    disk_size_gb  = number\n    tags          = map(string)\n    enable_monitoring = bool\n  })\n  default = {\n    ami_id        = \"ami-0abcdef1234567890\" # \u00d6rnek AMI\n    instance_type = \"t2.micro\"\n    disk_size_gb  = 20\n    tags          = { Name = \"WebServer-Default\", Environment = \"Dev\" }\n    enable_monitoring = true\n  }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu <code>server_configuration<\/code> de\u011fi\u015fkenini kullanarak, bir EC2 instance'\u0131n\u0131 a\u015fa\u011f\u0131daki gibi yap\u0131land\u0131rabilirsiniz:<\/p>\n<pre><code>\nresource \"aws_instance\" \"web\" {\n  ami           = var.server_configuration.ami_id\n  instance_type = var.server_configuration.instance_type\n  root_block_device {\n    volume_size = var.server_configuration.disk_size_gb\n  }\n  tags          = var.server_configuration.tags\n  monitoring    = var.server_configuration.enable_monitoring\n}\n<\/pre>\n<p><\/code><\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, t\u00fcm ilgili ayarlar tek bir de\u011fi\u015fkenden \u00e7ekilir, bu da kodunuzu \u00e7ok daha d\u00fczenli hale getirir.<\/p>\n<h3>Do\u011frulama Kurallar\u0131 (<code>validation<\/code> blo\u011fu)<\/h3>\n<p>De\u011fi\u015fkenlere harici de\u011ferler sa\u011fland\u0131\u011f\u0131nda, bu de\u011ferlerin ge\u00e7erli oldu\u011fundan emin olmak \u00f6nemlidir. Terraform'un <code>validation<\/code> blo\u011fu, bir de\u011fi\u015fkenin de\u011ferinin belirli ko\u015fullar\u0131 kar\u015f\u0131lay\u0131p kar\u015f\u0131lamad\u0131\u011f\u0131n\u0131 kontrol etmenizi sa\u011flar. E\u011fer ko\u015ful sa\u011flanmazsa, Terraform da\u011f\u0131t\u0131m\u0131 durdurur ve \u00f6zel bir hata mesaj\u0131 g\u00f6sterir.<\/p>\n<pre><code>\nvariable \"instance_type\" {\n  description = \"EC2 instance tipi.\"\n  type        = string\n  default     = \"t2.micro\"\n\n  validation {\n    condition     = contains([\"t2.micro\", \"t2.small\", \"t3.medium\", \"m5.large\"], var.instance_type)\n    error_message = \"Ge\u00e7ersiz EC2 instance tipi. Desteklenen tipler: t2.micro, t2.small, t3.medium, m5.large.\"\n  }\n}\n\nvariable \"min_disk_size_gb\" {\n  description = \"EBS diski i\u00e7in minimum boyut (GB).\"\n  type        = number\n  default     = 20\n\n  validation {\n    condition     = var.min_disk_size_gb >= 10 && var.min_disk_size_gb <= 1000\n    error_message = \"Disk boyutu 10 GB ile 1000 GB aras\u0131nda olmal\u0131d\u0131r.\"\n  }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rneklerde, <code>instance_type<\/code> de\u011fi\u015fkeni i\u00e7in belirli bir liste i\u00e7inde olup olmad\u0131\u011f\u0131n\u0131 kontrol ederken, <code>min_disk_size_gb<\/code> i\u00e7in say\u0131sal bir aral\u0131k kontrol\u00fc yap\u0131yoruz. <code>condition<\/code> alan\u0131, bir boolean ifade i\u00e7ermelidir ve <code>error_message<\/code> ise ko\u015fulun sa\u011flanmamas\u0131 durumunda g\u00f6sterilecek mesajd\u0131r. Bu, hatal\u0131 konfig\u00fcrasyonlar\u0131n yanl\u0131\u015fl\u0131kla da\u011f\u0131t\u0131lmas\u0131n\u0131 \u00f6nler.<\/p>\n<h3>Hassas De\u011fi\u015fkenler (<code>sensitive = true<\/code>)<\/h3>\n<p>Veritaban\u0131 \u015fifreleri, API anahtarlar\u0131 gibi hassas bilgiler Terraform de\u011fi\u015fkenleri arac\u0131l\u0131\u011f\u0131yla sa\u011flanabilir. Ancak bu bilgilerin konsol \u00e7\u0131kt\u0131lar\u0131nda veya Terraform state dosyas\u0131nda a\u00e7\u0131k\u00e7a g\u00f6r\u00fcnmesi g\u00fcvenlik riski olu\u015fturur. <code>sensitive = true<\/code> bayra\u011f\u0131, bu t\u00fcr de\u011fi\u015fkenlerin de\u011ferlerinin Terraform plan \u00e7\u0131kt\u0131s\u0131nda, apply \u00e7\u0131kt\u0131s\u0131nda ve bazen state dosyas\u0131nda gizlenmesini sa\u011flar.<\/p>\n<pre><code>\nvariable \"db_password\" {\n  description = \"Veritaban\u0131 y\u00f6neticisi \u015fifresi.\"\n  type        = string\n  sensitive   = true\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu de\u011fi\u015fkenin de\u011ferini komut sat\u0131r\u0131nda veya <code>.tfvars<\/code> dosyas\u0131nda verdi\u011finizde, Terraform plan \u00e7\u0131kt\u0131s\u0131nda bu de\u011fer <code>(sensitive value)<\/code> olarak g\u00f6r\u00fcn\u00fcr. Ancak, bu bayrak sadece g\u00f6r\u00fcnt\u00fcy\u00fc gizler; de\u011ferler hala state dosyas\u0131nda depolan\u0131r (e\u011fer do\u011frudan state'e yaz\u0131l\u0131yorsa) ve dikkatli y\u00f6netim gerektirir. Hassas verileri y\u00f6netirken ek g\u00fcvenlik \u00f6nlemleri (\u00f6rne\u011fin, bulut sa\u011flay\u0131c\u0131n\u0131n gizli y\u00f6netimi hizmetleri - AWS Secrets Manager, Azure Key Vault) kullanmak her zaman \u00f6nerilir.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Hassas verileri <code>sensitive = true<\/code> ile i\u015faretlemek iyi bir ba\u015flang\u0131\u00e7t\u0131r, ancak en iyi uygulama, bu verileri do\u011frudan state dosyas\u0131na yazmaktan ka\u00e7\u0131nmakt\u0131r. Bunun yerine, bunlar\u0131 bulut sa\u011flay\u0131c\u0131n\u0131z\u0131n gizli y\u00f6netim hizmetlerinde saklay\u0131n ve Terraform ile \u00e7al\u0131\u015fma zaman\u0131nda bu hizmetlerden \u00e7ekin.\n<\/div>\n<h2>Ger\u00e7ek D\u00fcnya Senaryosu: \u00c7ok Ortaml\u0131 Da\u011f\u0131t\u0131mlar \u0130\u00e7in De\u011fi\u015fkenleri Kullanma<\/h2>\n<p>Terraform de\u011fi\u015fkenlerinin ger\u00e7ek g\u00fcc\u00fc, \u00e7ok ortaml\u0131 da\u011f\u0131t\u0131m senaryolar\u0131nda ortaya \u00e7\u0131kar. \u00c7o\u011fu kurulu\u015f, uygulamalar\u0131n\u0131 geli\u015ftirme (dev), test (test) ve \u00fcretim (prod) gibi farkl\u0131 ortamlara da\u011f\u0131t\u0131r. Her ortam\u0131n kendine \u00f6zg\u00fc gereksinimleri (\u00f6rne\u011fin, farkl\u0131 sunucu tipleri, veritaban\u0131 boyutlar\u0131, g\u00fcvenlik kurallar\u0131) vard\u0131r. De\u011fi\u015fkenler olmadan, her ortam i\u00e7in neredeyse ayn\u0131 olan ayr\u0131 ayr\u0131 Terraform kod setleri tutmak zorunda kal\u0131rs\u0131n\u0131z ki bu da bir kabus senaryosudur: kod tekrar\u0131, y\u00fcksek bak\u0131m maliyeti ve hata yapma olas\u0131l\u0131\u011f\u0131n\u0131n artmas\u0131 anlam\u0131na gelir.<\/p>\n<p>Peki, Terraform de\u011fi\u015fkenlerini kullanarak bu durumu nas\u0131l zarif\u00e7e \u00e7\u00f6zebiliriz? Yakla\u015f\u0131m\u0131m\u0131z, ana Terraform yap\u0131land\u0131rma dosyalar\u0131m\u0131z\u0131 (\u00f6rne\u011fin, <code>main.tf<\/code>, <code>security.tf<\/code>) genel ve ortamdan ba\u011f\u0131ms\u0131z tutmak, ortam spesifik de\u011ferleri ise ayr\u0131 <code>.tfvars<\/code> dosyalar\u0131nda y\u00f6netmektir. Bu sayede, \"bir kez yaz, her yerde da\u011f\u0131t\" felsefesini benimseyebiliriz.<\/p>\n<h3>Vaka Analizi: AWS \u00dczerinde Bir Web Uygulamas\u0131n\u0131n \u00c7ok Ortaml\u0131 Da\u011f\u0131t\u0131m\u0131<\/h3>\n<p>Bir web uygulamas\u0131n\u0131 AWS'ye da\u011f\u0131tt\u0131\u011f\u0131m\u0131z\u0131 varsayal\u0131m. Bu uygulama i\u00e7in bir EC2 instance'\u0131, bir S3 bucket'\u0131 ve baz\u0131 g\u00fcvenlik gruplar\u0131 gerekiyor. Geli\u015ftirme, test ve \u00fcretim ortamlar\u0131 i\u00e7in a\u015fa\u011f\u0131daki farkl\u0131l\u0131klar\u0131 y\u00f6netece\u011fiz:<\/p>\n<ul>\n<li><strong>EC2 Instance Tipi:<\/strong> Dev i\u00e7in <code>t2.micro<\/code>, Test i\u00e7in <code>t3.small<\/code>, Prod i\u00e7in <code>m5.large<\/code>.<\/li>\n<li><strong>S3 Bucket Ad\u0131:<\/strong> Ortam ad\u0131na g\u00f6re de\u011fi\u015fmeli (\u00f6rn. <code>my-app-dev-bucket<\/code>).<\/li>\n<li><strong>EC2 Instance Say\u0131s\u0131:<\/strong> Dev i\u00e7in 1, Test i\u00e7in 2, Prod i\u00e7in 4.<\/li>\n<li><strong>Genel Etiketler:<\/strong> Her kayna\u011fa ortam\u0131 ve projeyi belirten etiketler.<\/li>\n<\/ul>\n<h4>Ad\u0131m 1: De\u011fi\u015fkenleri Tan\u0131mlay\u0131n (<code>variables.tf<\/code>)<\/h4>\n<p>T\u00fcm ortamlar i\u00e7in gerekli olabilecek de\u011fi\u015fkenleri tan\u0131mlayal\u0131m:<\/p>\n<pre><code>\n# variables.tf\nvariable \"environment\" {\n  description = \"Da\u011f\u0131t\u0131m\u0131n yap\u0131laca\u011f\u0131 ortam (dev, test, prod).\"\n  type        = string\n}\n\nvariable \"aws_region\" {\n  description = \"AWS b\u00f6lgesi.\"\n  type        = string\n  default     = \"us-east-1\"\n}\n\nvariable \"instance_type\" {\n  description = \"EC2 instance tipi.\"\n  type        = string\n}\n\nvariable \"instance_count\" {\n  description = \"Olu\u015fturulacak EC2 instance say\u0131s\u0131.\"\n  type        = number\n  default     = 1\n}\n\nvariable \"app_name\" {\n  description = \"Uygulama ad\u0131.\"\n  type        = string\n  default     = \"my-webapp\"\n}\n\nvariable \"common_tags\" {\n  description = \"T\u00fcm kaynaklara uygulanacak ortak etiketler.\"\n  type        = map(string)\n  default     = {}\n}\n<\/pre>\n<p><\/code><\/p>\n<h4>Ad\u0131m 2: Ana Terraform Kodunu Yaz\u0131n (<code>main.tf<\/code>)<\/h4>\n<p>Bu dosya, ortamdan ba\u011f\u0131ms\u0131z olacak ve de\u011fi\u015fkenleri kullanarak dinamikle\u015fecektir.<\/p>\n<pre><code>\n# main.tf\nprovider \"aws\" {\n  region = var.aws_region\n}\n\nresource \"aws_vpc\" \"main\" {\n  cidr_block = \"10.0.0.0\/16\"\n  tags = merge(\n    var.common_tags,\n    {\n      Name = \"${var.app_name}-${var.environment}-vpc\"\n    }\n  )\n}\n\nresource \"aws_subnet\" \"public\" {\n  vpc_id     = aws_vpc.main.id\n  cidr_block = \"10.0.1.0\/24\"\n  availability_zone = \"${var.aws_region}a\"\n  tags = merge(\n    var.common_tags,\n    {\n      Name = \"${var.app_name}-${var.environment}-public-subnet\"\n    }\n  )\n}\n\nresource \"aws_instance\" \"web\" {\n  count         = var.instance_count\n  ami           = \"ami-0abcdef1234567890\" # L\u00fctfen ge\u00e7erli bir AMI ID ile de\u011fi\u015ftirin\n  instance_type = var.instance_type\n  subnet_id     = aws_subnet.public.id\n  associate_public_ip_address = true\n\n  tags = merge(\n    var.common_tags,\n    {\n      Name = \"${var.app_name}-${var.environment}-web-instance-${count.index}\"\n      Environment = var.environment\n    }\n  )\n}\n\nresource \"aws_s3_bucket\" \"app_bucket\" {\n  bucket = \"${var.app_name}-${var.environment}-data\"\n  acl    = \"private\"\n  tags = merge(\n    var.common_tags,\n    {\n      Name = \"${var.app_name}-${var.environment}-bucket\"\n      Environment = var.environment\n    }\n  )\n}\n<\/pre>\n<p><\/code><\/p>\n<h4>Ad\u0131m 3: Ortama \u00d6zel De\u011fi\u015fken Dosyalar\u0131n\u0131 Olu\u015fturun<\/h4>\n<p>\u015eimdi her ortam i\u00e7in ayr\u0131 <code>.tfvars<\/code> dosyalar\u0131 olu\u015ftural\u0131m:<\/p>\n<p><strong><code>dev.tfvars<\/code><\/strong><\/p>\n<pre><code>\nenvironment   = \"dev\"\ninstance_type = \"t2.micro\"\ninstance_count = 1\naws_region    = \"us-east-1\"\ncommon_tags = {\n  Project = \"WebApp\"\n  Owner   = \"DevTeam\"\n}\n<\/pre>\n<p><\/code><\/p>\n<p><strong><code>test.tfvars<\/code><\/strong><\/p>\n<pre><code>\nenvironment   = \"test\"\ninstance_type = \"t3.small\"\ninstance_count = 2\naws_region    = \"eu-west-1\"\ncommon_tags = {\n  Project = \"WebApp\"\n  Owner   = \"TestTeam\"\n  CostCenter = \"1234\"\n}\n<\/pre>\n<p><\/code><\/p>\n<p><strong><code>prod.tfvars<\/code><\/strong><\/p>\n<pre><code>\nenvironment   = \"prod\"\ninstance_type = \"m5.large\"\ninstance_count = 4\naws_region    = \"us-west-2\"\ncommon_tags = {\n  Project = \"WebApp\"\n  Owner   = \"OpsTeam\"\n  CostCenter = \"5678\"\n  Criticality = \"High\"\n}\n<\/pre>\n<p><\/code><\/p>\n<h4>Ad\u0131m 4: Ortama \u00d6zel Da\u011f\u0131t\u0131m\u0131 Ger\u00e7ekle\u015ftirin<\/h4>\n<p>\u015eimdi her ortam i\u00e7in da\u011f\u0131t\u0131m\u0131 kolayca yapabiliriz:<\/p>\n<ul>\n<li>Geli\u015ftirme ortam\u0131 i\u00e7in:\n<pre><code>\nterraform init\nterraform plan -var-file=\"dev.tfvars\"\nterraform apply -var-file=\"dev.tfvars\"\n        <\/pre>\n<p><\/code>\n    <\/li>\n<li>Test ortam\u0131 i\u00e7in:\n<pre><code>\nterraform plan -var-file=\"test.tfvars\"\nterraform apply -var-file=\"test.tfvars\"\n        <\/pre>\n<p><\/code>\n    <\/li>\n<li>\u00dcretim ortam\u0131 i\u00e7in:\n<pre><code>\nterraform plan -var-file=\"prod.tfvars\"\nterraform apply -var-file=\"prod.tfvars\"\n        <\/pre>\n<p><\/code>\n    <\/li>\n<\/ul>\n<p>Bu yakla\u015f\u0131m sayesinde, ayn\u0131 ana Terraform kodunu kullanarak, farkl\u0131 ortamlara \u00f6zel yap\u0131land\u0131rmalar\u0131 kolayca uygulayabildik. Kod tekrar\u0131n\u0131 \u00f6nledik, her ortam i\u00e7in \u00f6zelle\u015ftirme sa\u011flad\u0131k ve bak\u0131m y\u00fck\u00fcn\u00fc \u00f6nemli \u00f6l\u00e7\u00fcde azaltt\u0131k. Bu, Terraform de\u011fi\u015fkenlerinin altyap\u0131 otomasyonunda sundu\u011fu esnekli\u011fin ve g\u00fcc\u00fcn somut bir \u00f6rne\u011fidir.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: \u00c7ok ortaml\u0131 projelerde, <code>.tfvars<\/code> dosyalar\u0131n\u0131z\u0131 bir dizin yap\u0131s\u0131 i\u00e7inde d\u00fczenlemeyi d\u00fc\u015f\u00fcnebilirsiniz (\u00f6rn. <code>environments\/dev.tfvars<\/code>, <code>environments\/prod.tfvars<\/code>). Bu, projeniz b\u00fcy\u00fcd\u00fck\u00e7e daha iyi bir organizasyon sa\u011flar.\n<\/div>\n<h2>Sonu\u00e7: De\u011fi\u015fkenlerle Terraform Ustal\u0131\u011f\u0131na Do\u011fru \u0130lk Ad\u0131mlar<\/h2>\n<p>Bu makale boyunca, Terraform de\u011fi\u015fkenlerinin neden altyap\u0131 kodunuzun olmazsa olmaz bir par\u00e7as\u0131 oldu\u011funu derinlemesine inceledik. De\u011fi\u015fkenlerin, statik altyap\u0131 tan\u0131mlar\u0131n\u0131 dinamik, yeniden kullan\u0131labilir ve ortama duyarl\u0131 \u00e7\u00f6z\u00fcmlere d\u00f6n\u00fc\u015ft\u00fcrme g\u00fcc\u00fcne sahip oldu\u011funu g\u00f6rd\u00fck. Basit string de\u011ferlerden karma\u015f\u0131k object yap\u0131lar\u0131na, varsay\u0131lan de\u011ferlerden g\u00fc\u00e7l\u00fc do\u011frulama kurallar\u0131na kadar pek \u00e7ok konuyu ele ald\u0131k. \u00d6zellikle \u00e7ok ortaml\u0131 da\u011f\u0131t\u0131m senaryolar\u0131nda de\u011fi\u015fkenlerin sa\u011flad\u0131\u011f\u0131 esneklik ve kod tekrar\u0131n\u0131 \u00f6nleme kabiliyeti, modern DevOps pratiklerinin temelini olu\u015fturur. Art\u0131k altyap\u0131n\u0131z\u0131 her senaryoya uyarlanabilir, hatas\u0131z ve \u00f6l\u00e7eklenebilir bir \u015fekilde y\u00f6netmek i\u00e7in gerekli ara\u00e7lara sahipsiniz. De\u011fi\u015fkenleri etkin bir \u015fekilde kullanarak, Terraform projelerinizin kalitesini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131racaks\u0131n\u0131z.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<h4>1. De\u011fi\u015fkenlere varsay\u0131lan de\u011fer atamak her zaman iyi bir fikir mi?<\/h4>\n<p>De\u011fi\u015fkenlere varsay\u0131lan de\u011fer atamak, de\u011fi\u015fkeni iste\u011fe ba\u011fl\u0131 hale getirir ve kullan\u0131c\u0131lar\u0131n yaln\u0131zca temel kurulumdan farkl\u0131 bir \u015fey istediklerinde de\u011fer sa\u011flamas\u0131n\u0131 gerektirir. Bu durum, mod\u00fcl\u00fcn kullan\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r. Ancak, kritik veya ortama \u00f6zel olmas\u0131 gereken de\u011ferler i\u00e7in varsay\u0131lan de\u011fer atamamak, kullan\u0131c\u0131y\u0131 bu de\u011ferleri a\u00e7\u0131k\u00e7a sa\u011flamaya zorlayarak yanl\u0131\u015f konfig\u00fcrasyonlar\u0131 engellemeye yard\u0131mc\u0131 olabilir. K\u0131sacas\u0131, kullan\u0131m senaryosuna g\u00f6re karar verilmelidir.<\/p>\n<h4>2. Hangi de\u011fi\u015fken atama y\u00f6ntemini ne zaman tercih etmeliyim?<\/h4>\n<ul>\n<li><strong><code>default<\/code> de\u011ferler:<\/strong> \u0130ste\u011fe ba\u011fl\u0131, yayg\u0131n kullan\u0131lan veya test ortamlar\u0131 i\u00e7in ba\u015flang\u0131\u00e7 de\u011ferleri.<\/li>\n<li><strong><code>terraform.tfvars<\/code> \/ <code>*.auto.tfvars<\/code>:<\/strong> Projeye \u00f6zg\u00fc, genel ve t\u00fcm ortamlarda ge\u00e7erli olmas\u0131 beklenen temel konfig\u00fcrasyonlar.<\/li>\n<li><strong><code>-var-file<\/code>:<\/strong> Ortama \u00f6zel (dev, test, prod) veya m\u00fc\u015fteri bazl\u0131 yap\u0131land\u0131rmalar. CI\/CD boru hatlar\u0131nda s\u0131kl\u0131kla kullan\u0131l\u0131r.<\/li>\n<li><strong><code>-var<\/code> bayra\u011f\u0131:<\/strong> H\u0131zl\u0131 testler, ge\u00e7ici de\u011fi\u015fiklikler veya tek seferlik da\u011f\u0131t\u0131mlar i\u00e7in.<\/li>\n<li><strong><code>TF_VAR_<\/code> ortam de\u011fi\u015fkenleri:<\/strong> CI\/CD ortamlar\u0131nda hassas verileri (API anahtarlar\u0131, \u015fifreler) veya ortam de\u011fi\u015fkenlerine ba\u011f\u0131ml\u0131 konfig\u00fcrasyonlar\u0131 g\u00fcvenli bir \u015fekilde iletmek i\u00e7in.<\/li>\n<\/ul>\n<h4>3. Sensitive de\u011fi\u015fkenleri state dosyas\u0131nda nas\u0131l korunur?<\/h4>\n<p><code>sensitive = true<\/code> olarak i\u015faretlenen de\u011fi\u015fkenler, Terraform plan ve apply \u00e7\u0131kt\u0131lar\u0131nda gizlenir. Ancak bu, de\u011fi\u015fkenin de\u011ferinin her zaman state dosyas\u0131nda da gizlendi\u011fi anlam\u0131na gelmez. E\u011fer de\u011fi\u015fkenin de\u011feri do\u011frudan bir kayna\u011f\u0131n \u00f6zniteli\u011fine atan\u0131rsa ve bu \u00f6znitelik Terraform state dosyas\u0131na kaydedilirse, de\u011fer orada g\u00f6r\u00fcn\u00fcr olabilir. Hassas verileri en iyi \u015fekilde korumak i\u00e7in, bunlar\u0131 bulut sa\u011flay\u0131c\u0131n\u0131z\u0131n gizli y\u00f6netim hizmetlerinde (AWS Secrets Manager, Azure Key Vault, Google Secret Manager) saklay\u0131n ve Terraform ile \u00e7al\u0131\u015fma zaman\u0131nda bu hizmetlerden de\u011ferleri \u00e7ekin.<\/p>\n<h4>4. De\u011fi\u015fken tiplerini belirtmek zorunlu mu?<\/h4>\n<p>Terraform'da de\u011fi\u015fken tiplerini belirtmek zorunlu de\u011fildir. E\u011fer bir tip belirtmezseniz, Terraform de\u011feri dinamik olarak alg\u0131lamaya \u00e7al\u0131\u015f\u0131r. Ancak, tipleri a\u00e7\u0131k\u00e7a belirtmek (\u00f6rne\u011fin, <code>type = string<\/code> veya <code>type = number<\/code>), kodunuzun okunabilirli\u011fini art\u0131r\u0131r, hata ay\u0131klamay\u0131 kolayla\u015ft\u0131r\u0131r ve yanl\u0131\u015f veri giri\u015fi nedeniyle olu\u015fabilecek hatalar\u0131 en aza indirir. Bu nedenle, iyi bir pratik olarak her zaman de\u011fi\u015fken tiplerini belirtmeniz \u00f6nerilir.<\/p>\n<h4>5. List veya map de\u011fi\u015fkenler i\u00e7inde nas\u0131l d\u00f6ng\u00fc yapabilirim?<\/h4>\n<p>Terraform'da <code>for_each<\/code> veya <code>count<\/code> meta-arg\u00fcmanlar\u0131n\u0131 kullanarak list veya map de\u011fi\u015fkenleri \u00fczerinde d\u00f6ng\u00fc yapabilirsiniz. <code>for_each<\/code>, benzersiz anahtar-de\u011fer \u00e7iftleri veya benzersiz string listeleri \u00fczerinde yineleme yapmak i\u00e7in idealdir ve daha esnektir. <code>count<\/code> ise basit say\u0131sal yinelemeler i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, bir listeyi kullanarak birden fazla EC2 instance'\u0131 olu\u015fturmak veya bir map'i kullanarak birden fazla etiket tan\u0131mlamak m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<pre><code>\n# main.tf (for_each \u00f6rne\u011fi)\nresource \"aws_instance\" \"app_servers\" {\n  for_each = var.instance_configs # instance_configs bir map de\u011fi\u015fkeni olabilir\n  ami           = each.value.ami_id\n  instance_type = each.value.instance_type\n  tags = {\n    Name = each.key\n  }\n}\n<\/pre>\n<p><\/code><br \/>\n<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Altyap\u0131 kodunuzu her ortam i\u00e7in ba\u015ftan m\u0131 yaz\u0131yorsunuz? Tek bir de\u011fer de\u011fi\u015fikli\u011fi i\u00e7in onlarca dosya m\u0131 d\u00fczenlemeniz gerekiyor?&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-36185","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: Altyap\u0131y\u0131 Dinamik Hale Getirme Rehberi<\/title>\n<meta name=\"description\" content=\"Altyap\u0131 kodunuzu her ortam i\u00e7in ba\u015ftan m\u0131 yaz\u0131yorsunuz? Tek bir de\u011fer de\u011fi\u015fikli\u011fi i\u00e7in onlarca dosya m\u0131 d\u00fczenlemeniz gerekiyor? Terraform de\u011fi\u015fkenleri, bu karma\u015f\u0131kl\u0131\u011f\u0131 ortadan kald\u0131rarak altyap\u0131 kodunuzu dinamik, esnek ve yeniden kullan\u0131labilir hale getirir. Bu kapsaml\u0131 rehberde, Terraform de\u011fi\u015fkenlerini s\u0131f\u0131rdan \u00f6\u011frenin, nas\u0131l tan\u0131mlayaca\u011f\u0131n\u0131z\u0131, farkl\u0131 t\u00fcrlerini ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedin.\" \/>\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-altyapiyi-dinamik-hale-getirme-rehberi\/\" \/>\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: Altyap\u0131y\u0131 Dinamik Hale Getirme Rehberi\" \/>\n<meta property=\"og:description\" content=\"Altyap\u0131 kodunuzu her ortam i\u00e7in ba\u015ftan m\u0131 yaz\u0131yorsunuz? Tek bir de\u011fer de\u011fi\u015fikli\u011fi i\u00e7in onlarca dosya m\u0131 d\u00fczenlemeniz gerekiyor? Terraform de\u011fi\u015fkenleri, bu karma\u015f\u0131kl\u0131\u011f\u0131 ortadan kald\u0131rarak altyap\u0131 kodunuzu dinamik, esnek ve yeniden kullan\u0131labilir hale getirir. Bu kapsaml\u0131 rehberde, Terraform de\u011fi\u015fkenlerini s\u0131f\u0131rdan \u00f6\u011frenin, nas\u0131l tan\u0131mlayaca\u011f\u0131n\u0131z\u0131, farkl\u0131 t\u00fcrlerini ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedin.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-altyapiyi-dinamik-hale-getirme-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-09T17:31:05+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=\"14 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-altyapiyi-dinamik-hale-getirme-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-altyapiyi-dinamik-hale-getirme-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Terraform De\u011fi\u015fkenleri: Altyap\u0131y\u0131 Dinamik Hale Getirme Rehberi\",\"datePublished\":\"2025-12-09T17:31:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-altyapiyi-dinamik-hale-getirme-rehberi\/\"},\"wordCount\":3737,\"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-altyapiyi-dinamik-hale-getirme-rehberi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-altyapiyi-dinamik-hale-getirme-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-altyapiyi-dinamik-hale-getirme-rehberi\/\",\"name\":\"Terraform De\u011fi\u015fkenleri: Altyap\u0131y\u0131 Dinamik Hale Getirme Rehberi\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-09T17:31:05+00:00\",\"description\":\"Altyap\u0131 kodunuzu her ortam i\u00e7in ba\u015ftan m\u0131 yaz\u0131yorsunuz? Tek bir de\u011fer de\u011fi\u015fikli\u011fi i\u00e7in onlarca dosya m\u0131 d\u00fczenlemeniz gerekiyor? Terraform de\u011fi\u015fkenleri, bu karma\u015f\u0131kl\u0131\u011f\u0131 ortadan kald\u0131rarak altyap\u0131 kodunuzu dinamik, esnek ve yeniden kullan\u0131labilir hale getirir. Bu kapsaml\u0131 rehberde, Terraform de\u011fi\u015fkenlerini s\u0131f\u0131rdan \u00f6\u011frenin, nas\u0131l tan\u0131mlayaca\u011f\u0131n\u0131z\u0131, farkl\u0131 t\u00fcrlerini ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedin.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-altyapiyi-dinamik-hale-getirme-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-altyapiyi-dinamik-hale-getirme-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-altyapiyi-dinamik-hale-getirme-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Terraform De\u011fi\u015fkenleri: Altyap\u0131y\u0131 Dinamik Hale Getirme Rehberi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Terraform De\u011fi\u015fkenleri: Altyap\u0131y\u0131 Dinamik Hale Getirme Rehberi","description":"Altyap\u0131 kodunuzu her ortam i\u00e7in ba\u015ftan m\u0131 yaz\u0131yorsunuz? Tek bir de\u011fer de\u011fi\u015fikli\u011fi i\u00e7in onlarca dosya m\u0131 d\u00fczenlemeniz gerekiyor? Terraform de\u011fi\u015fkenleri, bu karma\u015f\u0131kl\u0131\u011f\u0131 ortadan kald\u0131rarak altyap\u0131 kodunuzu dinamik, esnek ve yeniden kullan\u0131labilir hale getirir. Bu kapsaml\u0131 rehberde, Terraform de\u011fi\u015fkenlerini s\u0131f\u0131rdan \u00f6\u011frenin, nas\u0131l tan\u0131mlayaca\u011f\u0131n\u0131z\u0131, farkl\u0131 t\u00fcrlerini ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedin.","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-altyapiyi-dinamik-hale-getirme-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Terraform De\u011fi\u015fkenleri: Altyap\u0131y\u0131 Dinamik Hale Getirme Rehberi","og_description":"Altyap\u0131 kodunuzu her ortam i\u00e7in ba\u015ftan m\u0131 yaz\u0131yorsunuz? Tek bir de\u011fer de\u011fi\u015fikli\u011fi i\u00e7in onlarca dosya m\u0131 d\u00fczenlemeniz gerekiyor? Terraform de\u011fi\u015fkenleri, bu karma\u015f\u0131kl\u0131\u011f\u0131 ortadan kald\u0131rarak altyap\u0131 kodunuzu dinamik, esnek ve yeniden kullan\u0131labilir hale getirir. Bu kapsaml\u0131 rehberde, Terraform de\u011fi\u015fkenlerini s\u0131f\u0131rdan \u00f6\u011frenin, nas\u0131l tan\u0131mlayaca\u011f\u0131n\u0131z\u0131, farkl\u0131 t\u00fcrlerini ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedin.","og_url":"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-altyapiyi-dinamik-hale-getirme-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-09T17:31:05+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"14 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-altyapiyi-dinamik-hale-getirme-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-altyapiyi-dinamik-hale-getirme-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Terraform De\u011fi\u015fkenleri: Altyap\u0131y\u0131 Dinamik Hale Getirme Rehberi","datePublished":"2025-12-09T17:31:05+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-altyapiyi-dinamik-hale-getirme-rehberi\/"},"wordCount":3737,"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-altyapiyi-dinamik-hale-getirme-rehberi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-altyapiyi-dinamik-hale-getirme-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-altyapiyi-dinamik-hale-getirme-rehberi\/","name":"Terraform De\u011fi\u015fkenleri: Altyap\u0131y\u0131 Dinamik Hale Getirme Rehberi","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-09T17:31:05+00:00","description":"Altyap\u0131 kodunuzu her ortam i\u00e7in ba\u015ftan m\u0131 yaz\u0131yorsunuz? Tek bir de\u011fer de\u011fi\u015fikli\u011fi i\u00e7in onlarca dosya m\u0131 d\u00fczenlemeniz gerekiyor? Terraform de\u011fi\u015fkenleri, bu karma\u015f\u0131kl\u0131\u011f\u0131 ortadan kald\u0131rarak altyap\u0131 kodunuzu dinamik, esnek ve yeniden kullan\u0131labilir hale getirir. Bu kapsaml\u0131 rehberde, Terraform de\u011fi\u015fkenlerini s\u0131f\u0131rdan \u00f6\u011frenin, nas\u0131l tan\u0131mlayaca\u011f\u0131n\u0131z\u0131, farkl\u0131 t\u00fcrlerini ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedin.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-altyapiyi-dinamik-hale-getirme-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-altyapiyi-dinamik-hale-getirme-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/terraform-degiskenleri-altyapiyi-dinamik-hale-getirme-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Terraform De\u011fi\u015fkenleri: Altyap\u0131y\u0131 Dinamik Hale Getirme Rehberi"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36185","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=36185"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36185\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36185"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36185"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36185"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}