{"id":35695,"date":"2025-12-02T21:31:15","date_gmt":"2025-12-02T18:31:15","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/terraform-meta-argumanlari-count-depends_on-for_each-rehberi\/"},"modified":"2025-12-02T21:31:15","modified_gmt":"2025-12-02T18:31:15","slug":"terraform-meta-argumanlari-count-depends_on-for_each-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/terraform-meta-argumanlari-count-depends_on-for_each-rehberi\/","title":{"rendered":"Terraform Meta Arg\u00fcmanlar\u0131: count, depends_on, for_each Rehberi"},"content":{"rendered":"<p><body><\/p>\n<p>\n        G\u00fcn\u00fcm\u00fcz\u00fcn dinamik bulut altyap\u0131lar\u0131nda, kaynak y\u00f6netimini verimli ve tekrarlanabilir bir \u015fekilde yapmak her zamankinden daha kritik. AWS \u00fczerinde karma\u015f\u0131k altyap\u0131lar kurarken, bir\u00e7ok benzer kayna\u011f\u0131 da\u011f\u0131tmak, aralar\u0131ndaki ba\u011f\u0131ml\u0131l\u0131klar\u0131 do\u011fru y\u00f6netmek veya dinamik ko\u015fullara g\u00f6re farkl\u0131 kaynaklar olu\u015fturmak gibi zorluklarla kar\u015f\u0131la\u015fabiliriz. Bu noktada <a href=\"https:\/\/www.terraform.io\/\">Terraform<\/a>&#8216;un meta arg\u00fcmanlar\u0131 olan <code>count<\/code>, <code>depends_on<\/code> ve <code>for_each<\/code>, altyap\u0131 kodunuzu (Infrastructure as Code &#8211; IaC) daha esnek, okunabilir ve y\u00f6netilebilir hale getirerek adeta bir s\u00fcper g\u00fc\u00e7 kazand\u0131r\u0131r. Bu makalede, bu g\u00fc\u00e7l\u00fc arg\u00fcmanlar\u0131n ne i\u015fe yarad\u0131\u011f\u0131n\u0131, neden vazge\u00e7ilmez olduklar\u0131n\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l etkili bir \u015fekilde kullan\u0131labilece\u011fini ad\u0131m ad\u0131m inceleyece\u011fiz.\n    <\/p>\n<p>\n        Altyap\u0131n\u0131n kod olarak y\u00f6netilmesi (Infrastructure as Code &#8211; IaC) prati\u011fi, g\u00fcn\u00fcm\u00fcz bulut bili\u015fim d\u00fcnyas\u0131n\u0131n temel ta\u015flar\u0131ndan biridir. Terraform, bu prati\u011fi benimseyen en pop\u00fcler ara\u00e7lardan biridir ve altyap\u0131n\u0131z\u0131 deklaratif bir \u015fekilde tan\u0131mlaman\u0131za olanak tan\u0131r. Ancak, sadece kaynaklar\u0131 tan\u0131mlamak her zaman yeterli olmaz. Bir\u00e7ok senaryoda, ayn\u0131 tipte birden fazla kaynak olu\u015fturman\u0131z, belirli kaynaklar\u0131n di\u011ferleri tamamland\u0131ktan sonra devreye girmesini sa\u011flaman\u0131z veya farkl\u0131 ko\u015fullara g\u00f6re dinamik olarak kaynaklar tan\u0131mlaman\u0131z gerekebilir. \u0130\u015fte tam bu noktada Terraform&#8217;un meta arg\u00fcmanlar\u0131 devreye girer.\n    <\/p>\n<p>\n        Meta arg\u00fcmanlar, Terraform&#8217;da tan\u0131mlad\u0131\u011f\u0131n\u0131z kaynaklar\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc ve davran\u0131\u015flar\u0131n\u0131 kontrol eden \u00f6zel arg\u00fcmanlard\u0131r. Bunlar, bir kayna\u011f\u0131n kendisinin \u00f6zelliklerini (\u00f6rne\u011fin, bir EC2 \u00f6rne\u011finin boyutu veya bir S3 paketinin ad\u0131) tan\u0131mlamazlar; bunun yerine, o kayna\u011f\u0131n nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131, ne zaman olu\u015fturulaca\u011f\u0131n\u0131 veya ka\u00e7 tane olu\u015fturulaca\u011f\u0131n\u0131 belirlerler. Bu, kodunuzda tekrar\u0131 \u00f6nler, bak\u0131m\u0131 kolayla\u015ft\u0131r\u0131r ve altyap\u0131n\u0131z\u0131 daha mod\u00fcler hale getirir.\n    <\/p>\n<p>\n        Peki, hangi durumlarda bu meta arg\u00fcmanlar kurtar\u0131c\u0131m\u0131z olur?\n    <\/p>\n<ul>\n<li>\n            <strong>Tekrarlayan Kaynak Olu\u015fturma:<\/strong> Bir web uygulamas\u0131n\u0131n y\u00fck\u00fcn\u00fc dengelemek i\u00e7in 5 adet ayn\u0131 EC2 \u00f6rne\u011fine mi ihtiyac\u0131n\u0131z var? Veya geli\u015ftirme, test ve \u00fcretim ortamlar\u0131 i\u00e7in ayn\u0131 a\u011f altyap\u0131s\u0131n\u0131 m\u0131 kurmal\u0131s\u0131n\u0131z? <code>count<\/code> arg\u00fcman\u0131, bu t\u00fcr tekrarlayan g\u00f6revleri tek bir kod blo\u011fu ile halletmenizi sa\u011flar.\n        <\/li>\n<li>\n            <strong>Kaynak Ba\u011f\u0131ml\u0131l\u0131klar\u0131:<\/strong> Bir AWS Lambda fonksiyonu genellikle bir S3 paketine eri\u015fim iznine ihtiya\u00e7 duyar. Bu durumda, S3 paketi olu\u015fturulmadan \u00f6nce veya e\u015f zamanl\u0131 olarak IAM rol\u00fc ve politikas\u0131 tan\u0131mlanmal\u0131, Lambda fonksiyonu da bu IAM rol\u00fc ve S3 paketi haz\u0131r oldu\u011funda olu\u015fturulmal\u0131d\u0131r. Terraform \u00e7o\u011fu zaman ba\u011f\u0131ml\u0131l\u0131klar\u0131 otomatik alg\u0131lar, ancak baz\u0131 karma\u015f\u0131k veya \u00f6zel senaryolarda a\u00e7\u0131k\u00e7a belirtmeniz gerekebilir. \u0130\u015fte <code>depends_on<\/code> bu t\u00fcr durumlarda kullan\u0131l\u0131r.\n        <\/li>\n<li>\n            <strong>Dinamik ve Ko\u015fullu Kaynaklar:<\/strong> Belirli bir ortama (\u00f6rne\u011fin, geli\u015ftirme veya \u00fcretim) ba\u011fl\u0131 olarak farkl\u0131 say\u0131da veya farkl\u0131 konfig\u00fcrasyonlarda kaynaklar olu\u015fturman\u0131z gerekebilir. Veya farkl\u0131 g\u00fcvenlik gruplar\u0131 i\u00e7in farkl\u0131 kurallar tan\u0131mlaman\u0131z gerekebilir. <code>for_each<\/code> arg\u00fcman\u0131, bir liste veya harita \u00fczerinden dinamik olarak kaynaklar olu\u015fturarak bu esnekli\u011fi sa\u011flar.\n        <\/li>\n<\/ul>\n<p>\n        Bu arg\u00fcmanlar, sadece kod tekrar\u0131n\u0131 azaltmakla kalmaz, ayn\u0131 zamanda insan hatas\u0131n\u0131 da minimuma indirir. Manuel olarak onlarca benzer kayna\u011f\u0131 kopyalay\u0131p yap\u0131\u015ft\u0131rmak yerine, tek bir \u015fablonla y\u00fczlerce kayna\u011f\u0131 y\u00f6netmek, hem zaman kazand\u0131r\u0131r hem de tutarl\u0131l\u0131\u011f\u0131 garanti eder. Dahas\u0131, bu sayede altyap\u0131n\u0131z\u0131n \u00f6l\u00e7eklenebilirli\u011fi artar; bir kayna\u011f\u0131n say\u0131s\u0131n\u0131 art\u0131rmak veya azaltmak sadece tek bir say\u0131 de\u011ferini de\u011fi\u015ftirmek kadar basit hale gelir. \u015eimdi bu g\u00fc\u00e7l\u00fc ara\u00e7lar\u0131 daha yak\u0131ndan inceleyelim ve her birini \u00f6rneklerle peki\u015ftirelim.\n    <\/p>\n<h2>Terraform&#8217;da <code>count<\/code> Arg\u00fcman\u0131 ile Kaynaklar\u0131 Kopyalama Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>\n        Terraform&#8217;da <code>count<\/code> arg\u00fcman\u0131, ayn\u0131 tipte birden fazla kaynak olu\u015fturman\u0131z gerekti\u011finde kurtar\u0131c\u0131 rol oynar. \u00d6zellikle bir web sunucusu grubunu, veritaban\u0131 replikalar\u0131n\u0131 veya birden fazla geli\u015ftirme ortam\u0131n\u0131 otomatik olarak olu\u015ftururken <code>count<\/code>&#8216;\u0131n g\u00fcc\u00fcn\u00fc hissedersiniz. Temelde, bir kayna\u011f\u0131n ka\u00e7 kez olu\u015fturulaca\u011f\u0131n\u0131 belirten bir tam say\u0131 de\u011feri al\u0131r.\n    <\/p>\n<p>\n        <code>count<\/code> kullan\u0131m\u0131 son derece basittir: bir kayna\u011f\u0131n tan\u0131m blo\u011funa <code>count = N<\/code> \u015feklinde bir sat\u0131r eklersiniz, burada N olu\u015fturmak istedi\u011finiz kopya say\u0131s\u0131d\u0131r. Terraform, bu sayede N adet ayr\u0131 kaynak \u00f6rne\u011fi olu\u015fturur ve her birine benzersiz bir index atar. Bu index&#8217;e <code>count.index<\/code> ile eri\u015febilirsiniz, bu da her bir kayna\u011f\u0131 \u00f6zelle\u015ftirmenize olanak tan\u0131r.\n    <\/p>\n<p>\n        Bir \u00f6rnek \u00fczerinden gidelim: Diyelim ki AWS \u00fczerinde \u00fc\u00e7 adet EC2 web sunucusu olu\u015fturmak istiyorsunuz.\n    <\/p>\n<pre><code class=\"language-hcl\">\nresource \"aws_instance\" \"web_server\" {\n  count         = 3\n  ami           = \"ami-0abcdef1234567890\" # L\u00fctfen kendi b\u00f6lgeniz i\u00e7in ge\u00e7erli bir AMI ID kullan\u0131n\n  instance_type = \"t2.micro\"\n  tags = {\n    Name = \"web-server-${count.index}\"\n    Environment = \"production\"\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>\n        Bu kod blo\u011fu \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda, Terraform otomatik olarak <code>web-server-0<\/code>, <code>web-server-1<\/code> ve <code>web-server-2<\/code> adlar\u0131nda \u00fc\u00e7 adet EC2 \u00f6rne\u011fi olu\u015fturacakt\u0131r. <code>${count.index}<\/code> ifadesi, her bir \u00f6rne\u011fe benzersiz bir ad vererek onlar\u0131n birbirinden ay\u0131rt edilmesini sa\u011flar.\n    <\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: <code>count<\/code> de\u011feri 0 oldu\u011funda, Terraform ilgili kayna\u011f\u0131 olu\u015fturmaz. Bu, ko\u015fullu kaynak olu\u015fturma i\u00e7in olduk\u00e7a kullan\u0131\u015fl\u0131d\u0131r. \u00d6rne\u011fin, bir geli\u015ftirme ortam\u0131nda bir kayna\u011f\u0131 devre d\u0131\u015f\u0131 b\u0131rakmak i\u00e7in <code>count = var.is_dev_env ? 0 : 1<\/code> gibi bir ifade kullanabilirsiniz.\n    <\/div>\n<h3>Vaka Analizi: Otomatik \u00d6l\u00e7eklenen Web Uygulamas\u0131 i\u00e7in N adet EC2 Olu\u015fturma<\/h3>\n<p>\n        Bir e-ticaret uygulaman\u0131z oldu\u011funu ve belirli bir saatte artan trafi\u011fi kar\u015f\u0131lamak i\u00e7in birden fazla web sunucusuna ihtiyac\u0131n\u0131z oldu\u011funu d\u00fc\u015f\u00fcnelim. Uygulaman\u0131n temel mant\u0131\u011f\u0131 ayn\u0131 olsa da, y\u00fck dengeleyici arkas\u0131nda \u00e7al\u0131\u015fan sunucular\u0131n benzersiz tan\u0131mlay\u0131c\u0131lara sahip olmas\u0131, loglama ve izleme a\u00e7\u0131s\u0131ndan faydal\u0131 olacakt\u0131r.\n    <\/p>\n<pre><code class=\"language-hcl\">\n# variables.tf\nvariable \"instance_count\" {\n  description = \"Olu\u015fturulacak EC2 instance say\u0131s\u0131.\"\n  type        = number\n  default     = 2\n}\n\nvariable \"ami_id\" {\n  description = \"EC2 instance i\u00e7in kullan\u0131lacak AMI ID.\"\n  type        = string\n  default     = \"ami-0abcdef1234567890\" # Kendi AMI'nizi buraya girin\n}\n\nvariable \"instance_type\" {\n  description = \"EC2 instance tipi.\"\n  type        = string\n  default     = \"t2.micro\"\n}\n\n# main.tf\nresource \"aws_instance\" \"app_server\" {\n  count         = var.instance_count\n  ami           = var.ami_id\n  instance_type = var.instance_type\n  key_name      = \"my-ssh-key\" # Kendi SSH anahtar ad\u0131n\u0131z\u0131 girin\n  vpc_security_group_ids = [aws_security_group.web_sg.id]\n  subnet_id     = aws_subnet.public_subnet.id # Olu\u015fturdu\u011funuz bir subnet\n  \n  tags = {\n    Name        = \"app-server-${count.index}\"\n    Project     = \"E-Commerce\"\n    Environment = \"Production\"\n  }\n}\n\nresource \"aws_security_group\" \"web_sg\" {\n  name        = \"web-server-security-group\"\n  description = \"Allow HTTP and SSH inbound traffic\"\n  vpc_id      = aws_vpc.main.id # Olu\u015fturdu\u011funuz bir VPC\n  \n  ingress {\n    description = \"SSH from anywhere\"\n    from_port   = 22\n    to_port     = 22\n    protocol    = \"tcp\"\n    cidr_blocks = [\"0.0.0.0\/0\"]\n  }\n\n  ingress {\n    description = \"HTTP from anywhere\"\n    from_port   = 80\n    to_port     = 80\n    protocol    = \"tcp\"\n    cidr_blocks = [\"0.0.0.0\/0\"]\n  }\n\n  egress {\n    from_port   = 0\n    to_port     = 0\n    protocol    = \"-1\"\n    cidr_blocks = [\"0.0.0.0\/0\"]\n  }\n}\n\n# Di\u011fer VPC, Subnet, vb. kaynak tan\u0131mlamalar\u0131 burada yer al\u0131r.\n# \u00d6rne\u011fin:\nresource \"aws_vpc\" \"main\" {\n  cidr_block = \"10.0.0.0\/16\"\n  tags = { Name = \"main-vpc\" }\n}\n\nresource \"aws_subnet\" \"public_subnet\" {\n  vpc_id            = aws_vpc.main.id\n  cidr_block        = \"10.0.1.0\/24\"\n  availability_zone = \"us-east-1a\" # Kendi AZ'nizi se\u00e7in\n  tags = { Name = \"public-subnet\" }\n}\n\noutput \"instance_public_ips\" {\n  description = \"Web sunucular\u0131n\u0131n genel IP adresleri.\"\n  value       = aws_instance.app_server.*.public_ip\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>\n        Bu \u00f6rnekte, <code>var.instance_count<\/code> de\u011fi\u015fkeni sayesinde ka\u00e7 adet EC2 \u00f6rne\u011fi olu\u015fturaca\u011f\u0131n\u0131z\u0131 kolayca kontrol edebilirsiniz. Kodunuzu tekrar etmeden, sadece bir de\u011fi\u015fkenin de\u011ferini de\u011fi\u015ftirerek altyap\u0131n\u0131z\u0131 \u00f6l\u00e7eklendirmek m\u00fcmk\u00fcnd\u00fcr. Ayr\u0131ca, <code>output \"instance_public_ips\"<\/code> blo\u011fu, t\u00fcm olu\u015fturulan sunucular\u0131n genel IP adreslerini listeleyerek Terraform \u00e7\u0131kt\u0131lar\u0131nda g\u00f6r\u00fcnt\u00fclemenizi sa\u011flar. Bu, \u00f6zellikle y\u00fck dengeleyici yap\u0131land\u0131rmas\u0131 gibi sonraki ad\u0131mlar i\u00e7in olduk\u00e7a faydal\u0131d\u0131r.\n    <\/p>\n<p>\n        <code>count<\/code> arg\u00fcman\u0131, kaynaklar\u0131n simetrik olarak da\u011f\u0131t\u0131lmas\u0131 gereken durumlarda m\u00fckemmel bir \u00e7\u00f6z\u00fcmd\u00fcr. Ancak, her bir kayna\u011f\u0131n benzersiz bir \u00f6zelli\u011fe veya konfig\u00fcrasyona sahip olmas\u0131 gerekti\u011finde, <code>for_each<\/code> arg\u00fcman\u0131 daha uygun bir se\u00e7enek olabilir. Bu ikisi aras\u0131ndaki fark\u0131 ve ne zaman hangisini kullanaca\u011f\u0131n\u0131z\u0131 ilerleyen b\u00f6l\u00fcmlerde daha detayl\u0131 inceleyece\u011fiz. \u015eimdilik, <code>count<\/code> ile tekrarlayan g\u00f6revleri nas\u0131l basitle\u015ftirebilece\u011finizi ve altyap\u0131n\u0131z\u0131 nas\u0131l daha y\u00f6netilebilir hale getirebilece\u011finizi anlamak \u00f6nemlidir.\n    <\/p>\n<h2>Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Y\u00f6netmek: <code>depends_on<\/code> Arg\u00fcman\u0131n\u0131 Ne Zaman Kullanmal\u0131y\u0131z?<\/h2>\n<p>\n        Terraform, kaynaklar aras\u0131ndaki ba\u011f\u0131ml\u0131l\u0131klar\u0131 genellikle otomatik olarak anlar ve do\u011fru s\u0131rayla olu\u015fturur. \u00d6rne\u011fin, bir EC2 \u00f6rne\u011fi tan\u0131mlad\u0131\u011f\u0131n\u0131zda ve bu \u00f6rne\u011fin bir g\u00fcvenlik grubuna veya bir alt a\u011fa atanmas\u0131n\u0131 istedi\u011finizde, Terraform \u00f6nce g\u00fcvenlik grubunu ve alt a\u011f\u0131 olu\u015fturur, ard\u0131ndan EC2 \u00f6rne\u011fini da\u011f\u0131t\u0131r. Bu t\u00fcr ba\u011f\u0131ml\u0131l\u0131klar, bir kayna\u011f\u0131n ba\u015fka bir kayna\u011f\u0131n \u00e7\u0131kt\u0131s\u0131n\u0131 (\u00f6rne\u011fin, bir g\u00fcvenlik grubunun ID'si) kulland\u0131\u011f\u0131nda \"\u00f6rt\u00fck ba\u011f\u0131ml\u0131l\u0131klar\" olarak adland\u0131r\u0131l\u0131r. Ancak, baz\u0131 durumlarda bu \u00f6rt\u00fck ba\u011f\u0131ml\u0131l\u0131klar yeterli olmayabilir ve bir kayna\u011f\u0131n ba\u015fka bir kayna\u011fa a\u00e7\u0131k\u00e7a ba\u011f\u0131ml\u0131 oldu\u011funu belirtmeniz gerekebilir. \u0130\u015fte bu noktada <code>depends_on<\/code> meta arg\u00fcman\u0131 devreye girer.\n    <\/p>\n<p>\n        <code>depends_on<\/code>, bir kayna\u011f\u0131n, belirtilen di\u011fer kaynaklar tamamen olu\u015fturulana, g\u00fcncellenene veya silinene kadar da\u011f\u0131t\u0131m\u0131na ba\u015flanmamas\u0131 gerekti\u011fini Terraform'a a\u00e7\u0131k\u00e7a bildirir. Bu arg\u00fcman, bir liste \u015feklinde kaynak referanslar\u0131 al\u0131r. \u00d6rne\u011fin: <code>depends_on = [aws_resource.example_resource, aws_another_resource.another]<\/code>.\n    <\/p>\n<p>\n        Peki, <code>depends_on<\/code>'\u0131 ne zaman kullanmal\u0131y\u0131z?\n    <\/p>\n<ul>\n<li>\n            <strong>\u00d6rt\u00fck Ba\u011f\u0131ml\u0131l\u0131klar\u0131n Yetersiz Kald\u0131\u011f\u0131 Durumlar:<\/strong> Baz\u0131 AWS servisleri, aralar\u0131ndaki ili\u015fkiyi do\u011frudan bir \u00e7\u0131kt\u0131 referans\u0131 ile ifade etmez. \u00d6rne\u011fin, bir Lambda fonksiyonunun \u00e7al\u0131\u015fabilmesi i\u00e7in belirli bir IAM rol\u00fcne ihtiyac\u0131 vard\u0131r. Lambda fonksiyonu bu IAM rol\u00fcn\u00fcn bir \u00f6zelli\u011fini do\u011frudan kullanmasa da (\u00f6rne\u011fin, rol\u00fcn ID'sini bir parametre olarak ge\u00e7mese de), rol\u00fcn mevcut olmas\u0131 gerekir.\n        <\/li>\n<li>\n            <strong>API Tutars\u0131zl\u0131klar\u0131:<\/strong> Bazen bulut sa\u011flay\u0131c\u0131s\u0131n\u0131n API'sinde olu\u015fan k\u0131sa s\u00fcreli tutars\u0131zl\u0131klar nedeniyle, bir kaynak hemen sonraki kayna\u011f\u0131n da\u011f\u0131t\u0131m\u0131nda kullan\u0131lamayabilir. <code>depends_on<\/code>, bu t\u00fcr durumlarda ek bir bekleme s\u00fcresi sa\u011flayarak kararl\u0131l\u0131\u011f\u0131 art\u0131rabilir.\n        <\/li>\n<li>\n            <strong>Custom Resources ve Harici Sistem Entegrasyonlar\u0131:<\/strong> E\u011fer Terraform'un y\u00f6netti\u011fi kaynaklar d\u0131\u015f\u0131nda, harici bir sistemle etkile\u015fimde bulunan (\u00f6rne\u011fin, bir sunucuya uygulama da\u011f\u0131t\u0131m\u0131 yapan) bir Terraform Provisioner veya Custom Resource kullan\u0131yorsan\u0131z, bu i\u015flemlerin belirli bir AWS kayna\u011f\u0131 olu\u015fturulduktan sonra ba\u015flamas\u0131n\u0131 sa\u011flamak i\u00e7in <code>depends_on<\/code> kullanabilirsiniz.\n        <\/li>\n<\/ul>\n<h3>Vaka Analizi: Veritaban\u0131 \u00d6nce, Uygulama Sonra: <code>depends_on<\/code> ile S\u0131ral\u0131 Da\u011f\u0131t\u0131m<\/h3>\n<p>\n        Bir mikroservis mimarisinde, uygulaman\u0131z\u0131n da\u011f\u0131t\u0131m\u0131ndan \u00f6nce veritaban\u0131n\u0131n ve ilgili \u015femalar\u0131n haz\u0131r olmas\u0131 kritik \u00f6neme sahiptir. Diyelim ki bir AWS RDS veritaban\u0131 \u00f6rne\u011fi olu\u015fturuyor ve ard\u0131ndan bu veritaban\u0131na ba\u011flanacak bir EC2 uygulamas\u0131n\u0131 da\u011f\u0131t\u0131yorsunuz. Uygulaman\u0131n ba\u015flat\u0131labilmesi i\u00e7in RDS'in tamamen aya\u011fa kalkm\u0131\u015f ve eri\u015filebilir olmas\u0131 gerekir.\n    <\/p>\n<pre><code class=\"language-hcl\">\n# 1. AWS RDS Veritaban\u0131 Olu\u015fturma\nresource \"aws_db_instance\" \"my_db\" {\n  allocated_storage    = 20\n  engine               = \"mysql\"\n  engine_version       = \"5.7\"\n  instance_class       = \"db.t2.micro\"\n  name                 = \"mydb\"\n  username             = \"admin\"\n  password             = \"Password123\" # Ger\u00e7ek bir senaryoda bu hassas bilgiyi HashiCorp Vault gibi bir yerden almal\u0131s\u0131n\u0131z.\n  parameter_group_name = \"default.mysql5.7\"\n  skip_final_snapshot  = true\n  vpc_security_group_ids = [aws_security_group.db_sg.id]\n  db_subnet_group_name = aws_db_subnet_group.default.name\n  \n  tags = {\n    Name = \"application-db\"\n  }\n}\n\n# 2. Veritaban\u0131 G\u00fcvenlik Grubu (DB'ye eri\u015fimi kontrol eder)\nresource \"aws_security_group\" \"db_sg\" {\n  name        = \"db-security-group\"\n  description = \"Allow inbound traffic for DB\"\n  vpc_id      = aws_vpc.main.id # Mevcut bir VPC\n  \n  ingress {\n    from_port   = 3306\n    to_port     = 3306\n    protocol    = \"tcp\"\n    cidr_blocks = [\"10.0.1.0\/24\"] # Sadece uygulama sunucusunun \u00e7al\u0131\u015ft\u0131\u011f\u0131 alt a\u011fdan eri\u015fime izin ver\n  }\n}\n\n# 3. AWS EC2 Uygulama Sunucusu Olu\u015fturma\nresource \"aws_instance\" \"app_server\" {\n  ami           = \"ami-0abcdef1234567890\" # Ge\u00e7erli bir AMI ID\n  instance_type = \"t2.micro\"\n  key_name      = \"my-app-key\" # Kendi anahtar\u0131n\u0131z\u0131 girin\n  vpc_security_group_ids = [aws_security_group.app_sg.id]\n  subnet_id     = aws_subnet.public_subnet.id\n  \n  # \u00d6rt\u00fck ba\u011f\u0131ml\u0131l\u0131klar burada \u00e7al\u0131\u015f\u0131r: app_sg ve public_subnet \u00f6nce olu\u015fur.\n  # Ancak, uygulaman\u0131n DB'ye ba\u011flanmaya \u00e7al\u0131\u015fmadan \u00f6nce DB'nin tamamen haz\u0131r olmas\u0131n\u0131 garanti etmek i\u00e7in\n  # a\u00e7\u0131k bir ba\u011f\u0131ml\u0131l\u0131k ekleyebiliriz.\n  depends_on = [\n    aws_db_instance.my_db # DB instance'\u0131n tamamen haz\u0131r olmas\u0131n\u0131 bekle\n  ]\n  \n  user_data = <<-EOF\n              #!\/bin\/bash\n              echo \"Waiting for DB to be ready...\"\n              # Ger\u00e7ek bir uygulamada, burada DB ba\u011flant\u0131s\u0131 kontrol edilebilir\n              # ve uygulama servisi ba\u015flat\u0131labilir.\n              sudo yum install -y httpd\n              sudo systemctl start httpd\n              sudo systemctl enable httpd\n              echo \"Hello from $(hostname -f) on $(date)!\" > \/var\/www\/html\/index.html\n              EOF\n  \n  tags = {\n    Name = \"app-server\"\n  }\n}\n\n# 4. Uygulama G\u00fcvenlik Grubu (App'ye eri\u015fimi kontrol eder)\nresource \"aws_security_group\" \"app_sg\" {\n  name        = \"app-security-group\"\n  description = \"Allow HTTP and SSH inbound traffic for app server\"\n  vpc_id      = aws_vpc.main.id\n  \n  ingress {\n    from_port   = 22\n    to_port     = 22\n    protocol    = \"tcp\"\n    cidr_blocks = [\"0.0.0.0\/0\"]\n  }\n  ingress {\n    from_port   = 80\n    to_port     = 80\n    protocol    = \"tcp\"\n    cidr_blocks = [\"0.0.0.0\/0\"]\n  }\n}\n\n# Varsay\u0131lan VPC, Subnet ve DB Subnet Group tan\u0131mlamalar\u0131 (varsa)\nresource \"aws_vpc\" \"main\" {\n  cidr_block = \"10.0.0.0\/16\"\n  tags = { Name = \"main-vpc\" }\n}\n\nresource \"aws_subnet\" \"public_subnet\" {\n  vpc_id            = aws_vpc.main.id\n  cidr_block        = \"10.0.1.0\/24\"\n  availability_zone = \"us-east-1a\"\n  tags = { Name = \"public-subnet\" }\n}\n\nresource \"aws_db_subnet_group\" \"default\" {\n  name       = \"main-db-subnet-group\"\n  subnet_ids = [aws_subnet.public_subnet.id] # Sadece \u00f6rnek ama\u00e7l\u0131, genellikle \u00f6zel subetler kullan\u0131l\u0131r\n  tags = { Name = \"Main DB Subnet Group\" }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>\n        Yukar\u0131daki \u00f6rnekte, <code>aws_instance.app_server<\/code> kayna\u011f\u0131na ekledi\u011fimiz <code>depends_on = [aws_db_instance.my_db]<\/code> sat\u0131r\u0131, Terraform'a uygulama sunucusunun da\u011f\u0131t\u0131m\u0131na ba\u015flamadan \u00f6nce <code>my_db<\/code> veritaban\u0131 \u00f6rne\u011finin tamamen olu\u015fturulmu\u015f olmas\u0131n\u0131 beklemesini s\u00f6yler. Bu, uygulama sunucusunun ba\u015flang\u0131\u00e7 beti\u011fi (<code>user_data<\/code>) \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda veritaban\u0131n\u0131n zaten haz\u0131r ve eri\u015filebilir olmas\u0131n\u0131 garanti eder. Bu t\u00fcr a\u00e7\u0131k ba\u011f\u0131ml\u0131l\u0131klar, \u00f6zellikle karma\u015f\u0131k \u00e7ok katmanl\u0131 uygulamalar\u0131n da\u011f\u0131t\u0131m\u0131nda veya harici servislerle entegrasyonlarda kritik rol oynar.\n    <\/p>\n<p>\n        Yine de, <code>depends_on<\/code>'\u0131 a\u015f\u0131r\u0131 kullanmaktan ka\u00e7\u0131nmak \u00f6nemlidir. \u00c7ok say\u0131da a\u00e7\u0131k ba\u011f\u0131ml\u0131l\u0131k, kodunuzu karma\u015f\u0131kla\u015ft\u0131rabilir ve Terraform'un kendi ba\u011f\u0131ml\u0131l\u0131k \u00e7\u00f6z\u00fcmleme algoritmas\u0131n\u0131n potansiyelini azaltabilir. Genellikle, \u00f6rt\u00fck ba\u011f\u0131ml\u0131l\u0131klar \u00e7o\u011fu senaryo i\u00e7in yeterlidir. Sadece kesinlikle gerekli oldu\u011fu durumlarda ve \u00f6rt\u00fck ba\u011f\u0131ml\u0131l\u0131klar\u0131n yetersiz kald\u0131\u011f\u0131n\u0131 fark etti\u011finizde <code>depends_on<\/code>'a ba\u015fvurmal\u0131s\u0131n\u0131z.\n    <\/p>\n<h2>Dinamik Kaynak Koleksiyonlar\u0131: <code>for_each<\/code> ile Esnekli\u011fi Yakalay\u0131n<\/h2>\n<p>\n        Terraform'daki <code>for_each<\/code> meta arg\u00fcman\u0131, <code>count<\/code>'a benzer \u015fekilde birden fazla kaynak olu\u015fturman\u0131z\u0131 sa\u011flar, ancak daha geli\u015fmi\u015f senaryolar i\u00e7in esneklik sunar. <code>count<\/code> genellikle ayn\u0131 veya \u00e7ok benzer kaynaklar\u0131 say\u0131ya g\u00f6re olu\u015fturmak i\u00e7in kullan\u0131l\u0131rken, <code>for_each<\/code> her bir eleman\u0131 benzersiz \u00f6zelliklere sahip olan bir dizi (set) veya harita (map) \u00fczerinden kaynak olu\u015fturmak i\u00e7in tasarlanm\u0131\u015ft\u0131r. Bu sayede, her bir olu\u015fturulan kayna\u011f\u0131n kendi ayr\u0131 konfig\u00fcrasyonuna sahip olmas\u0131n\u0131 sa\u011flayabilirsiniz.\n    <\/p>\n<p>\n        <code>for_each<\/code> arg\u00fcman\u0131, ya bir string set'i (<code>[\"a\", \"b\", \"c\"]<\/code>) ya da bir string-to-string haritas\u0131 (<code>{\"key1\": \"value1\", \"key2\": \"value2\"}<\/code>) al\u0131r. Terraform, bu set veya haritadaki her bir eleman i\u00e7in bir kaynak \u00f6rne\u011fi olu\u015fturur. Olu\u015fturulan her bir \u00f6rnek i\u00e7inde, <code>each.key<\/code> ve <code>each.value<\/code> ifadeleriyle o anki eleman\u0131n anahtar\u0131na ve de\u011ferine eri\u015febilirsiniz. Bu, her bir kayna\u011f\u0131 dinamik olarak yap\u0131land\u0131rman\u0131za olanak tan\u0131r.\n    <\/p>\n<p>\n        \u00d6rnek olarak, farkl\u0131 isimlere ve etiketlere sahip birden fazla S3 paketi olu\u015fturmak istedi\u011finizi d\u00fc\u015f\u00fcnelim:\n    <\/p>\n<pre><code class=\"language-hcl\">\nvariable \"s3_buckets\" {\n  description = \"Olu\u015fturulacak S3 paketlerinin haritas\u0131.\"\n  type = map(object({\n    acl          = string\n    versioning   = bool\n    environment  = string\n  }))\n  default = {\n    \"my-app-logs\" = {\n      acl         = \"private\"\n      versioning  = true\n      environment = \"prod\"\n    },\n    \"my-data-backup\" = {\n      acl         = \"private\"\n      versioning  = false\n      environment = \"dev\"\n    },\n    \"public-assets\" = {\n      acl         = \"public-read\"\n      versioning  = false\n      environment = \"prod\"\n    }\n  }\n}\n\nresource \"aws_s3_bucket\" \"example\" {\n  for_each = var.s3_buckets\n  \n  bucket = each.key\n  acl    = each.value.acl\n  \n  versioning {\n    enabled = each.value.versioning\n  }\n  \n  tags = {\n    Name        = each.key\n    Environment = each.value.environment\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>\n        Bu \u00f6rnekte, <code>var.s3_buckets<\/code> haritas\u0131ndaki her bir anahtar (\u00f6rne\u011fin, \"my-app-logs\") bir S3 paketinin ad\u0131 olacak \u015fekilde, Terraform \u00fc\u00e7 farkl\u0131 S3 paketi olu\u015fturacakt\u0131r. Her paketin <code>acl<\/code>, <code>versioning<\/code> ve <code>environment<\/code> etiketleri, ilgili harita de\u011ferlerinden dinamik olarak al\u0131n\u0131r. Bu, \u00e7ok esnek ve okunakl\u0131 bir yakla\u015f\u0131md\u0131r.\n    <\/p>\n<h3>Vaka Analizi: Ortama G\u00f6re Farkl\u0131 AWS Kaynaklar\u0131 Da\u011f\u0131tma<\/h3>\n<p>\n        Bir \u015firketin farkl\u0131 geli\u015ftirme (dev), test (test) ve \u00fcretim (prod) ortamlar\u0131 i\u00e7in belirli g\u00fcvenlik grubu kurallar\u0131na ihtiyac\u0131 oldu\u011funu varsayal\u0131m. Her ortam\u0131n kendine \u00f6zg\u00fc port ve IP gereksinimleri olabilir. <code>for_each<\/code> kullanarak, bu farkl\u0131 ortamlar i\u00e7in dinamik olarak g\u00fcvenlik grubu kurallar\u0131 tan\u0131mlayabiliriz.\n    <\/p>\n<pre><code class=\"language-hcl\">\n# variables.tf\nvariable \"env_security_group_rules\" {\n  description = \"Ortamlara \u00f6zel g\u00fcvenlik grubu kurallar\u0131 haritas\u0131.\"\n  type = map(object({\n    description = string\n    from_port   = number\n    to_port     = number\n    protocol    = string\n    cidr_blocks = list(string)\n  }))\n  default = {\n    \"dev_ssh\" = {\n      description = \"Allow SSH for Dev\"\n      from_port   = 22\n      to_port     = 22\n      protocol    = \"tcp\"\n      cidr_blocks = [\"192.168.1.0\/24\"] # Sadece dev ofisinden eri\u015fim\n    },\n    \"prod_http\" = {\n      description = \"Allow HTTP for Prod\"\n      from_port   = 80\n      to_port     = 80\n      protocol    = \"tcp\"\n      cidr_blocks = [\"0.0.0.0\/0\"]\n    },\n    \"dev_internal_app\" = {\n      description = \"Allow Internal App Port for Dev\"\n      from_port   = 8080\n      to_port     = 8080\n      protocol    = \"tcp\"\n      cidr_blocks = [\"10.0.0.0\/16\"] # Sadece VPC i\u00e7inden eri\u015fim\n    }\n  }\n}\n\n# main.tf\nresource \"aws_security_group\" \"app_sg\" {\n  name        = \"application-security-group\"\n  description = \"Shared security group for application servers\"\n  vpc_id      = aws_vpc.main.id # Mevcut bir VPC\n  \n  ingress {\n    from_port   = 0\n    to_port     = 0\n    protocol    = \"-1\"\n    cidr_blocks = [\"0.0.0.0\/0\"]\n  }\n  \n  egress {\n    from_port   = 0\n    to_port     = 0\n    protocol    = \"-1\"\n    cidr_blocks = [\"0.0.0.0\/0\"]\n  }\n}\n\nresource \"aws_security_group_rule\" \"env_rules\" {\n  for_each = var.env_security_group_rules\n  \n  type              = \"ingress\"\n  from_port         = each.value.from_port\n  to_port           = each.value.to_port\n  protocol          = each.value.protocol\n  cidr_blocks       = each.value.cidr_blocks\n  security_group_id = aws_security_group.app_sg.id\n  description       = each.value.description\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>\n        Bu senaryoda, <code>var.env_security_group_rules<\/code> haritas\u0131n\u0131 kullanarak her bir kural i\u00e7in ayr\u0131 bir <code>aws_security_group_rule<\/code> kayna\u011f\u0131 olu\u015fturuyoruz. <code>each.key<\/code> bize kural\u0131n ad\u0131n\u0131 verirken (\u00f6rne\u011fin \"dev_ssh\"), <code>each.value<\/code> bize o kural\u0131n t\u00fcm \u00f6zelliklerini (portlar, protokol, CIDR bloklar\u0131) dinamik olarak yap\u0131land\u0131rma imkan\u0131 sunar. Bu, kodunuzu son derece mod\u00fcler hale getirir ve yeni bir kural eklemek veya mevcut bir kural\u0131 de\u011fi\u015ftirmek, sadece de\u011fi\u015fkenler dosyas\u0131ndaki haritay\u0131 g\u00fcncellemekle m\u00fcmk\u00fcn olur.\n    <\/p>\n<p>\n        <strong><code>for_each<\/code> vs. <code>count<\/code>: Ne Zaman Hangisi?<\/strong>\n    <\/p>\n<ul>\n<li>\n            <strong><code>count<\/code>:<\/strong> Kaynaklar\u0131n tamamen veya neredeyse tamamen ayn\u0131 oldu\u011fu ve sadece say\u0131sal bir indeksle ay\u0131rt edilmelerinin yeterli oldu\u011fu durumlarda idealdir (\u00f6rne\u011fin, 3 web sunucusu, 5 veritaban\u0131 replikas\u0131). Her bir kaynak, <code>count.index<\/code> ile bir s\u0131ra numaras\u0131 al\u0131r.\n        <\/li>\n<li>\n            <strong><code>for_each<\/code>:<\/strong> Kaynaklar\u0131n benzersiz tan\u0131mlay\u0131c\u0131lara (string veya harita anahtar\u0131) sahip oldu\u011fu ve her birinin kendine \u00f6zg\u00fc konfig\u00fcrasyonlara veya \u00f6zelliklere ihtiya\u00e7 duydu\u011fu durumlarda kullan\u0131l\u0131r (\u00f6rne\u011fin, farkl\u0131 adlara sahip S3 paketleri, belirli ortamlar i\u00e7in farkl\u0131 g\u00fcvenlik kurallar\u0131, kullan\u0131c\u0131 baz\u0131nda IAM rolleri). <code>each.key<\/code> ve <code>each.value<\/code> ile her bir kayna\u011fa \u00f6zel verilere eri\u015fim sa\u011flar.\n        <\/li>\n<\/ul>\n<p>\n        \u00d6zetle, <code>for_each<\/code>, daha karma\u015f\u0131k ve dinamik kaynak setlerini y\u00f6netmek i\u00e7in <code>count<\/code>'tan daha fazla esneklik sunar. Hangi meta arg\u00fcman\u0131 se\u00e7ece\u011finiz, olu\u015fturmak istedi\u011finiz kaynaklar\u0131n do\u011fas\u0131na ve gerektirdikleri \u00f6zelle\u015ftirme d\u00fczeyine ba\u011fl\u0131d\u0131r. Do\u011fru kullan\u0131m\u0131yla, altyap\u0131 kodunuzun okunabilirli\u011fini, bak\u0131m\u0131n\u0131 ve \u00f6l\u00e7eklenebilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilirsiniz.\n    <\/p>\n<h2>Geli\u015fmi\u015f Kullan\u0131m Senaryolar\u0131 ve En \u0130yi Uygulamalar<\/h2>\n<p>\n        Terraform'un meta arg\u00fcmanlar\u0131 olan <code>count<\/code>, <code>depends_on<\/code> ve <code>for_each<\/code>, temel kullan\u0131m senaryolar\u0131n\u0131n \u00f6tesinde, daha karma\u015f\u0131k altyap\u0131 da\u011f\u0131t\u0131mlar\u0131nda da b\u00fcy\u00fck bir esneklik ve g\u00fc\u00e7 sunar. Bu b\u00f6l\u00fcmde, bu arg\u00fcmanlar\u0131 bir araya getirerek veya baz\u0131 geli\u015fmi\u015f tekniklerle kullanarak altyap\u0131 otomasyonunuzu bir sonraki seviyeye ta\u015f\u0131yacak ipu\u00e7lar\u0131 ve en iyi uygulamalar\u0131 inceleyece\u011fiz.\n    <\/p>\n<h3>Ko\u015fullu Kaynak Olu\u015fturma<\/h3>\n<p>\n        Bazen belirli bir ko\u015fulun yerine getirilip getirilmedi\u011fine ba\u011fl\u0131 olarak bir kayna\u011f\u0131n olu\u015fturulup olu\u015fturulmayaca\u011f\u0131na karar vermeniz gerekebilir. Bu, \u00f6zellikle farkl\u0131 ortamlar (geli\u015ftirme, test, \u00fcretim) aras\u0131nda kaynak farkl\u0131l\u0131klar\u0131n\u0131 y\u00f6netirken veya bir \u00f6zelli\u011fi ge\u00e7ici olarak devre d\u0131\u015f\u0131 b\u0131rakmak istedi\u011finizde kullan\u0131\u015fl\u0131d\u0131r. <code>count<\/code> arg\u00fcman\u0131n\u0131 kullanarak bu senaryoyu kolayca ele alabilirsiniz.\n    <\/p>\n<p>\n        \u00d6rne\u011fin, sadece \u00fcretim ortam\u0131nda bir veritaban\u0131 yede\u011fi olu\u015fturmak istiyorsan\u0131z:\n    <\/p>\n<pre><code class=\"language-hcl\">\nvariable \"environment\" {\n  description = \"Deployment environment (dev, staging, prod)\"\n  type        = string\n  default     = \"dev\"\n}\n\nresource \"aws_db_snapshot\" \"production_backup\" {\n  count                   = var.environment == \"prod\" ? 1 : 0\n  db_instance_identifier  = aws_db_instance.my_db.id\n  db_snapshot_identifier  = \"prod-db-backup-${formatdate(\"YYYY-MM-DD-hh-mm-ss\", timestamp())}\"\n  \n  depends_on = [aws_db_instance.my_db] # DB haz\u0131r olana kadar bekle\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>\n        Bu kod blo\u011fu, <code>environment<\/code> de\u011fi\u015fkeni \"prod\" ise bir veritaban\u0131 anl\u0131k g\u00f6r\u00fcnt\u00fcs\u00fc olu\u015fturacak, aksi takdirde olu\u015fturmayacakt\u0131r. Bu, kod tekrar\u0131n\u0131 \u00f6nler ve ortamlar aras\u0131 farkl\u0131l\u0131klar\u0131 tek bir kod taban\u0131nda y\u00f6netmenizi sa\u011flar.\n    <\/p>\n<h3><code>for<\/code> ifadeleri ile Meta Arg\u00fcmanlar\u0131 Kombinleme<\/h3>\n<p>\n        <code>for<\/code> ifadeleri (for expressions), Terraform'da listeleri, haritalar\u0131 ve nesneleri d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Bu ifadeleri <code>for_each<\/code> ile birle\u015ftirerek daha dinamik ve karma\u015f\u0131k veri yap\u0131lar\u0131 olu\u015fturabilir ve kaynak da\u011f\u0131t\u0131m\u0131n\u0131 daha da esnek hale getirebilirsiniz.\n    <\/p>\n<p>\n        Diyelim ki, farkl\u0131 b\u00f6lgelerde ayn\u0131 g\u00fcvenlik gruplar\u0131n\u0131 farkl\u0131 portlarla a\u00e7man\u0131z gerekiyor. B\u00f6lgeleri ve portlar\u0131 bir harita i\u00e7inde tan\u0131mlay\u0131p, ard\u0131ndan bu harita \u00fczerinde <code>for_each<\/code> ile d\u00f6ng\u00fc yapabilirsiniz.\n    <\/p>\n<pre><code class=\"language-hcl\">\nvariable \"region_specific_ports\" {\n  description = \"B\u00f6lgeye \u00f6zg\u00fc a\u00e7\u0131lacak portlar.\"\n  type = map(list(number))\n  default = {\n    \"us-east-1\" = [80, 443],\n    \"eu-west-1\" = [8080],\n    \"ap-southeast-1\" = [22]\n  }\n}\n\nresource \"aws_security_group_rule\" \"regional_ingress\" {\n  for_each = {\n    for region_name, ports in var.region_specific_ports :\n    for port in ports :\n    \"${region_name}-${port}\" => { region = region_name, port = port }\n  }\n  \n  type              = \"ingress\"\n  from_port         = each.value.port\n  to_port           = each.value.port\n  protocol          = \"tcp\"\n  cidr_blocks       = [\"0.0.0.0\/0\"]\n  security_group_id = aws_security_group.main_sg.id # Mevcut bir SG\n  description       = \"Allow port ${each.value.port} in ${each.value.region}\"\n}\n\nresource \"aws_security_group\" \"main_sg\" {\n  name   = \"main-app-sg\"\n  vpc_id = aws_vpc.main.id # Mevcut bir VPC\n  ingress {\n    from_port   = 0\n    to_port     = 0\n    protocol    = \"-1\"\n    cidr_blocks = [\"0.0.0.0\/0\"]\n  }\n  egress {\n    from_port   = 0\n    to_port     = 0\n    protocol    = \"-1\"\n    cidr_blocks = [\"0.0.0.0\/0\"]\n  }\n}\n\nresource \"aws_vpc\" \"main\" {\n  cidr_block = \"10.0.0.0\/16\"\n  tags = { Name = \"main-vpc\" }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>\n        Burada, i\u00e7 i\u00e7e ge\u00e7mi\u015f bir <code>for<\/code> ifadesi kullanarak <code>region_specific_ports<\/code> de\u011fi\u015fkeninden yeni bir harita olu\u015fturuyoruz. Bu harita, <code>for_each<\/code> i\u00e7in uygun bir bi\u00e7imde, her b\u00f6lge-port kombinasyonu i\u00e7in benzersiz bir anahtar ve ilgili de\u011ferler i\u00e7eriyor. Bu sayede, farkl\u0131 b\u00f6lgelerdeki farkl\u0131 portlar\u0131 tek bir Terraform kayna\u011f\u0131 tan\u0131m\u0131yla y\u00f6netebiliyoruz.\n    <\/p>\n<h3>En \u0130yi Uygulamalar<\/h3>\n<ul>\n<li>\n            <strong><code>depends_on<\/code> kullan\u0131m\u0131n\u0131 minimumda tutun:<\/strong> M\u00fcmk\u00fcn oldu\u011funca Terraform'un \u00f6rt\u00fck ba\u011f\u0131ml\u0131l\u0131k \u00e7\u00f6z\u00fcmlemesine g\u00fcvenin. A\u00e7\u0131k <code>depends_on<\/code> kullanmak, genellikle Terraform grafi\u011fini karma\u015f\u0131kla\u015ft\u0131r\u0131r ve hata ay\u0131klamay\u0131 zorla\u015ft\u0131rabilir. Sadece Terraform'un ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 otomatik olarak alg\u0131layamad\u0131\u011f\u0131 durumlarda kullan\u0131n.\n        <\/li>\n<li>\n            <strong><code>count<\/code> yerine <code>for_each<\/code>'i tercih edin (m\u00fcmk\u00fcnse):<\/strong> Kaynaklar\u0131n\u0131z\u0131n benzersiz bir kimli\u011fe sahip olmas\u0131n\u0131 istiyorsan\u0131z ve bu kimlik bir say\u0131dan fazlas\u0131n\u0131 ifade ediyorsa, <code>for_each<\/code> daha iyi bir se\u00e7imdir. Bu, kaynaklar\u0131 y\u00f6netmeyi ve durum dosyas\u0131n\u0131 anlamay\u0131 kolayla\u015ft\u0131r\u0131r, \u00e7\u00fcnk\u00fc her kaynak kendi sembolik ad\u0131yla (anahtar\u0131yla) ili\u015fkilendirilir.\n        <\/li>\n<li>\n            <strong>Mod\u00fcler yap\u0131lar kullan\u0131n:<\/strong> Meta arg\u00fcmanlar\u0131, <a href=\"https:\/\/developer.hashicorp.com\/terraform\/language\/modules\">Terraform mod\u00fclleri<\/a> ile birle\u015ftirerek daha b\u00fcy\u00fck, daha y\u00f6netilebilir ve tekrar kullan\u0131labilir altyap\u0131 yap\u0131 ta\u015flar\u0131 olu\u015fturabilirsiniz. Mod\u00fcller, karma\u015f\u0131kl\u0131\u011f\u0131 soyutlaman\u0131za ve kodunuzu DRY (Don't Repeat Yourself - Kendini Tekrar Etme) prensibine uygun tutman\u0131za yard\u0131mc\u0131 olur.\n        <\/li>\n<li>\n            <strong>De\u011fi\u015fkenlerinizi iyi yap\u0131land\u0131r\u0131n:<\/strong> <code>count<\/code> ve <code>for_each<\/code> ile kulland\u0131\u011f\u0131n\u0131z de\u011fi\u015fkenleri anlaml\u0131 ve a\u00e7\u0131k bir \u015fekilde adland\u0131r\u0131n. Karma\u015f\u0131k haritalar veya nesneler kullan\u0131rken, <code>type<\/code> k\u0131s\u0131tlamalar\u0131 ve <code>description<\/code> alanlar\u0131 ile kodunuzun anla\u015f\u0131l\u0131rl\u0131\u011f\u0131n\u0131 art\u0131r\u0131n.\n        <\/li>\n<\/ul>\n<h3>Mobil Uyumlu HTML ve Terraform \u00c7\u0131kt\u0131lar\u0131n\u0131n G\u00f6rselle\u015ftirilmesi<\/h3>\n<p>\n        Terraform, altyap\u0131 da\u011f\u0131t\u0131m\u0131 s\u0131ras\u0131nda ve sonras\u0131nda \u00e7e\u015fitli \u00e7\u0131kt\u0131lar sa\u011flar. Bu \u00e7\u0131kt\u0131lar genellikle terminalde metin olarak g\u00f6r\u00fcnt\u00fclenir. Ancak, daha b\u00fcy\u00fck ve karma\u015f\u0131k altyap\u0131larda, bu \u00e7\u0131kt\u0131lar\u0131 g\u00f6rselle\u015ftirmek veya bir kontrol panelinde sunmak isteyebilirsiniz. Mobil cihazlarda da bu bilgilere kolayca eri\u015filebilmesi i\u00e7in HTML tabanl\u0131 bir aray\u00fcz tasarlarken mobil uyumlulu\u011fu sa\u011flamak \u00f6nemlidir. A\u015fa\u011f\u0131da, Terraform \u00e7\u0131kt\u0131lar\u0131n\u0131n basit bir HTML g\u00f6r\u00fcn\u00fcm\u00fcn\u00fcn farkl\u0131 ekran boyutlar\u0131na nas\u0131l adapte olabilece\u011fini g\u00f6steren bir \u00f6rnek CSS kodu bulunmaktad\u0131r. Bu, Terraform'un kendisiyle do\u011frudan ilgili olmasa da, onunla entegre olabilecek bir \"devOps panel\" \u00f6rne\u011fi sunar ve mobil uyumlu HTML kurallar\u0131na bir \u00f6rnektir.\n    <\/p>\n<pre><code class=\"language-html\">\n<style>\n\/* Genel stil *\/\n.tf-output-container {\n    padding: 15px;\n    border: 1px solid #ddd;\n    border-radius: 8px;\n    margin-bottom: 20px;\n    background-color: #f9f9f9;\n    font-family: Arial, sans-serif;\n    color: #333;\n}\n.tf-output-item {\n    margin-bottom: 10px;\n    padding-bottom: 10px;\n    border-bottom: 1px dashed #eee;\n}\n.tf-output-item:last-child {\n    border-bottom: none;\n    margin-bottom: 0;\n    padding-bottom: 0;\n}\n.tf-output-label {\n    font-weight: bold;\n    color: #333;\n    display: block; \/* Etiketleri mobil i\u00e7in blok seviyesine getir *\/\n    margin-bottom: 5px;\n}\n.tf-output-value {\n    color: #555;\n    word-wrap: break-word; \/* Uzun de\u011ferlerin s\u0131\u011fmas\u0131n\u0131 sa\u011fla *\/\n}\n\n\/* Mobil Cihazlar \u0130\u00e7in Medya Sorgular\u0131 *\/\n@media (max-width: 768px) { \/* Tabletler ve daha k\u00fc\u00e7\u00fck ekranlar *\/\n    .tf-output-container {\n        padding: 10px;\n        margin-left: 5px;\n        margin-right: 5px;\n    }\n    .tf-output-label {\n        font-size: 0.9em;\n    }\n    .tf-output-value {\n        font-size: 0.85em;\n    }\n}\n\n@media (max-width: 480px) { \/* Ak\u0131ll\u0131 telefonlar *\/\n    .tf-output-container {\n        border-radius: 5px;\n        padding: 8px;\n    }\n    .tf-output-item {\n        margin-bottom: 8px;\n        padding-bottom: 8px;\n    }\n    .tf-output-label {\n        font-size: 0.85em;\n        margin-bottom: 3px;\n    }\n    .tf-output-value {\n        font-size: 0.8em;\n    }\n}\n<\/style>\n\n<div class=\"tf-output-container\">\n    <h3>Terraform Altyap\u0131 \u00c7\u0131kt\u0131lar\u0131<\/h3>\n    <div class=\"tf-output-item\">\n        <span class=\"tf-output-label\">Uygulama Sunucular\u0131 (IP'ler):<\/span>\n        <span class=\"tf-output-value\">18.234.56.78, 54.123.45.67<\/span>\n    <\/div>\n    <div class=\"tf-output-item\">\n        <span class=\"tf-output-label\">Veritaban\u0131 U\u00e7 Noktas\u0131:<\/span>\n        <span class=\"tf-output-value\">mydb.abcdefg12345.us-east-1.rds.amazonaws.com<\/span>\n    <\/div>\n    <div class=\"tf-output-item\">\n        <span class=\"tf-output-label\">S3 Log Paketi Ad\u0131:<\/span>\n        <span class=\"tf-output-value\">my-application-log-bucket-2023<\/span>\n    <\/div>\n<\/div>\n    <\/pre>\n<p><\/code><\/p>\n<p>\n        Yukar\u0131daki stil \u00f6rnekleri, <code>.tf-output-container<\/code> gibi bir div'in mobil cihazlarda nas\u0131l daha okunakl\u0131 hale getirilebilece\u011fini g\u00f6stermektedir. CSS medya sorgular\u0131 (<code>@media<\/code>), ekran geni\u015fli\u011fine g\u00f6re farkl\u0131 stiller uygulayarak i\u00e7eri\u011fin d\u00fczenini ve yaz\u0131 boyutlar\u0131n\u0131 otomatik olarak ayarlar. Bu, Terraform taraf\u0131ndan y\u00f6netilen altyap\u0131 hakk\u0131nda bilgi sunan herhangi bir aray\u00fcz\u00fcn kullan\u0131c\u0131 dostu olmas\u0131n\u0131 sa\u011flar.\n    <\/p>\n<h2>Sonu\u00e7: Terraform Meta Arg\u00fcmanlar\u0131 ile Altyap\u0131n\u0131z\u0131 G\u00fc\u00e7lendirin<\/h2>\n<p>\n        Bu makalede, Terraform'un temel meta arg\u00fcmanlar\u0131 olan <code>count<\/code>, <code>depends_on<\/code> ve <code>for_each<\/code>'i derinlemesine inceledik. Bu arg\u00fcmanlar, AWS gibi bulut platformlar\u0131nda altyap\u0131 y\u00f6netiminizi \u00f6nemli \u00f6l\u00e7\u00fcde basitle\u015ftiren ve otomatikle\u015ftiren vazge\u00e7ilmez ara\u00e7lard\u0131r. <code>count<\/code> ile tekrarlayan kaynaklar\u0131 h\u0131zl\u0131ca da\u011f\u0131tarak kod tekrar\u0131n\u0131 azaltt\u0131k. <code>depends_on<\/code> ile karma\u015f\u0131k ba\u011f\u0131ml\u0131l\u0131k senaryolar\u0131nda kaynak da\u011f\u0131t\u0131m s\u0131ras\u0131n\u0131 g\u00fcvence alt\u0131na ald\u0131k. Son olarak, <code>for_each<\/code> ile dinamik ve \u00f6zelle\u015ftirilmi\u015f kaynak koleksiyonlar\u0131 olu\u015fturarak altyap\u0131 kodumuza e\u015fsiz bir esneklik kazand\u0131rd\u0131k.\n    <\/p>\n<p>\n        Bu meta arg\u00fcmanlar\u0131n do\u011fru ve stratejik kullan\u0131m\u0131, altyap\u0131 kodunuzun okunabilirli\u011fini, bak\u0131m kolayl\u0131\u011f\u0131n\u0131 ve \u00f6l\u00e7eklenebilirli\u011fini art\u0131r\u0131r. Ayr\u0131ca, manuel hatalar\u0131 azalt\u0131r ve altyap\u0131n\u0131z\u0131n tutarl\u0131l\u0131\u011f\u0131n\u0131 garanti alt\u0131na al\u0131r. Ger\u00e7ek d\u00fcnya senaryolar\u0131nda g\u00f6sterdi\u011fimiz gibi, bu ara\u00e7lar sayesinde karma\u015f\u0131k bulut ortamlar\u0131n\u0131 bile kolayca y\u00f6netebilir, farkl\u0131 ortamlar aras\u0131nda tutarl\u0131l\u0131\u011f\u0131 sa\u011flayabilir ve h\u0131zla de\u011fi\u015fen i\u015f gereksinimlerine adapte olabilirsiniz.\n    <\/p>\n<p>\n        Unutmay\u0131n, Terraform'un g\u00fcc\u00fc sadece kaynak tan\u0131mlamakla s\u0131n\u0131rl\u0131 de\u011fildir; ayn\u0131 zamanda bu kaynaklar\u0131n nas\u0131l ve ne zaman da\u011f\u0131t\u0131laca\u011f\u0131n\u0131 kontrol etme yetene\u011finden gelir. <code>count<\/code>, <code>depends_on<\/code> ve <code>for_each<\/code>, bu kontrol\u00fc size veren anahtar mekanizmalard\u0131r. Pratik yaparak ve farkl\u0131 senaryolarda bu arg\u00fcmanlar\u0131 deneyimleyerek, altyap\u0131 kodlama becerilerinizi daha da geli\u015ftirecek ve DevOps s\u00fcre\u00e7lerinizde \u00f6nemli bir fark yaratacaks\u0131n\u0131z.\n    <\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<dl>\n<dt><strong>Terraform'da <code>count<\/code> ve <code>for_each<\/code> aras\u0131ndaki temel fark nedir?<\/strong><\/dt>\n<dd>\n            <code>count<\/code>, ayn\u0131 t\u00fcrden N adet kayna\u011f\u0131 say\u0131sal bir indeks (<code>count.index<\/code>) ile olu\u015fturmak i\u00e7in kullan\u0131l\u0131r. Kaynaklar genellikle \u00e7ok benzerdir ve sadece indeksle ay\u0131rt edilir. <code>for_each<\/code> ise, her bir \u00f6\u011fenin kendine \u00f6zg\u00fc \u00f6zelliklere sahip oldu\u011fu bir liste veya harita \u00fczerinden dinamik kaynaklar olu\u015fturmak i\u00e7in kullan\u0131l\u0131r. Her bir kaynak <code>each.key<\/code> ve <code>each.value<\/code> ile benzersiz \u015fekilde yap\u0131land\u0131r\u0131l\u0131r. Yani, <code>count<\/code> say\u0131sal tekrarlar i\u00e7in, <code>for_each<\/code> ise benzersiz \u00f6zelliklere sahip \u00f6\u011feler koleksiyonu i\u00e7in daha uygundur.\n        <\/dd>\n<dt><strong><code>depends_on<\/code> meta arg\u00fcman\u0131n\u0131 ne zaman kullanmaktan ka\u00e7\u0131nmal\u0131y\u0131m?<\/strong><\/dt>\n<dd>\n            <code>depends_on<\/code>'\u0131 m\u00fcmk\u00fcn oldu\u011funca az kullanmal\u0131s\u0131n\u0131z. Terraform, bir kayna\u011f\u0131n di\u011ferinin \u00e7\u0131kt\u0131s\u0131n\u0131 (\u00f6rne\u011fin ID, ARN, IP adresi) kulland\u0131\u011f\u0131 durumlarda ba\u011f\u0131ml\u0131l\u0131klar\u0131 otomatik olarak alg\u0131lar (\u00f6rt\u00fck ba\u011f\u0131ml\u0131l\u0131klar). <code>depends_on<\/code>'\u0131 sadece Terraform'un ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 alg\u0131layamad\u0131\u011f\u0131 ve belirli bir kayna\u011f\u0131n ba\u015fka bir kaynak tamamen olu\u015fturulmadan \u00f6nce da\u011f\u0131t\u0131lmamas\u0131 gereken nadir durumlarda kullan\u0131n. A\u015f\u0131r\u0131 kullan\u0131m\u0131, kod karma\u015f\u0131kl\u0131\u011f\u0131na yol a\u00e7abilir ve hata ay\u0131klamay\u0131 zorla\u015ft\u0131rabilir.\n        <\/dd>\n<dt><strong>Terraform'da bir kayna\u011f\u0131 ko\u015fullu olarak nas\u0131l olu\u015fturabilirim?<\/strong><\/dt>\n<dd>\n            Bir kayna\u011f\u0131 ko\u015fullu olarak olu\u015fturmak i\u00e7in <code>count<\/code> arg\u00fcman\u0131n\u0131 kullanabilirsiniz. <code>count = ko\u015ful ? 1 : 0<\/code> \u015feklinde bir ifade yazarak, ko\u015ful do\u011fruysa kaynak olu\u015fturulur (<code>count = 1<\/code>), yanl\u0131\u015fsa olu\u015fturulmaz (<code>count = 0<\/code>). Bu, \u00f6zellikle farkl\u0131 ortamlar aras\u0131nda kaynaklar\u0131 y\u00f6netirken veya belirli bir \u00f6zelli\u011fin ge\u00e7ici olarak devre d\u0131\u015f\u0131 b\u0131rak\u0131lmas\u0131 gerekti\u011finde \u00e7ok faydal\u0131d\u0131r.\n        <\/dd>\n<dt><strong><code>for_each<\/code> ile bir listeyi nas\u0131l kullanabilirim?<\/strong><\/dt>\n<dd>\n            <code>for_each<\/code> do\u011frudan bir listeyi string seti olarak kabul edebilir. \u00d6rne\u011fin: <code>for_each = toset(var.my_list_of_strings)<\/code>. E\u011fer listeniz nesneler i\u00e7eriyorsa, <code>for<\/code> ifadesi kullanarak listeyi bir haritaya d\u00f6n\u00fc\u015ft\u00fcrmeniz gerekebilir. \u00d6rne\u011fin: <code>for_each = { for item in var.my_list_of_objects : item.id => item }<\/code>. Bu sayede her bir nesnenin benzersiz bir anahtarla (<code>item.id<\/code>) e\u015fle\u015fmesini sa\u011flars\u0131n\u0131z ve <code>each.key<\/code> ile anahtara, <code>each.value<\/code> ile nesnenin tamam\u0131na eri\u015febilirsiniz.\n        <\/dd>\n<dt><strong>Meta arg\u00fcmanlar mod\u00fcllerle birlikte nas\u0131l \u00e7al\u0131\u015f\u0131r?<\/strong><\/dt>\n<dd>\n            Meta arg\u00fcmanlar, Terraform mod\u00fcllerinin i\u00e7erisinde de kullan\u0131labilir. \u00d6rne\u011fin, bir mod\u00fcl tan\u0131m\u0131na <code>count<\/code> veya <code>for_each<\/code> ekleyerek mod\u00fcl\u00fcn kendisinin birden fazla \u00f6rne\u011fini olu\u015fturabilirsiniz. Bu, mod\u00fclerli\u011fi art\u0131r\u0131r ve ayn\u0131 mod\u00fcl\u00fc farkl\u0131 konfig\u00fcrasyonlarla birden \u00e7ok kez da\u011f\u0131tman\u0131za olanak tan\u0131r. Mod\u00fcl\u00fcn i\u00e7inde tan\u0131mlanan kaynaklar, d\u0131\u015far\u0131dan gelen <code>count<\/code> veya <code>for_each<\/code> de\u011ferlerine g\u00f6re de dinamik olarak \u015fekillenebilir.\n        <\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"G\u00fcn\u00fcm\u00fcz\u00fcn dinamik bulut altyap\u0131lar\u0131nda, kaynak y\u00f6netimini verimli ve tekrarlanabilir bir \u015fekilde yapmak her zamankinden daha kritik. AWS \u00fczerinde&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-35695","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 Meta Arg\u00fcmanlar\u0131: count, depends_on, for_each Rehberi<\/title>\n<meta name=\"description\" content=\"G\u00fcn\u00fcm\u00fcz\u00fcn dinamik bulut altyap\u0131lar\u0131nda, kaynak y\u00f6netimini verimli ve tekrarlanabilir bir \u015fekilde yapmak her zamankinden daha kritik. AWS \u00fczerinde karma\u015f\u0131k altyap\u0131lar kurarken, bir\u00e7ok benzer kayna\u011f\u0131 da\u011f\u0131tmak, aralar\u0131ndaki ba\u011f\u0131ml\u0131l\u0131klar\u0131 do\u011fru y\u00f6netmek veya dinamik ko\u015fullara g\u00f6re farkl\u0131 kaynaklar olu\u015fturmak gibi zorluklarla kar\u015f\u0131la\u015fabiliriz. Bu noktada Terraform&#039;un meta arg\u00fcmanlar\u0131 olan count, depends_on ve for_each, altyap\u0131 kodunuzu (Infrastructure as Code - IaC) daha esnek, okunabilir ve y\u00f6netilebilir hale getirerek adeta bir s\u00fcper g\u00fc\u00e7 kazand\u0131r\u0131r. Bu makalede, bu g\u00fc\u00e7l\u00fc arg\u00fcmanlar\u0131n ne i\u015fe yarad\u0131\u011f\u0131n\u0131, neden vazge\u00e7ilmez olduklar\u0131n\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l etkili bir \u015fekilde kullan\u0131labilece\u011fini ad\u0131m ad\u0131m inceleyece\u011fiz.\" \/>\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-meta-argumanlari-count-depends_on-for_each-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Terraform Meta Arg\u00fcmanlar\u0131: count, depends_on, for_each Rehberi\" \/>\n<meta property=\"og:description\" content=\"G\u00fcn\u00fcm\u00fcz\u00fcn dinamik bulut altyap\u0131lar\u0131nda, kaynak y\u00f6netimini verimli ve tekrarlanabilir bir \u015fekilde yapmak her zamankinden daha kritik. AWS \u00fczerinde karma\u015f\u0131k altyap\u0131lar kurarken, bir\u00e7ok benzer kayna\u011f\u0131 da\u011f\u0131tmak, aralar\u0131ndaki ba\u011f\u0131ml\u0131l\u0131klar\u0131 do\u011fru y\u00f6netmek veya dinamik ko\u015fullara g\u00f6re farkl\u0131 kaynaklar olu\u015fturmak gibi zorluklarla kar\u015f\u0131la\u015fabiliriz. Bu noktada Terraform&#039;un meta arg\u00fcmanlar\u0131 olan count, depends_on ve for_each, altyap\u0131 kodunuzu (Infrastructure as Code - IaC) daha esnek, okunabilir ve y\u00f6netilebilir hale getirerek adeta bir s\u00fcper g\u00fc\u00e7 kazand\u0131r\u0131r. Bu makalede, bu g\u00fc\u00e7l\u00fc arg\u00fcmanlar\u0131n ne i\u015fe yarad\u0131\u011f\u0131n\u0131, neden vazge\u00e7ilmez olduklar\u0131n\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l etkili bir \u015fekilde kullan\u0131labilece\u011fini ad\u0131m ad\u0131m inceleyece\u011fiz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/terraform-meta-argumanlari-count-depends_on-for_each-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-02T18:31: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=\"11 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-meta-argumanlari-count-depends_on-for_each-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-meta-argumanlari-count-depends_on-for_each-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Terraform Meta Arg\u00fcmanlar\u0131: count, depends_on, for_each Rehberi\",\"datePublished\":\"2025-12-02T18:31:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-meta-argumanlari-count-depends_on-for_each-rehberi\/\"},\"wordCount\":3701,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/terraform-meta-argumanlari-count-depends_on-for_each-rehberi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-meta-argumanlari-count-depends_on-for_each-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/terraform-meta-argumanlari-count-depends_on-for_each-rehberi\/\",\"name\":\"Terraform Meta Arg\u00fcmanlar\u0131: count, depends_on, for_each Rehberi\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-02T18:31:15+00:00\",\"description\":\"G\u00fcn\u00fcm\u00fcz\u00fcn dinamik bulut altyap\u0131lar\u0131nda, kaynak y\u00f6netimini verimli ve tekrarlanabilir bir \u015fekilde yapmak her zamankinden daha kritik. AWS \u00fczerinde karma\u015f\u0131k altyap\u0131lar kurarken, bir\u00e7ok benzer kayna\u011f\u0131 da\u011f\u0131tmak, aralar\u0131ndaki ba\u011f\u0131ml\u0131l\u0131klar\u0131 do\u011fru y\u00f6netmek veya dinamik ko\u015fullara g\u00f6re farkl\u0131 kaynaklar olu\u015fturmak gibi zorluklarla kar\u015f\u0131la\u015fabiliriz. Bu noktada Terraform'un meta arg\u00fcmanlar\u0131 olan count, depends_on ve for_each, altyap\u0131 kodunuzu (Infrastructure as Code - IaC) daha esnek, okunabilir ve y\u00f6netilebilir hale getirerek adeta bir s\u00fcper g\u00fc\u00e7 kazand\u0131r\u0131r. Bu makalede, bu g\u00fc\u00e7l\u00fc arg\u00fcmanlar\u0131n ne i\u015fe yarad\u0131\u011f\u0131n\u0131, neden vazge\u00e7ilmez olduklar\u0131n\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l etkili bir \u015fekilde kullan\u0131labilece\u011fini ad\u0131m ad\u0131m inceleyece\u011fiz.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-meta-argumanlari-count-depends_on-for_each-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/terraform-meta-argumanlari-count-depends_on-for_each-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-meta-argumanlari-count-depends_on-for_each-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Terraform Meta Arg\u00fcmanlar\u0131: count, depends_on, for_each 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 Meta Arg\u00fcmanlar\u0131: count, depends_on, for_each Rehberi","description":"G\u00fcn\u00fcm\u00fcz\u00fcn dinamik bulut altyap\u0131lar\u0131nda, kaynak y\u00f6netimini verimli ve tekrarlanabilir bir \u015fekilde yapmak her zamankinden daha kritik. AWS \u00fczerinde karma\u015f\u0131k altyap\u0131lar kurarken, bir\u00e7ok benzer kayna\u011f\u0131 da\u011f\u0131tmak, aralar\u0131ndaki ba\u011f\u0131ml\u0131l\u0131klar\u0131 do\u011fru y\u00f6netmek veya dinamik ko\u015fullara g\u00f6re farkl\u0131 kaynaklar olu\u015fturmak gibi zorluklarla kar\u015f\u0131la\u015fabiliriz. Bu noktada Terraform'un meta arg\u00fcmanlar\u0131 olan count, depends_on ve for_each, altyap\u0131 kodunuzu (Infrastructure as Code - IaC) daha esnek, okunabilir ve y\u00f6netilebilir hale getirerek adeta bir s\u00fcper g\u00fc\u00e7 kazand\u0131r\u0131r. Bu makalede, bu g\u00fc\u00e7l\u00fc arg\u00fcmanlar\u0131n ne i\u015fe yarad\u0131\u011f\u0131n\u0131, neden vazge\u00e7ilmez olduklar\u0131n\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l etkili bir \u015fekilde kullan\u0131labilece\u011fini ad\u0131m ad\u0131m inceleyece\u011fiz.","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-meta-argumanlari-count-depends_on-for_each-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Terraform Meta Arg\u00fcmanlar\u0131: count, depends_on, for_each Rehberi","og_description":"G\u00fcn\u00fcm\u00fcz\u00fcn dinamik bulut altyap\u0131lar\u0131nda, kaynak y\u00f6netimini verimli ve tekrarlanabilir bir \u015fekilde yapmak her zamankinden daha kritik. AWS \u00fczerinde karma\u015f\u0131k altyap\u0131lar kurarken, bir\u00e7ok benzer kayna\u011f\u0131 da\u011f\u0131tmak, aralar\u0131ndaki ba\u011f\u0131ml\u0131l\u0131klar\u0131 do\u011fru y\u00f6netmek veya dinamik ko\u015fullara g\u00f6re farkl\u0131 kaynaklar olu\u015fturmak gibi zorluklarla kar\u015f\u0131la\u015fabiliriz. Bu noktada Terraform'un meta arg\u00fcmanlar\u0131 olan count, depends_on ve for_each, altyap\u0131 kodunuzu (Infrastructure as Code - IaC) daha esnek, okunabilir ve y\u00f6netilebilir hale getirerek adeta bir s\u00fcper g\u00fc\u00e7 kazand\u0131r\u0131r. Bu makalede, bu g\u00fc\u00e7l\u00fc arg\u00fcmanlar\u0131n ne i\u015fe yarad\u0131\u011f\u0131n\u0131, neden vazge\u00e7ilmez olduklar\u0131n\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l etkili bir \u015fekilde kullan\u0131labilece\u011fini ad\u0131m ad\u0131m inceleyece\u011fiz.","og_url":"https:\/\/fatihsoysal.com\/blog\/terraform-meta-argumanlari-count-depends_on-for_each-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-02T18:31:15+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"11 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/terraform-meta-argumanlari-count-depends_on-for_each-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/terraform-meta-argumanlari-count-depends_on-for_each-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Terraform Meta Arg\u00fcmanlar\u0131: count, depends_on, for_each Rehberi","datePublished":"2025-12-02T18:31:15+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/terraform-meta-argumanlari-count-depends_on-for_each-rehberi\/"},"wordCount":3701,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/terraform-meta-argumanlari-count-depends_on-for_each-rehberi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/terraform-meta-argumanlari-count-depends_on-for_each-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/terraform-meta-argumanlari-count-depends_on-for_each-rehberi\/","name":"Terraform Meta Arg\u00fcmanlar\u0131: count, depends_on, for_each Rehberi","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-02T18:31:15+00:00","description":"G\u00fcn\u00fcm\u00fcz\u00fcn dinamik bulut altyap\u0131lar\u0131nda, kaynak y\u00f6netimini verimli ve tekrarlanabilir bir \u015fekilde yapmak her zamankinden daha kritik. AWS \u00fczerinde karma\u015f\u0131k altyap\u0131lar kurarken, bir\u00e7ok benzer kayna\u011f\u0131 da\u011f\u0131tmak, aralar\u0131ndaki ba\u011f\u0131ml\u0131l\u0131klar\u0131 do\u011fru y\u00f6netmek veya dinamik ko\u015fullara g\u00f6re farkl\u0131 kaynaklar olu\u015fturmak gibi zorluklarla kar\u015f\u0131la\u015fabiliriz. Bu noktada Terraform'un meta arg\u00fcmanlar\u0131 olan count, depends_on ve for_each, altyap\u0131 kodunuzu (Infrastructure as Code - IaC) daha esnek, okunabilir ve y\u00f6netilebilir hale getirerek adeta bir s\u00fcper g\u00fc\u00e7 kazand\u0131r\u0131r. Bu makalede, bu g\u00fc\u00e7l\u00fc arg\u00fcmanlar\u0131n ne i\u015fe yarad\u0131\u011f\u0131n\u0131, neden vazge\u00e7ilmez olduklar\u0131n\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l etkili bir \u015fekilde kullan\u0131labilece\u011fini ad\u0131m ad\u0131m inceleyece\u011fiz.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/terraform-meta-argumanlari-count-depends_on-for_each-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/terraform-meta-argumanlari-count-depends_on-for_each-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/terraform-meta-argumanlari-count-depends_on-for_each-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Terraform Meta Arg\u00fcmanlar\u0131: count, depends_on, for_each 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\/35695","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=35695"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35695\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35695"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35695"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35695"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}