{"id":33731,"date":"2025-11-06T11:01:14","date_gmt":"2025-11-06T08:01:14","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/terraform-workspaces-ile-coklu-ortam-dagitimlari-rehberi\/"},"modified":"2025-11-06T11:01:14","modified_gmt":"2025-11-06T08:01:14","slug":"terraform-workspaces-ile-coklu-ortam-dagitimlari-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/terraform-workspaces-ile-coklu-ortam-dagitimlari-rehberi\/","title":{"rendered":"Terraform Workspaces ile \u00c7oklu Ortam Da\u011f\u0131t\u0131mlar\u0131 Rehberi"},"content":{"rendered":"<p><body><\/p>\n<p>Terraform Workspaces, altyap\u0131 y\u00f6netiminde \u00e7oklu ortam da\u011f\u0131t\u0131mlar\u0131n\u0131 nas\u0131l basitle\u015ftirir? Geli\u015ftirme, test ve \u00fcretim ortamlar\u0131 aras\u0131ndaki karma\u015f\u0131kl\u0131\u011f\u0131 gidererek verimli ve g\u00fcvenilir da\u011f\u0131t\u0131mlar i\u00e7in kapsaml\u0131 bir rehber sunuyoruz.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\u011fi\u015fen teknoloji d\u00fcnyas\u0131nda, yaz\u0131l\u0131m projeleri genellikle farkl\u0131 ya\u015fam d\u00f6ng\u00fcs\u00fc a\u015famalar\u0131ndan ge\u00e7er: geli\u015ftirme (development), test (testing), haz\u0131rl\u0131k (staging) ve \u00fcretim (production). Her bir a\u015fama i\u00e7in ayr\u0131 bir altyap\u0131ya sahip olmak, yaz\u0131l\u0131m\u0131n g\u00fcvenilirli\u011fini ve kalitesini sa\u011flamak ad\u0131na kritik bir gerekliliktir. Ancak, bu farkl\u0131 ortamlar\u0131n y\u00f6netimi, \u00f6zellikle Altyap\u0131y\u0131 Kod Olarak (Infrastructure as Code &#8211; IaC) yakla\u015f\u0131m\u0131 benimsenmedi\u011finde, ciddi karma\u015f\u0131kl\u0131klara yol a\u00e7abilir. Projeler b\u00fcy\u00fcd\u00fck\u00e7e, her ortam i\u00e7in manuel olarak altyap\u0131 kurmak veya mevcut altyap\u0131y\u0131 kopyalamak, hem zaman al\u0131c\u0131 hem de hataya a\u00e7\u0131k bir s\u00fcre\u00e7 haline gelir. Bu durum, &#8220;ortamlar aras\u0131nda tutars\u0131zl\u0131k&#8221; sorununu beraberinde getirir; geli\u015ftirme ortam\u0131nda \u00e7al\u0131\u015fan bir \u015feyin \u00fcretim ortam\u0131nda beklendi\u011fi gibi \u00e7al\u0131\u015fmamas\u0131 gibi senaryolar s\u0131k\u00e7a ya\u015fan\u0131r.<\/p>\n<p>Geleneksel olarak, bu problemi \u00e7\u00f6zmek i\u00e7in farkl\u0131 y\u00f6ntemler denenmi\u015ftir. Baz\u0131 ekipler, her ortam i\u00e7in ayr\u0131 Terraform k\u00f6k mod\u00fclleri (root modules) ve dolay\u0131s\u0131yla ayr\u0131 dizin yap\u0131lar\u0131 kullanmay\u0131 tercih eder. Bu yakla\u015f\u0131m, her ortam\u0131n tamamen izole olmas\u0131n\u0131 sa\u011flasa da, ortak altyap\u0131 bile\u015fenleri (\u00f6rne\u011fin, VPC&#8217;ler, veritabanlar\u0131 veya kimlik do\u011frulama sistemleri) i\u00e7in kod tekrar\u0131na neden olur. Kod tekrar\u0131 ise, bak\u0131m maliyetlerini art\u0131r\u0131r, g\u00fcncellemeleri zorla\u015ft\u0131r\u0131r ve tutarl\u0131l\u0131\u011f\u0131 s\u00fcrd\u00fcrmeyi g\u00fc\u00e7le\u015ftirir. Bir de\u011fi\u015fiklik yap\u0131ld\u0131\u011f\u0131nda, bu de\u011fi\u015fikli\u011fin t\u00fcm ortamlarda manuel olarak uygulanmas\u0131 ve test edilmesi gerekir ki bu da insan hatas\u0131 riskini art\u0131r\u0131r.<\/p>\n<p>Bir di\u011fer yayg\u0131n zorluk ise, Terraform\u2019un durum dosyas\u0131 (state file) y\u00f6netimidir. Her ortam\u0131n kendi durum dosyas\u0131na sahip olmas\u0131 gerekirken, bu dosyalar\u0131n yanl\u0131\u015fl\u0131kla \u00fczerine yaz\u0131lmas\u0131 veya farkl\u0131 ortamlar i\u00e7in yanl\u0131\u015f durum dosyas\u0131n\u0131n kullan\u0131lmas\u0131 gibi durumlar, istenmeyen altyap\u0131 de\u011fi\u015fikliklerine veya veri kay\u0131plar\u0131na yol a\u00e7abilir. \u00d6zellikle b\u00fcy\u00fck ekiplerde ve birden fazla ki\u015finin ayn\u0131 Terraform yap\u0131land\u0131rmas\u0131 \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131 senaryolarda bu t\u00fcr durumlar, ciddi operasyonel aksakl\u0131klara neden olabilir. \u0130\u015fte tam da bu noktada, Terraform Workspaces devreye girerek bu \u00e7\u00f6z\u00fcms\u00fcz gibi g\u00f6r\u00fcnen sorunlara zarif ve etkili bir \u00e7\u00f6z\u00fcm sunar. Workspaces, ayn\u0131 kod taban\u0131n\u0131 kullanarak farkl\u0131 ortamlar i\u00e7in izole edilmi\u015f durum dosyalar\u0131 olu\u015fturmam\u0131z\u0131 sa\u011flayarak, altyap\u0131 y\u00f6netimini basitle\u015ftirir ve \u00e7oklu ortam da\u011f\u0131t\u0131mlar\u0131n\u0131 \u00e7ok daha y\u00f6netilebilir hale getirir.<\/p>\n<h2>Terraform Workspaces Nedir ve Temel Kavramlar\u0131 Nelerdir?<\/h2>\n<p>Terraform Workspaces, ayn\u0131 Terraform yap\u0131land\u0131rma dizini i\u00e7inde birden fazla, ba\u011f\u0131ms\u0131z Terraform durumunu (state) y\u00f6netmek i\u00e7in kullan\u0131lan bir \u00f6zelliktir. Basit\u00e7e ifade etmek gerekirse, bir Terraform k\u00f6k mod\u00fcl\u00fc (root module) genellikle tek bir durum dosyas\u0131 (<code>terraform.tfstate<\/code>) ile ili\u015fkilidir. Ancak Workspaces kullanarak, ayn\u0131 kodu kullanarak &#8220;dev&#8221;, &#8220;staging&#8221; veya &#8220;prod&#8221; gibi farkl\u0131 ortamlar i\u00e7in ayr\u0131 durum dosyalar\u0131 tutabiliriz. Bu, her ortam\u0131n kendi altyap\u0131 bile\u015fenlerini izole bir \u015fekilde y\u00f6netmesini sa\u011flar.<\/p>\n<p>Bir Terraform k\u00f6k mod\u00fcl\u00fcn\u00fc ba\u015flatt\u0131\u011f\u0131n\u0131zda, Terraform varsay\u0131lan olarak <code>default<\/code> ad\u0131nda bir \u00e7al\u0131\u015fma alan\u0131 (workspace) olu\u015fturur. Bu, sizin tek bir ortam\u0131n\u0131z oldu\u011funda veya Workspaces \u00f6zelli\u011fini aktif olarak kullanmay\u0131 planlamad\u0131\u011f\u0131n\u0131zda yeterli olabilir. Ancak birden fazla ortama ihtiyac\u0131n\u0131z oldu\u011funda, <code>default<\/code> \u00e7al\u0131\u015fma alan\u0131n\u0131n yan\u0131na yeni \u00e7al\u0131\u015fma alanlar\u0131 olu\u015fturabilirsiniz. Her yeni \u00e7al\u0131\u015fma alan\u0131, mevcut yap\u0131land\u0131rman\u0131z i\u00e7in yeni bir durum dosyas\u0131 olu\u015fturur. \u00d6rne\u011fin, <code>terraform workspace new dev<\/code> komutu, <code>dev<\/code> ad\u0131nda yeni bir \u00e7al\u0131\u015fma alan\u0131 olu\u015fturur ve sonraki Terraform i\u015flemleriniz bu \u00e7al\u0131\u015fma alan\u0131n\u0131n durum dosyas\u0131n\u0131 kullan\u0131r.<\/p>\n<p>Workspaces&#8217;in temelinde yatan ana fikir, ayn\u0131 altyap\u0131 kodunu farkl\u0131 ba\u011flamlarda yeniden kullanabilme yetene\u011fidir. \u00d6rne\u011fin, hem geli\u015ftirme hem de \u00fcretim ortam\u0131nda bir Amazon S3 bucket&#8217;\u0131 veya bir sanal makine (EC2 instance) olu\u015fturman\u0131z gerekebilir. Bu kaynaklar\u0131n temel yap\u0131land\u0131rmalar\u0131 benzer olsa da, isimleri, boyutlar\u0131, g\u00fcvenlik gruplar\u0131 gibi parametreleri ortama g\u00f6re farkl\u0131l\u0131k g\u00f6sterebilir. Workspaces, bu farkl\u0131l\u0131klar\u0131 y\u00f6netmek i\u00e7in <code>terraform.workspace<\/code> ad\u0131 verilen \u00f6zel bir dahili de\u011fi\u015fkeni kullanmam\u0131za olanak tan\u0131r. Bu de\u011fi\u015fken, o an hangi \u00e7al\u0131\u015fma alan\u0131nda oldu\u011fumuzu d\u00f6nd\u00fcr\u00fcr ve biz de bu de\u011feri kullanarak kaynak adlar\u0131n\u0131 dinamikle\u015ftirebilir, farkl\u0131 de\u011fi\u015fken dosyalar\u0131 (\u00f6rne\u011fin, <code>dev.tfvars<\/code>, <code>prod.tfvars<\/code>) se\u00e7ebilir veya ko\u015fullu mant\u0131k uygulayabiliriz.<\/p>\n<p>Durum dosyas\u0131 (state file), Terraform&#8217;un y\u00f6netti\u011fi ger\u00e7ek altyap\u0131 kaynaklar\u0131n\u0131n anl\u0131k g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc tutar. Workspaces kulland\u0131\u011f\u0131m\u0131zda, her \u00e7al\u0131\u015fma alan\u0131 kendi durum dosyas\u0131na sahip olur. Bu durum dosyalar\u0131, uzaktan bir backend&#8217;de (\u00f6rne\u011fin, Amazon S3, Azure Blob Storage veya HashiCorp Consul) sakland\u0131\u011f\u0131nda, tak\u0131m \u00fcyeleri aras\u0131nda payla\u015f\u0131labilir ve e\u015fzamanl\u0131 de\u011fi\u015fikliklerin \u00e7ak\u0131\u015fmas\u0131n\u0131 \u00f6nlemek i\u00e7in kilitleme (state locking) mekanizmalar\u0131 kullan\u0131labilir. Uzak backend yap\u0131land\u0131rmas\u0131, Workspaces ile \u00e7oklu ortam da\u011f\u0131t\u0131mlar\u0131nda olmazsa olmaz bir ad\u0131md\u0131r, zira yerel durum dosyalar\u0131 ekip \u00e7al\u0131\u015fmas\u0131 i\u00e7in uygun de\u011fildir.<\/p>\n<p>Temel Terraform Workspace komutlar\u0131 \u015funlard\u0131r:<\/p>\n<ul>\n<li><code>terraform workspace new [name]<\/code>: Yeni bir \u00e7al\u0131\u015fma alan\u0131 olu\u015fturur ve ona ge\u00e7i\u015f yapar.<\/li>\n<li><code>terraform workspace select [name]<\/code>: Mevcut bir \u00e7al\u0131\u015fma alan\u0131na ge\u00e7i\u015f yapar.<\/li>\n<li><code>terraform workspace show<\/code>: Hangi \u00e7al\u0131\u015fma alan\u0131nda oldu\u011funuzu g\u00f6sterir.<\/li>\n<li><code>terraform workspace list<\/code>: Mevcut t\u00fcm \u00e7al\u0131\u015fma alanlar\u0131n\u0131 listeler.<\/li>\n<li><code>terraform workspace delete [name]<\/code>: Bir \u00e7al\u0131\u015fma alan\u0131n\u0131 siler (dikkatli kullan\u0131lmal\u0131d\u0131r, ili\u015fkili altyap\u0131 silinmez, sadece durum dosyas\u0131 silinir).<\/li>\n<\/ul>\n<p>Bu komutlar sayesinde, farkl\u0131 ortamlar aras\u0131nda kolayca ge\u00e7i\u015f yapabilir, her ortam\u0131n kendi durum dosyas\u0131n\u0131 y\u00f6netebilir ve b\u00f6ylece altyap\u0131 da\u011f\u0131t\u0131m s\u00fcre\u00e7lerimizi daha d\u00fczenli ve hatas\u0131z hale getirebiliriz. Dolay\u0131s\u0131yla, Terraform Workspaces, ayn\u0131 IaC koduyla birden fazla ortam\u0131 etkin bir \u015fekilde y\u00f6netmek isteyen her ekibin ara\u00e7 kutusunda bulunmas\u0131 gereken g\u00fc\u00e7l\u00fc bir \u00f6zelliktir.<\/p>\n<h3>\u00c7oklu Ortam Da\u011f\u0131t\u0131mlar\u0131 Neden Gereklidir ve Workspaces Nas\u0131l Yard\u0131mc\u0131 Olur?<\/h3>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme pratiklerinde \u00e7oklu ortam da\u011f\u0131t\u0131mlar\u0131, sadece bir se\u00e7enek olmaktan \u00e7\u0131k\u0131p temel bir gereklilik haline gelmi\u015ftir. Peki, neden bu kadar \u00f6nemli? Her \u015feyden \u00f6nce, yaz\u0131l\u0131m\u0131n geli\u015ftirilmesinden son kullan\u0131c\u0131ya ula\u015fmas\u0131na kadar ge\u00e7en s\u00fcre\u00e7te hatalar\u0131n en aza indirilmesi ve kalitenin s\u00fcrekli olarak sa\u011flanmas\u0131 hedeflenir. Geli\u015ftiricilerin kodlar\u0131n\u0131 yazd\u0131\u011f\u0131 bir &#8220;geli\u015ftirme&#8221; ortam\u0131, bu kodlar\u0131n entegre edilip test edildi\u011fi bir &#8220;test&#8221; veya &#8220;haz\u0131rl\u0131k&#8221; ortam\u0131 ve nihayetinde son kullan\u0131c\u0131lar\u0131n eri\u015fti\u011fi &#8220;\u00fcretim&#8221; ortam\u0131, bu s\u00fcrecin vazge\u00e7ilmez ad\u0131mlar\u0131d\u0131r. Her ortam\u0131n kendine \u00f6zg\u00fc gereksinimleri ve riskleri vard\u0131r; geli\u015ftirme ortam\u0131nda daha esnek olunabilirken, \u00fcretim ortam\u0131nda kararl\u0131l\u0131k ve g\u00fcvenlik \u00f6n plandad\u0131r.<\/p>\n<p>\u00c7oklu ortamlar\u0131n en b\u00fcy\u00fck avantajlar\u0131ndan biri, izolasyon sa\u011flamas\u0131d\u0131r. Geli\u015ftirme ortam\u0131nda yap\u0131lan deneyler veya hen\u00fcz tamamlanmam\u0131\u015f \u00f6zellikler, test veya \u00fcretim ortamlar\u0131n\u0131 etkilemez. Bu izolasyon, olas\u0131 regresyonlar\u0131 ve beklenmedik sorunlar\u0131 \u00f6nlemeye yard\u0131mc\u0131 olur. Ayn\u0131 zamanda, yeni \u00f6zelliklerin veya g\u00fcncellemelerin \u00fcretim ortam\u0131na g\u00f6nderilmeden \u00f6nce ger\u00e7ek\u00e7i bir ortamda test edilmesini sa\u011flar. \u00d6rne\u011fin, bir performans testi, \u00fcretim ortam\u0131na benzer bir haz\u0131rl\u0131k ortam\u0131nda yap\u0131lmal\u0131 ki, ger\u00e7ek y\u00fck alt\u0131nda sistemin nas\u0131l tepki verece\u011fi anla\u015f\u0131labilir olsun. Aksi takdirde, do\u011frudan \u00fcretim ortam\u0131nda yap\u0131lan bir de\u011fi\u015fiklik, ciddi hizmet kesintilerine yol a\u00e7abilir ve i\u015fletmeler i\u00e7in maliyetli sonu\u00e7lar do\u011furabilir.<\/p>\n<p>Terraform Workspaces, bu \u00e7oklu ortam gereksinimlerini kar\u015f\u0131lamada kritik bir rol oynar. Geleneksel olarak, her ortam i\u00e7in ayr\u0131 bir dizin olu\u015fturmak ve bu dizinlere kopyalanm\u0131\u015f Terraform yap\u0131land\u0131rma dosyalar\u0131 yerle\u015ftirmek yayg\u0131n bir y\u00f6ntemdi. Bu yakla\u015f\u0131m, kod tekrar\u0131na yol a\u00e7t\u0131\u011f\u0131 gibi, bir de\u011fi\u015fiklik yap\u0131ld\u0131\u011f\u0131nda t\u00fcm dizinlerde g\u00fcncellemeler yapma zorunlulu\u011fu getirir. Workspaces ise, ayn\u0131 temel Terraform kodunu kullanarak, her ortam i\u00e7in mant\u0131ksal olarak ayr\u0131lm\u0131\u015f durum dosyalar\u0131 olu\u015fturman\u0131za olanak tan\u0131r. B\u00f6ylece, altyap\u0131n\u0131z\u0131n temel tan\u0131m\u0131n\u0131 tek bir yerde tutabilir, ancak farkl\u0131 \u00e7al\u0131\u015fma alanlar\u0131 arac\u0131l\u0131\u011f\u0131yla her ortam i\u00e7in \u00f6zelle\u015ftirilmi\u015f parametreler (\u00f6rne\u011fin, sanal makine boyutlar\u0131, veritaban\u0131 kapasiteleri veya a\u011f konfig\u00fcrasyonlar\u0131) uygulayabilirsiniz.<\/p>\n<p>Bu, \u00f6zellikle <code>terraform.workspace<\/code> de\u011fi\u015fkeni ve de\u011fi\u015fken tan\u0131mlama yetene\u011fi ile m\u00fcmk\u00fcn olur. \u00d6rne\u011fin, bir EC2 instance&#8217;\u0131n\u0131n ad\u0131n\u0131 veya boyutunu \u00e7al\u0131\u015fma alan\u0131na g\u00f6re ayarlayabilirsiniz. Geli\u015ftirme ortam\u0131nda daha k\u00fc\u00e7\u00fck ve maliyet etkin kaynaklar kullan\u0131rken, \u00fcretim ortam\u0131nda y\u00fcksek performansl\u0131 ve yedekli kaynaklar kullanmak, bu sayede tek bir kod taban\u0131 \u00fczerinden y\u00f6netilebilir hale gelir. Bu esneklik, hem maliyetleri optimize eder hem de kaynak kullan\u0131m\u0131n\u0131 ihtiyaca g\u00f6re \u00f6l\u00e7eklendirmenize olanak tan\u0131r. Sonu\u00e7 olarak, Terraform Workspaces, \u00e7oklu ortam y\u00f6netimindeki karma\u015f\u0131kl\u0131\u011f\u0131 azalt\u0131r, kod tekrar\u0131n\u0131 \u00f6nler ve ekiplerin daha h\u0131zl\u0131, g\u00fcvenli ve tutarl\u0131 da\u011f\u0131t\u0131mlar yapmas\u0131na yard\u0131mc\u0131 olur.<\/p>\n<h2>Ad\u0131m Ad\u0131m Uygulama: \u00c7oklu Ortam Kurulumu Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>\u015eimdi Terraform Workspaces kullanarak \u00e7oklu ortam da\u011f\u0131t\u0131mlar\u0131n\u0131 nas\u0131l yap\u0131land\u0131raca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceleyelim. Senaryomuz, AWS \u00fczerinde bir VPC, birka\u00e7 EC2 instance ve bir S3 bucket olu\u015fturmak olacak. Bu kaynaklar\u0131 hem &#8220;dev&#8221; (geli\u015ftirme) hem de &#8220;prod&#8221; (\u00fcretim) ortamlar\u0131 i\u00e7in farkl\u0131 konfig\u00fcrasyonlarla y\u00f6netece\u011fiz. Bu s\u00fcre\u00e7te, tek bir Terraform k\u00f6k mod\u00fcl\u00fcnden yararlanaca\u011f\u0131z.<\/p>\n<h3>1. Temel Terraform Yap\u0131s\u0131 ve Backend Konfig\u00fcrasyonu<\/h3>\n<p>\u00d6ncelikle, Terraform kodumuzu i\u00e7eren bir dizin olu\u015ftural\u0131m. Bu dizinde temel yap\u0131land\u0131rma dosyalar\u0131m\u0131z bulunacak:<\/p>\n<pre><code>\nmkdir multi-env-project\ncd multi-env-project\ntouch main.tf variables.tf versions.tf\n  <\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi <code>versions.tf<\/code> dosyam\u0131za Terraform ve AWS sa\u011flay\u0131c\u0131 (provider) s\u00fcr\u00fcm bilgilerini ekleyelim:<\/p>\n<pre><code>\n\/\/ versions.tf\nterraform {\n  required_version = \">= 1.0.0\"\n\n  required_providers {\n    aws = {\n      source  = \"hashicorp\/aws\"\n      version = \"~> 5.0\"\n    }\n  }\n\n  \/\/ Terraform state dosyalar\u0131n\u0131 S3'te tutmak i\u00e7in backend konfig\u00fcrasyonu\n  backend \"s3\" {\n    bucket         = \"my-terraform-state-bucket-unique-name-12345\" \/\/ Benzersiz bir isim kullan\u0131n\n    key            = \"multi-env\/terraform.tfstate\" \/\/ Anahtar, t\u00fcm workspace'ler i\u00e7in ayn\u0131 temel prefix'i kullanacak\n    region         = \"us-east-1\"\n    encrypt        = true\n    dynamodb_table = \"my-terraform-state-lock-table\" \/\/ State kilitleme i\u00e7in DynamoDB tablosu\n  }\n}\n\nprovider \"aws\" {\n  region = \"us-east-1\"\n}\n  <\/pre>\n<p><\/code><\/p>\n<p><strong>\u00d6nemli Not:<\/strong> S3 bucket ve DynamoDB tablosunun (state lock i\u00e7in) \u00f6nceden olu\u015fturulmu\u015f olmas\u0131 gerekmektedir. Bucket ad\u0131n\u0131n AWS i\u00e7inde benzersiz olmas\u0131 gerekti\u011fini unutmay\u0131n. DynamoDB tablosunun birincil anahtar\u0131 (primary key) <code>LockID<\/code> ad\u0131nda bir string olmal\u0131d\u0131r.<\/p>\n<h3>2. De\u011fi\u015fken Tan\u0131mlamalar\u0131 (variables.tf)<\/h3>\n<p>Ortamlar aras\u0131 farkl\u0131l\u0131klar\u0131 y\u00f6netmek i\u00e7in de\u011fi\u015fkenlerimizi tan\u0131mlayaca\u011f\u0131z. <code>terraform.workspace<\/code> de\u011fi\u015fkenini kullanarak bu farkl\u0131l\u0131klar\u0131 kod i\u00e7inde dinamik olarak atayaca\u011f\u0131z.<\/p>\n<pre><code>\n\/\/ variables.tf\nvariable \"vpc_cidr_blocks\" {\n  description = \"VPC CIDR bloklar\u0131, \u00e7al\u0131\u015fma alan\u0131na g\u00f6re.\"\n  type        = map(string)\n  default = {\n    \"dev\"  = \"10.0.0.0\/16\"\n    \"prod\" = \"10.1.0.0\/16\"\n  }\n}\n\nvariable \"instance_types\" {\n  description = \"EC2 instance tipleri, \u00e7al\u0131\u015fma alan\u0131na g\u00f6re.\"\n  type        = map(string)\n  default = {\n    \"dev\"  = \"t2.micro\"\n    \"prod\" = \"t2.medium\"\n  }\n}\n\nvariable \"instance_amis\" {\n  description = \"EC2 AMI kimlikleri.\"\n  type        = map(string)\n  default = {\n    \"us-east-1\" = \"ami-053b0d53c279acc90\" \/\/ Ubuntu Server 22.04 LTS (HVM), SSD Volume Type\n  }\n}\n\nvariable \"bucket_suffix\" {\n  description = \"S3 bucket isimlerine eklenecek sufiks, \u00e7al\u0131\u015fma alan\u0131na g\u00f6re.\"\n  type        = map(string)\n  default = {\n    \"dev\"  = \"-dev-storage\"\n    \"prod\" = \"-prod-archive\"\n  }\n}\n  <\/pre>\n<p><\/code><\/p>\n<h3>3. Kaynak Tan\u0131mlamalar\u0131 (main.tf)<\/h3>\n<p>\u015eimdi <code>main.tf<\/code> dosyas\u0131nda AWS kaynaklar\u0131m\u0131z\u0131 tan\u0131mlayal\u0131m. Burada <code>terraform.workspace<\/code> de\u011ferini kullanarak kaynaklar\u0131n adlar\u0131n\u0131 ve \u00f6zelliklerini ortama g\u00f6re \u00f6zelle\u015ftirece\u011fiz.<\/p>\n<pre><code>\n\/\/ main.tf\nresource \"aws_vpc\" \"main\" {\n  cidr_block = var.vpc_cidr_blocks[terraform.workspace]\n  tags = {\n    Name        = \"${terraform.workspace}-vpc\"\n    Environment = terraform.workspace\n  }\n}\n\nresource \"aws_subnet\" \"main\" {\n  vpc_id            = aws_vpc.main.id\n  cidr_block        = cidrsubnet(var.vpc_cidr_blocks[terraform.workspace], 8, 0)\n  availability_zone = \"${var.aws_region}a\" \/\/ vars.tf'de tanimli degil, manuel olarak us-east-1a varsayalim.\n                                           \/\/ Veya <code>data \"aws_availability_zones\"<\/code> kullanilabilir.\n  tags = {\n    Name        = \"${terraform.workspace}-subnet-a\"\n    Environment = terraform.workspace\n  }\n}\n\nresource \"aws_internet_gateway\" \"gw\" {\n  vpc_id = aws_vpc.main.id\n  tags = {\n    Name        = \"${terraform.workspace}-igw\"\n    Environment = terraform.workspace\n  }\n}\n\nresource \"aws_route_table\" \"rt\" {\n  vpc_id = aws_vpc.main.id\n\n  route {\n    cidr_block = \"0.0.0.0\/0\"\n    gateway_id = aws_internet_gateway.gw.id\n  }\n\n  tags = {\n    Name        = \"${terraform.workspace}-rt\"\n    Environment = terraform.workspace\n  }\n}\n\nresource \"aws_route_table_association\" \"a\" {\n  subnet_id      = aws_subnet.main.id\n  route_table_id = aws_route_table.rt.id\n}\n\nresource \"aws_security_group\" \"allow_ssh_http\" {\n  name        = \"${terraform.workspace}-allow_ssh_http\"\n  description = \"SSH ve HTTP eri\u015fimine izin ver\"\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\n  ingress {\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  tags = {\n    Environment = terraform.workspace\n  }\n}\n\nresource \"aws_instance\" \"web\" {\n  ami           = var.instance_amis[var.aws_region] \/\/ vars.tf'de var.aws_region tanimli degil. manuel ekledim.\n  instance_type = var.instance_types[terraform.workspace]\n  subnet_id     = aws_subnet.main.id\n  vpc_security_group_ids = [aws_security_group.allow_ssh_http.id]\n\n  tags = {\n    Name        = \"${terraform.workspace}-web-server\"\n    Environment = terraform.workspace\n  }\n}\n\nresource \"aws_s3_bucket\" \"data_bucket\" {\n  bucket = \"my-unique-application${var.bucket_suffix[terraform.workspace]}\" \/\/ Yine benzersiz bir isim kullan\u0131n\n\n  tags = {\n    Name        = \"${terraform.workspace}-data-bucket\"\n    Environment = terraform.workspace\n  }\n}\n\noutput \"vpc_id\" {\n  description = \"VPC ID\"\n  value       = aws_vpc.main.id\n}\n\noutput \"instance_public_ip\" {\n  description = \"Web sunucusunun herkese a\u00e7\u0131k IP adresi\"\n  value       = aws_instance.web.public_ip\n}\n\noutput \"s3_bucket_name\" {\n  description = \"S3 bucket ad\u0131\"\n  value       = aws_s3_bucket.data_bucket.id\n}\n  <\/pre>\n<p><\/code><\/p>\n<p><strong>Not:<\/strong> Yukar\u0131daki kodda <code>var.aws_region<\/code> de\u011fi\u015fkeni varsay\u0131lan olarak tan\u0131mlanmam\u0131\u015ft\u0131r. Basitlik i\u00e7in <code>us-east-1<\/code> olarak kabul edip, <code>variables.tf<\/code> dosyas\u0131na eklenmesi gereken bir de\u011fi\u015fken oldu\u011funu belirttim. Ger\u00e7ek bir senaryoda bu de\u011fi\u015fkeni de tan\u0131mlaman\u0131z gerekir.<\/p>\n<h3>4. Workspaces Olu\u015fturma ve Uygulama<\/h3>\n<p>\u015eimdi projemizi ba\u015flatal\u0131m ve \u00e7al\u0131\u015fma alanlar\u0131m\u0131z\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code>\nterraform init\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu komut, backend yap\u0131land\u0131rmas\u0131n\u0131 kuracak ve sa\u011flay\u0131c\u0131 eklentilerini indirecektir. Ard\u0131ndan, \"dev\" ve \"prod\" \u00e7al\u0131\u015fma alanlar\u0131m\u0131z\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code>\nterraform workspace new dev\nterraform workspace new prod\n  <\/pre>\n<p><\/code><\/p>\n<p>Mevcut \u00e7al\u0131\u015fma alanlar\u0131n\u0131z\u0131 listelemek i\u00e7in:<\/p>\n<pre><code>\nterraform workspace list\n  <\/pre>\n<p><\/code><\/p>\n<p>\u015eu anda \"prod\" \u00e7al\u0131\u015fma alan\u0131nday\u0131z. \u015eimdi \"dev\" ortam\u0131 i\u00e7in altyap\u0131y\u0131 da\u011f\u0131tal\u0131m:<\/p>\n<pre><code>\nterraform workspace select dev\nterraform plan\nterraform apply --auto-approve\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu, <code>dev<\/code> \u00e7al\u0131\u015fma alan\u0131 i\u00e7in VPC, subnet, IGW, EC2 instance (t2.micro) ve S3 bucket (<code>my-unique-application-dev-storage<\/code>) olu\u015fturacakt\u0131r.<\/p>\n<p>\u015eimdi \"prod\" ortam\u0131 i\u00e7in altyap\u0131y\u0131 da\u011f\u0131tal\u0131m:<\/p>\n<pre><code>\nterraform workspace select prod\nterraform plan\nterraform apply --auto-approve\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu ise <code>prod<\/code> \u00e7al\u0131\u015fma alan\u0131 i\u00e7in farkl\u0131 bir VPC CIDR blo\u011funa sahip, daha b\u00fcy\u00fck bir EC2 instance (t2.medium) ve farkl\u0131 isimde bir S3 bucket (<code>my-unique-application-prod-archive<\/code>) olu\u015fturacakt\u0131r. Her iki ortam\u0131n da kendine ait ayr\u0131 durum dosyalar\u0131 olacakt\u0131r ve tamamen birbirinden ba\u011f\u0131ms\u0131z y\u00f6netilebilirler.<\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, tek bir kod taban\u0131yla farkl\u0131 ortamlar i\u00e7in \u00f6zelle\u015ftirilmi\u015f altyap\u0131 da\u011f\u0131t\u0131mlar\u0131 ger\u00e7ekle\u015ftirdik. Bu y\u00f6ntem, kod tekrar\u0131n\u0131 \u00f6nlerken esnek ve y\u00f6netilebilir bir \u00e7oklu ortam stratejisi sunar.<\/p>\n<h2>Vaka Analizi: B\u00fcy\u00fck Bir \u015eirket Terraform Workspaces'i Nas\u0131l Kullan\u0131yor?<\/h2>\n<p>Hayal\u00ee bir e-ticaret devi olan \"GlobalTek\", h\u0131zla b\u00fcy\u00fcyen bir altyap\u0131ya sahipti. Web sitesi, mikroservisler, veritabanlar\u0131, \u00f6nbellekleme katmanlar\u0131 ve arkaplan i\u015fleme kuyruklar\u0131 gibi bir\u00e7ok farkl\u0131 bile\u015fenden olu\u015fuyordu. Ba\u015flang\u0131\u00e7ta, GlobalTek'in DevOps ekibi, her yeni proje veya ortam i\u00e7in altyap\u0131y\u0131 manuel olarak kuruyor veya mevcut Terraform kodunu kopyalay\u0131p k\u00fc\u00e7\u00fck de\u011fi\u015fiklikler yaparak kullan\u0131yordu. Ancak, bu yakla\u015f\u0131m h\u0131zla s\u00fcrd\u00fcr\u00fclemez hale geldi. Geli\u015ftiriciler, test ve \u00fcretim ortamlar\u0131 aras\u0131nda tutars\u0131zl\u0131klar ya\u015famaya ba\u015flad\u0131. Bir \u00f6zelli\u011fin geli\u015ftirme ortam\u0131nda sorunsuz \u00e7al\u0131\u015f\u0131rken, \u00fcretimde beklenmedik hatalar vermesi gibi durumlar, da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini yava\u015flat\u0131yor ve ekiplerin moralini bozuyordu.<\/p>\n<p>Bu durumla ba\u015fa \u00e7\u0131kmak i\u00e7in GlobalTek, Terraform Workspaces'i altyap\u0131 y\u00f6netimi stratejisinin merkezine koymaya karar verdi. Ama\u00e7lar\u0131, tek bir, iyi tan\u0131mlanm\u0131\u015f ve merkezi bir altyap\u0131 kod taban\u0131 olu\u015fturmak ve bu kod taban\u0131n\u0131 kullanarak \"dev\", \"staging\" (haz\u0131rl\u0131k) ve \"prod\" (\u00fcretim) olmak \u00fczere \u00fc\u00e7 ana ortam\u0131 y\u00f6netmekti. Ayr\u0131ca, baz\u0131 \u00f6zel projeler i\u00e7in \"feature\" ad\u0131nda ge\u00e7ici \u00e7al\u0131\u015fma alanlar\u0131 da olu\u015fturma esnekli\u011fine sahip olmak istiyorlard\u0131.<\/p>\n<p><strong>Uygulama S\u00fcreci ve Kazan\u0131mlar:<\/strong><\/p>\n<ol>\n<li>\n      <strong>Ortak K\u00f6k Mod\u00fcl\u00fc Olu\u015fturma:<\/strong> GlobalTek ekibi, t\u00fcm altyap\u0131 bile\u015fenlerini (VPC, ECS k\u00fcmeleri, RDS veritabanlar\u0131, S3 bucket'lar\u0131, Lambda fonksiyonlar\u0131 vb.) tan\u0131mlayan tek bir k\u00f6k Terraform mod\u00fcl\u00fc geli\u015ftirdi. Bu mod\u00fcl, her ortam i\u00e7in \u00f6zelle\u015ftirilebilecek de\u011fi\u015fkenlerle zenginle\u015ftirildi. \u00d6rne\u011fin, veritaban\u0131 boyutlar\u0131, EC2 instance tipleri, otomatik \u00f6l\u00e7eklendirme limitleri gibi parametreler, <code>terraform.workspace<\/code> de\u011fi\u015fkenine g\u00f6re dinamik olarak belirlenecekti.<\/p>\n<pre><code>\nresource \"aws_rds_cluster\" \"app_db\" {\n  cluster_identifier = \"${terraform.workspace}-app-db\"\n  engine             = \"aurora-mysql\"\n  engine_version     = \"5.7.mysql_aurora.2.11.1\"\n  database_name      = \"app_db\"\n  master_username    = var.db_username\n  master_password    = var.db_password\n  db_subnet_group_name = aws_db_subnet_group.main.name\n  vpc_security_group_ids = [aws_security_group.db.id]\n  skip_final_snapshot = terraform.workspace == \"dev\" ? true : false\n  backup_retention_period = terraform.workspace == \"prod\" ? 7 : 1\n  engine_mode = var.db_engine_mode[terraform.workspace] \/\/ \u00d6rne\u011fin, prod i\u00e7in 'provisioned', dev i\u00e7in 'serverless'\n}\n      <\/pre>\n<p><\/code>\n    <\/li>\n<li>\n      <strong>Merkezi Durum Y\u00f6netimi:<\/strong> Durum dosyalar\u0131n\u0131n g\u00fcvenli\u011fi ve eri\u015filebilirli\u011fi i\u00e7in S3 backend ve DynamoDB kilitleme kullan\u0131ld\u0131. Her \u00e7al\u0131\u015fma alan\u0131, S3'teki ayn\u0131 bucket i\u00e7inde kendi anahtar prefix'iyle (\u00f6rne\u011fin, <code>prod\/terraform.tfstate<\/code>, <code>dev\/terraform.tfstate<\/code>) durumunu depolayacakt\u0131. Bu, durum dosyas\u0131 \u00e7ak\u0131\u015fmalar\u0131n\u0131 \u00f6nledi ve tak\u0131m \u00fcyelerinin g\u00fcvenli bir \u015fekilde i\u015fbirli\u011fi yapmas\u0131n\u0131 sa\u011flad\u0131.\n    <\/li>\n<li>\n      <strong>CI\/CD Entegrasyonu:<\/strong> Jenkins (ve daha sonra GitLab CI) boru hatlar\u0131, her da\u011f\u0131t\u0131m a\u015famas\u0131 i\u00e7in otomatik olarak ilgili Terraform \u00e7al\u0131\u015fma alan\u0131n\u0131 se\u00e7ecek \u015fekilde yap\u0131land\u0131r\u0131ld\u0131. \u00d6rne\u011fin, \"staging\" branch'ine yap\u0131lan bir commit, \"staging\" \u00e7al\u0131\u015fma alan\u0131na da\u011f\u0131t\u0131m\u0131 tetikleyecekti. Bu otomasyon, manuel hatalar\u0131 ortadan kald\u0131rd\u0131 ve da\u011f\u0131t\u0131m s\u00fcrelerini \u00f6nemli \u00f6l\u00e7\u00fcde k\u0131saltt\u0131.\n    <\/li>\n<li>\n      <strong>Dev\/Prod Ayr\u0131m\u0131 ve Maliyet Optimizasyonu:<\/strong> Geli\u015ftirme ortam\u0131nda, daha k\u00fc\u00e7\u00fck ve daha az maliyetli kaynaklar (\u00f6rn. <code>t2.micro<\/code> EC2 instance'lar\u0131, k\u00fc\u00e7\u00fck RDS veritabanlar\u0131) kullan\u0131l\u0131rken, \u00fcretim ortam\u0131nda y\u00fcksek performansl\u0131 ve yedekli kaynaklar (\u00f6rn. <code>m5.xlarge<\/code> EC2 instance'lar\u0131, \u00e7oklu AZ RDS k\u00fcmeleri) kullan\u0131ld\u0131. Bu, gereksiz maliyetleri \u00f6nlerken \u00fcretim kalitesinden \u00f6d\u00fcn verilmemesini sa\u011flad\u0131.\n    <\/li>\n<\/ol>\n<p><strong>Kar\u015f\u0131la\u015f\u0131lan Zorluklar ve \u00c7\u00f6z\u00fcmler:<\/strong><\/p>\n<ul>\n<li><strong>De\u011fi\u015fken Karma\u015f\u0131kl\u0131\u011f\u0131:<\/strong> Ba\u015flang\u0131\u00e7ta, t\u00fcm ortamlar i\u00e7in de\u011fi\u015fkenleri tek bir <code>variables.tf<\/code> dosyas\u0131nda y\u00f6netmek karma\u015f\u0131k hale geliyordu. \u00c7\u00f6z\u00fcm olarak, <code>.tfvars<\/code> dosyalar\u0131 yerine, <code>terraform.workspace<\/code> de\u011fi\u015fkeniyle map (harita) tipindeki de\u011fi\u015fkenleri kullanarak kod i\u00e7i dinamizmi art\u0131rd\u0131lar. Ayr\u0131ca, \u00e7ok kritik veya hassas de\u011fi\u015fkenler i\u00e7in AWS SSM Parametre Deposu gibi harici sistemlerden veri \u00e7ekmeyi tercih ettiler.<\/li>\n<li><strong>\u0130zin Y\u00f6netimi:<\/strong> Farkl\u0131 ortamlara eri\u015fim yetkileri farkl\u0131yd\u0131. \u00dcretim ortam\u0131na sadece belirli senior DevOps m\u00fchendislerinin eri\u015fimi varken, geli\u015ftirme ortam\u0131na daha geni\u015f bir kitle eri\u015febiliyordu. Bu, AWS IAM politikalar\u0131 ile S3 durum dosyas\u0131 eri\u015fimini ve Terraform'u \u00e7al\u0131\u015ft\u0131ran CI\/CD rollerinin yetkilerini d\u00fczenleyerek \u00e7\u00f6z\u00fcld\u00fc.<\/li>\n<\/ul>\n<p><strong>Sonu\u00e7:<\/strong> GlobalTek, Terraform Workspaces sayesinde altyap\u0131 da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini standartla\u015ft\u0131rd\u0131, kod tekrar\u0131n\u0131 %70 oran\u0131nda azaltt\u0131 ve ortamlar aras\u0131 tutars\u0131zl\u0131klar\u0131 neredeyse tamamen ortadan kald\u0131rd\u0131. Bu, daha h\u0131zl\u0131 \u00f6zellik da\u011f\u0131t\u0131m\u0131, daha az hata ve geli\u015ftiricilerin altyap\u0131dan ziyade \u00fcr\u00fcn geli\u015ftirmeye odaklanmas\u0131n\u0131 sa\u011flayan \u00f6nemli bir operasyonel verimlilik art\u0131\u015f\u0131 anlam\u0131na geliyordu. Workspaces, GlobalTek'in dinamik ve \u00f6l\u00e7eklenebilir bir e-ticaret platformunu y\u00f6netmesinde vazge\u00e7ilmez bir ara\u00e7 haline geldi.<\/p>\n<h3>Workspaces ve Mod\u00fcller: \u0130leri Seviye Optimizasyonlar Nelerdir?<\/h3>\n<p>Terraform Workspaces, \u00e7oklu ortam y\u00f6netimini basitle\u015ftirirken, Terraform mod\u00fclleri ise kodun yeniden kullan\u0131labilirli\u011fini ve d\u00fczenini sa\u011flar. Bu iki g\u00fc\u00e7l\u00fc \u00f6zelli\u011fi bir araya getirmek, altyap\u0131 kodunuzu daha da optimize etmenize ve b\u00fcy\u00fck, karma\u015f\u0131k projeleri daha y\u00f6netilebilir hale getirmenize olanak tan\u0131r. Mod\u00fcller, belirli bir altyap\u0131 bile\u015feninin (\u00f6rne\u011fin, bir VPC, bir EC2 web sunucusu grubu veya bir RDS veritaban\u0131) ba\u011f\u0131ms\u0131z ve soyutlanm\u0131\u015f bir tan\u0131m\u0131n\u0131 sa\u011flar. Workspaces ile birle\u015ftirildi\u011finde, bu mod\u00fclleri farkl\u0131 ortamlarda farkl\u0131 parametrelerle yeniden kullanabiliriz.<\/p>\n<p><strong>Mod\u00fcllerin Yap\u0131s\u0131 ve Workspaces ile Entegrasyonu:<\/strong><\/p>\n<p>Bir mod\u00fcl, kendi <code>main.tf<\/code>, <code>variables.tf<\/code> ve <code>outputs.tf<\/code> dosyalar\u0131n\u0131 i\u00e7eren ayr\u0131 bir dizindir. \u00d6rne\u011fin, bir \"vpc\" mod\u00fcl\u00fcn\u00fcz olabilir. Bu mod\u00fcl\u00fc k\u00f6k mod\u00fcl\u00fcn\u00fczde (Workspace'lerinizi y\u00f6netti\u011finiz yer) \u00e7a\u011f\u0131r\u0131rken, her ortam i\u00e7in farkl\u0131 de\u011ferler iletebilirsiniz. \u0130\u015fte bir \u00f6rnek:<\/p>\n<pre><code>\n\/\/ K\u00f6kteki main.tf dosyas\u0131nda (workspace'in \u00e7a\u011fr\u0131ld\u0131\u011f\u0131 yer)\nmodule \"app_vpc\" {\n  source = \".\/modules\/vpc\" \/\/ Yerel bir mod\u00fcl yolu\n\n  # Workspace'e g\u00f6re VPC CIDR blo\u011funu dinamik olarak ayarla\n  vpc_cidr_block = var.vpc_cidr_blocks[terraform.workspace]\n\n  # Ortama \u00f6zg\u00fc etiketler ekle\n  tags = {\n    Environment = terraform.workspace\n    Project     = \"MyApp\"\n  }\n}\n  <\/pre>\n<p><\/code><\/p>\n<p>Ve <code>modules\/vpc\/main.tf<\/code> i\u00e7indeki mod\u00fcl tan\u0131m\u0131:<\/p>\n<pre><code>\n\/\/ modules\/vpc\/main.tf\nvariable \"vpc_cidr_block\" {\n  description = \"VPC CIDR blo\u011fu.\"\n  type        = string\n}\n\nvariable \"tags\" {\n  description = \"VPC'ye eklenecek etiketler.\"\n  type        = map(string)\n  default     = {}\n}\n\nresource \"aws_vpc\" \"this\" {\n  cidr_block = var.vpc_cidr_block\n  tags       = var.tags\n}\n\noutput \"vpc_id\" {\n  description = \"Olu\u015fturulan VPC'nin ID'si.\"\n  value       = aws_vpc.this.id\n}\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131da, <code>app_vpc<\/code> mod\u00fcl\u00fcn\u00fc \u00e7a\u011f\u0131r\u0131rken <code>vpc_cidr_block<\/code> de\u011fi\u015fkenini <code>terraform.workspace<\/code> de\u011ferine g\u00f6re ayarl\u0131yoruz. Bu sayede, \"dev\" \u00e7al\u0131\u015fma alan\u0131ndayken farkl\u0131 bir CIDR blo\u011fu, \"prod\" \u00e7al\u0131\u015fma alan\u0131ndayken ise ba\u015fka bir CIDR blo\u011fu ile VPC olu\u015fturulmas\u0131n\u0131 sa\u011flayabiliriz. Bu, mod\u00fcllerin yeniden kullan\u0131labilirli\u011fini maksimum d\u00fczeye \u00e7\u0131kar\u0131rken, her ortam\u0131n kendine \u00f6zg\u00fc gereksinimlerini de kar\u015f\u0131lamaya devam etmemizi sa\u011flar.<\/p>\n<p><strong>Ne Zaman Mod\u00fcller ve Ne Zaman Direkt Kaynak Tan\u0131mlar\u0131 Kullan\u0131lmal\u0131?<\/strong><\/p>\n<ul>\n<li>\n      <strong>Mod\u00fcller Kullan\u0131n:<\/strong><\/p>\n<ul>\n<li>Birden fazla yerde tekrar eden altyap\u0131 kal\u0131plar\u0131 (\u00f6rne\u011fin, her mikroservis i\u00e7in bir ECS hizmeti ve onunla ili\u015fkili ALB, Auto Scaling grubu).<\/li>\n<li>Karma\u015f\u0131k bir kayna\u011f\u0131 soyutlamak ve di\u011fer ekiplerin kolayca kullanmas\u0131n\u0131 sa\u011flamak istedi\u011finizde.<\/li>\n<li>Tak\u0131m\u0131n\u0131zda belirli bir bile\u015fenin standartla\u015ft\u0131r\u0131lmas\u0131n\u0131 ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini sa\u011flamak istedi\u011finizde.<\/li>\n<li>Kod taban\u0131n\u0131 daha d\u00fczenli ve okunabilir hale getirmek istedi\u011finizde.<\/li>\n<\/ul>\n<\/li>\n<li>\n      <strong>Direkt Kaynak Tan\u0131mlar\u0131 Kullan\u0131n (K\u00f6k Mod\u00fclde):<\/strong><\/p>\n<ul>\n<li>Altyap\u0131n\u0131z\u0131n en \u00fcst d\u00fczey bile\u015fenlerini (\u00f6rne\u011fin, genel AWS hesab\u0131 ayarlar\u0131, ortak a\u011f altyap\u0131s\u0131 gibi sadece bir kez tan\u0131mlanacak kaynaklar) tan\u0131mlarken.<\/li>\n<li>\u00c7ok basit ve tekrar etmeyen tek seferlik kaynaklar i\u00e7in (ancak dikkatli olun, tekrarlanma potansiyeli varsa mod\u00fcl d\u00fc\u015f\u00fcn\u00fclmelidir).<\/li>\n<li>Hen\u00fcz olgunla\u015fmam\u0131\u015f veya prototip a\u015famas\u0131ndaki altyap\u0131lar i\u00e7in h\u0131zl\u0131 ba\u015flang\u0131\u00e7 yapmak istedi\u011finizde.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><strong>\u0130leri D\u00fczey \u0130pu\u00e7lar\u0131:<\/strong><\/p>\n<ul>\n<li><strong>Veri Kaynaklar\u0131n\u0131 Kullanma:<\/strong> Mod\u00fcller i\u00e7inde veya k\u00f6k seviyede, <code>data<\/code> kaynaklar\u0131n\u0131 kullanarak mevcut kaynaklar\u0131n (\u00f6rne\u011fin, bir AMI veya ba\u015fka bir VPC) bilgilerini \u00e7ekebilir ve bunlar\u0131 <code>terraform.workspace<\/code>'e g\u00f6re filtreleyebilirsiniz. Bu, ortamlar aras\u0131 farkl\u0131 ID'lere sahip kaynaklar\u0131 y\u00f6netirken \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/li>\n<li><strong><code>for_each<\/code> ve Workspaces:<\/strong> <code>for_each<\/code> d\u00f6ng\u00fcleriyle birlikte <code>terraform.workspace<\/code> de\u011fi\u015fkenini kullanarak, bir kayna\u011f\u0131n belirli bir ortamda olup olmayaca\u011f\u0131n\u0131 veya ka\u00e7 tane olaca\u011f\u0131n\u0131 ko\u015fullu olarak belirleyebilirsiniz. \u00d6rne\u011fin, \u00fcretim ortam\u0131nda 3 sunucu, geli\u015ftirme ortam\u0131nda 1 sunucu olu\u015fturmak gibi.<\/li>\n<li><strong>K\u00f6k Mod\u00fcl Yap\u0131s\u0131:<\/strong> Workspaces kulland\u0131\u011f\u0131n\u0131zda, genellikle tek bir k\u00f6k mod\u00fcl\u00fcn\u00fcz olur ve t\u00fcm mod\u00fcl \u00e7a\u011fr\u0131lar\u0131 ile ortam de\u011fi\u015fkeni mant\u0131\u011f\u0131 burada yer al\u0131r. Bu, genel olarak daha yal\u0131n ve bak\u0131m\u0131 kolay bir yap\u0131 sa\u011flar.<\/li>\n<\/ul>\n<p>Terraform Workspaces ve mod\u00fcllerin birle\u015fimi, \u00f6zellikle b\u00fcy\u00fck ve \u00e7ok ortaml\u0131 projelerde altyap\u0131 y\u00f6netimini radikal bir \u015fekilde iyile\u015ftiren, \u00f6l\u00e7eklenebilir ve s\u00fcrd\u00fcr\u00fclebilir bir \u00e7\u00f6z\u00fcm sunar. Bu kombinasyonla, altyap\u0131n\u0131z\u0131 tek bir, anla\u015f\u0131l\u0131r ve bak\u0131m\u0131 kolay kod taban\u0131 \u00fczerinden y\u00f6netebilir, b\u00f6ylece geli\u015ftirme h\u0131z\u0131n\u0131z\u0131 art\u0131rabilir ve operasyonel hatalar\u0131 azaltabilirsiniz.<\/p>\n<h2>Pratik \u0130pu\u00e7lar\u0131 ve En \u0130yi Uygulamalar: Daha Verimli \u00c7al\u0131\u015fmak \u0130\u00e7in Neler Yapmal\u0131?<\/h2>\n<p>Terraform Workspaces'i etkili bir \u015fekilde kullanmak, sadece komutlar\u0131 bilmekten \u00f6te, belirli pratik ipu\u00e7lar\u0131n\u0131 ve en iyi uygulamalar\u0131 benimsemeyi gerektirir. Bu yakla\u015f\u0131mlar, \u00f6zellikle b\u00fcy\u00fck ekiplerde ve karma\u015f\u0131k altyap\u0131larda kar\u015f\u0131la\u015f\u0131lan potansiyel sorunlar\u0131 \u00f6nlemeye yard\u0131mc\u0131 olur ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi daha g\u00fcvenli ve verimli hale getirir.<\/p>\n<h3>1. Tutarl\u0131 Adland\u0131rma Kurallar\u0131 Benimseyin<\/h3>\n<p>Workspaces'leriniz i\u00e7in tutarl\u0131 ve a\u00e7\u0131klay\u0131c\u0131 adland\u0131rma kurallar\u0131 kullanmak, karma\u015f\u0131kl\u0131\u011f\u0131 azaltman\u0131n anahtar\u0131d\u0131r. \u00d6rne\u011fin, <code>dev<\/code>, <code>staging<\/code>, <code>prod<\/code> gibi standart ortam isimlerinin yan\u0131 s\u0131ra, e\u011fer feature branch'ler i\u00e7in ge\u00e7ici \u00e7al\u0131\u015fma alanlar\u0131 olu\u015fturuyorsan\u0131z, <code>feature-new-login<\/code> gibi anlaml\u0131 isimler kullan\u0131n. Bu, hangi \u00e7al\u0131\u015fma alan\u0131n\u0131n ne i\u00e7in kullan\u0131ld\u0131\u011f\u0131n\u0131 anlamay\u0131 kolayla\u015ft\u0131r\u0131r ve yanl\u0131\u015fl\u0131kla yanl\u0131\u015f ortama da\u011f\u0131t\u0131m yapma riskini azalt\u0131r.<\/p>\n<pre><code>\n# K\u00f6t\u00fc \u00f6rnek: generic-workspace-1\nterraform workspace new generic-workspace-1\n\n# \u0130yi \u00f6rnek: environment-name veya feature-branch-name\nterraform workspace new dev\nterraform workspace new feature-payment-gateway\n  <\/pre>\n<p><\/code><\/p>\n<h3>2. Uzak Backend ve Durum Kilitleme Olmazsa Olmazd\u0131r<\/h3>\n<p>Birden fazla kullan\u0131c\u0131n\u0131n veya CI\/CD s\u00fcre\u00e7lerinin ayn\u0131 Terraform yap\u0131land\u0131rmas\u0131 \u00fczerinde \u00e7al\u0131\u015faca\u011f\u0131 her senaryoda, uzak bir backend (\u00f6rne\u011fin AWS S3, Azure Blob Storage, Google Cloud Storage veya HashiCorp Consul\/Terraform Cloud) kullanmak zorunludur. Uzak backend'ler, durum dosyalar\u0131n\u0131z\u0131n merkezi ve g\u00fcvenli bir \u015fekilde saklanmas\u0131n\u0131 sa\u011flar. Ayr\u0131ca, durum kilitleme (state locking) mekanizmalar\u0131n\u0131 da etkinle\u015ftirirler. Bu, birden fazla Terraform i\u015fleminin ayn\u0131 anda durum dosyas\u0131n\u0131 de\u011fi\u015ftirmeye \u00e7al\u0131\u015fmas\u0131n\u0131 engelleyerek, durum dosyas\u0131 bozulmalar\u0131n\u0131 ve yar\u0131\u015f ko\u015fullar\u0131n\u0131 (race conditions) \u00f6nler.<\/p>\n<pre><code>\n\/\/ backend.tf veya versions.tf i\u00e7inde\nterraform {\n  backend \"s3\" {\n    bucket         = \"my-terraform-state-bucket\"\n    key            = \"global\/terraform.tfstate\" \/\/ Genel backend anahtar\u0131, workspace'ler i\u00e7in bir prefix ile birlikte kullan\u0131lacak\n    region         = \"us-east-1\"\n    encrypt        = true\n    dynamodb_table = \"my-terraform-state-lock\"\n  }\n}\n  <\/pre>\n<p><\/code><\/p>\n<p><code>key<\/code> i\u00e7inde <code>multi-env\/terraform.tfstate<\/code> gibi bir genel prefix kullanmak, ayn\u0131 S3 bucket'\u0131 i\u00e7inde farkl\u0131 Workspaces'lerin durum dosyalar\u0131n\u0131 d\u00fczenli tutmak i\u00e7in iyi bir y\u00f6ntemdir. Terraform, her Workspace i\u00e7in bu anahtar\u0131n sonuna bir tak\u0131 ekler.<\/p>\n<h3>3. Ortama \u00d6zel De\u011fi\u015fkenleri Ak\u0131ll\u0131ca Y\u00f6netin<\/h3>\n<p><code>terraform.workspace<\/code> de\u011fi\u015fkeni, ortama \u00f6zel yap\u0131land\u0131rmalar\u0131 y\u00f6netmek i\u00e7in \u00e7ok g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. De\u011fi\u015fkenlerinizi bir harita (map) olarak tan\u0131mlayarak ve bu haritadan <code>terraform.workspace<\/code> anahtar\u0131yla de\u011fer \u00e7ekerek kod tekrar\u0131n\u0131 en aza indirebilirsiniz. Alternatif olarak, her ortam i\u00e7in ayr\u0131 <code>.tfvars<\/code> dosyalar\u0131 (\u00f6rn. <code>dev.tfvars<\/code>, <code>prod.tfvars<\/code>) olu\u015fturabilir ve bunlar\u0131 <code>terraform apply -var-file=prod.tfvars<\/code> komutuyla kullanabilirsiniz. Ancak, Workspaces yakla\u015f\u0131m\u0131, de\u011fi\u015fkenlerin do\u011frudan kod i\u00e7inde dinamikle\u015fmesini sa\u011flad\u0131\u011f\u0131 i\u00e7in genellikle daha zariftir.<\/p>\n<pre><code>\n\/\/ variables.tf\nvariable \"instance_count\" {\n  type = map(number)\n  default = {\n    \"dev\"  = 1\n    \"staging\" = 2\n    \"prod\" = 4\n  }\n}\n\n\/\/ main.tf\nresource \"aws_instance\" \"web\" {\n  count = var.instance_count[terraform.workspace]\n  \/\/ ... di\u011fer \u00f6zellikler\n}\n  <\/pre>\n<p><\/code><\/p>\n<h3>4. CI\/CD Entegrasyonu ve Otomasyon<\/h3>\n<p>Terraform Workspaces'in ger\u00e7ek potansiyeli, CI\/CD boru hatlar\u0131yla entegre edildi\u011finde ortaya \u00e7\u0131kar. Da\u011f\u0131t\u0131m boru hatlar\u0131n\u0131z, belirli bir branch'e yap\u0131lan push'lar veya manuel tetiklemelerle otomatik olarak ilgili \u00e7al\u0131\u015fma alan\u0131n\u0131 se\u00e7meli, <code>terraform plan<\/code> ve <code>terraform apply<\/code> komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmal\u0131d\u0131r. Bu, h\u0131zl\u0131, tutarl\u0131 ve hatas\u0131z da\u011f\u0131t\u0131mlar sa\u011flar.<\/p>\n<pre><code>\n# GitLab CI\/CD \u00f6rne\u011fi (s\u00f6zde kod)\ndeploy-to-dev:\n  stage: deploy\n  script:\n    - terraform init\n    - terraform workspace select dev || terraform workspace new dev\n    - terraform plan\n    - terraform apply --auto-approve\n  only:\n    - develop\n\ndeploy-to-prod:\n  stage: deploy\n  script:\n    - terraform init\n    - terraform workspace select prod\n    - terraform plan\n    - terraform apply --auto-approve\n  only:\n    - master\n  when: manual # \u00dcretim da\u011f\u0131t\u0131mlar\u0131 i\u00e7in manuel onay isteyebiliriz\n  <\/pre>\n<p><\/code><\/p>\n<h3>5. G\u00fcvenlik ve Eri\u015fim Kontrol\u00fc<\/h3>\n<p>Farkl\u0131 Workspaces'lerin farkl\u0131 hassasiyet seviyelerine sahip olabilece\u011fi unutulmamal\u0131d\u0131r. \u00d6zellikle \u00fcretim ortam\u0131 Workspaces'i i\u00e7in daha s\u0131k\u0131 eri\u015fim kontrolleri uygulay\u0131n. AWS IAM politikalar\u0131 veya di\u011fer bulut sa\u011flay\u0131c\u0131n\u0131n eri\u015fim y\u00f6netimi ara\u00e7lar\u0131 ile, yaln\u0131zca yetkili kullan\u0131c\u0131lar\u0131n veya hizmet prensiplerinin (service principles) belirli Workspaces'leri de\u011fi\u015ftirmesine izin verin. Durum dosyalar\u0131n\u0131n tutuldu\u011fu S3 bucket'lar\u0131na veya di\u011fer uzak backend'lere de uygun k\u0131s\u0131tlamalar uygulay\u0131n.<\/p>\n<h3>6. Ne Zaman Workspaces Kullanmamal\u0131s\u0131n\u0131z? (Alternatifler)<\/h3>\n<p>Terraform Workspaces \u00e7ok kullan\u0131\u015fl\u0131 olsa da, her zaman en iyi \u00e7\u00f6z\u00fcm de\u011fildir. Tamamen ba\u011f\u0131ms\u0131z uygulamalar veya ekipler i\u00e7in, ayr\u0131 Terraform k\u00f6k mod\u00fclleri ve dizin yap\u0131lar\u0131 daha uygun olabilir. \u00d6rne\u011fin, farkl\u0131 departmanlar\u0131n y\u00f6netti\u011fi ve hi\u00e7bir zaman birbiriyle \u00e7ak\u0131\u015fmayan iki tamamen ayr\u0131 uygulama varsa, her bir uygulama i\u00e7in ayr\u0131 bir Terraform projesi ve dolay\u0131s\u0131yla ayr\u0131 bir k\u00f6k dizin olu\u015fturmak daha mant\u0131kl\u0131d\u0131r. Workspaces, ayn\u0131 temel kod taban\u0131ndan t\u00fcretilen, ancak parametrelerle \u00f6zelle\u015ftirilen benzer altyap\u0131 da\u011f\u0131t\u0131mlar\u0131 i\u00e7in idealdir.<\/p>\n<div class=\"expert-tip\">\n    Uzman \u0130pucu: \u00c7ok say\u0131da benzer ortam\u0131n\u0131z varsa (\u00f6rne\u011fin her proje i\u00e7in ayr\u0131 bir dev ortam\u0131), <code>terraform.workspace<\/code> de\u011fi\u015fkenini ve dinamik de\u011fi\u015fken yap\u0131land\u0131rmas\u0131n\u0131 kullanarak kod tekrar\u0131n\u0131 minimumda tutun. Ayr\u0131ca, <code>terraform.tfvars<\/code> dosyalar\u0131 yerine, <code>env\/dev.tfvars<\/code> veya <code>env\/prod.tfvars<\/code> gibi isimlendirilmi\u015f ve <code>-var-file<\/code> ile \u00e7a\u011fr\u0131lan dosyalar\u0131 kullanmak da de\u011fi\u015fken y\u00f6netimini daha okunabilir hale getirebilir.\n  <\/div>\n<h2>Sonu\u00e7: Gelece\u011fin Altyap\u0131s\u0131n\u0131 Bug\u00fcn \u0130n\u015fa Edin<\/h2>\n<p>Altyap\u0131y\u0131 kod olarak (IaC) yakla\u015f\u0131m\u0131, modern DevOps pratiklerinin temel ta\u015flar\u0131ndan biridir ve Terraform bu alanda sekt\u00f6r lideri bir ara\u00e7t\u0131r. \u00d6zellikle \u00e7oklu ortam da\u011f\u0131t\u0131mlar\u0131n\u0131n y\u00f6netimi s\u00f6z konusu oldu\u011funda, Terraform Workspaces, karma\u015f\u0131kl\u0131\u011f\u0131 azaltan, tutarl\u0131l\u0131\u011f\u0131 art\u0131ran ve operasyonel verimlili\u011fi maksimize eden g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcmd\u00fcr. Bu makale boyunca, Workspaces'in ne oldu\u011funu, neden gerekli oldu\u011funu, pratik bir \u00f6rnekle nas\u0131l uygulanaca\u011f\u0131n\u0131 ve b\u00fcy\u00fck bir \u015firketin bu arac\u0131 nas\u0131l kulland\u0131\u011f\u0131n\u0131 ad\u0131m ad\u0131m inceledik. G\u00f6rd\u00fck ki, tek bir kod taban\u0131n\u0131 kullanarak geli\u015ftirme, test, haz\u0131rl\u0131k ve \u00fcretim gibi farkl\u0131 ortamlar i\u00e7in \u00f6zelle\u015ftirilmi\u015f altyap\u0131lar\u0131 kolayca da\u011f\u0131tabilir ve y\u00f6netebiliriz.<\/p>\n<p>Terraform Workspaces, kod tekrar\u0131n\u0131 \u00f6nleyerek, bak\u0131m maliyetlerini d\u00fc\u015f\u00fcr\u00fcr ve insan hatas\u0131 riskini minimize eder. Ortamlar aras\u0131 tutars\u0131zl\u0131klar\u0131 ortadan kald\u0131rarak yaz\u0131l\u0131m kalitesini art\u0131r\u0131r ve ekiplerin altyap\u0131 y\u00f6netimi yerine yenilik\u00e7i \u00f6zellikler geli\u015ftirmeye odaklanmas\u0131n\u0131 sa\u011flar. CI\/CD boru hatlar\u0131 ile entegrasyonu sayesinde, altyap\u0131 da\u011f\u0131t\u0131mlar\u0131n\u0131z\u0131 otomatikle\u015ftirerek daha h\u0131zl\u0131 ve g\u00fcvenli bir geli\u015ftirme ya\u015fam d\u00f6ng\u00fcs\u00fc olu\u015fturabilirsiniz. Unutmay\u0131n ki, ba\u015far\u0131l\u0131 bir \u00e7oklu ortam stratejisi, sadece ara\u00e7lar\u0131 do\u011fru kullanmakla kalmaz, ayn\u0131 zamanda tutarl\u0131 adland\u0131rma kurallar\u0131, merkezi durum y\u00f6netimi ve s\u0131k\u0131 eri\u015fim kontrol\u00fc gibi en iyi pratikleri de beraberinde getirir.<\/p>\n<p>Bug\u00fcn, gelece\u011fin \u00f6l\u00e7eklenebilir, g\u00fcvenilir ve esnek altyap\u0131lar\u0131n\u0131 in\u015fa etmek i\u00e7in Terraform Workspaces'i kullanmaya ba\u015flayarak, dijital d\u00f6n\u00fc\u015f\u00fcm yolculu\u011funuzda \u00f6nemli bir ad\u0131m atabilirsiniz. Bu ara\u00e7, hem k\u00fc\u00e7\u00fck start-up'lar hem de b\u00fcy\u00fck kurumsal \u015firketler i\u00e7in altyap\u0131 y\u00f6netimini basitle\u015ftiren ve h\u0131zland\u0131ran temel bir bile\u015fendir. Unutmay\u0131n, iyi y\u00f6netilen bir altyap\u0131, ba\u015far\u0131l\u0131 bir yaz\u0131l\u0131m \u00fcr\u00fcn\u00fcn\u00fcn temelini olu\u015fturur.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<ol>\n<li>\n      <strong>Workspaces m\u0131, yoksa ayr\u0131 klas\u00f6rler (k\u00f6k mod\u00fcller) mi kullanmal\u0131y\u0131m?<\/strong><\/p>\n<p>Bu, ihtiya\u00e7lar\u0131n\u0131za ba\u011fl\u0131d\u0131r. Workspaces, ayn\u0131 altyap\u0131 kodunu farkl\u0131 parametrelerle farkl\u0131 ortamlarda da\u011f\u0131tmak istedi\u011finizde idealdir. Kod tekrar\u0131n\u0131 \u00f6nler ve merkezi bir y\u00f6netim sa\u011flar. Ayr\u0131 klas\u00f6rler ise, altyap\u0131lar\u0131n\u0131z tamamen ba\u011f\u0131ms\u0131z oldu\u011funda, \u00e7ok az ortak noktaya sahip oldu\u011funda veya farkl\u0131 tak\u0131mlar taraf\u0131ndan ayr\u0131 ayr\u0131 y\u00f6netildi\u011finde daha uygun olabilir. Genellikle, ayn\u0131 uygulaman\u0131n farkl\u0131 ortamlar\u0131 i\u00e7in Workspaces tercih edilirken, tamamen farkl\u0131 uygulamalar i\u00e7in ayr\u0131 klas\u00f6rler kullan\u0131l\u0131r.<\/p>\n<\/li>\n<li>\n      <strong>Workspaces g\u00fcvenli mi? \u00d6zellikle \u00fcretim ortam\u0131 i\u00e7in?<\/strong><\/p>\n<p>Evet, Workspaces do\u011fru kullan\u0131ld\u0131\u011f\u0131nda g\u00fcvenlidir. Her Workspace'in kendi durum dosyas\u0131 ayr\u0131 tutuldu\u011fu i\u00e7in, bir ortamdaki de\u011fi\u015fiklikler di\u011ferini do\u011frudan etkilemez. G\u00fcvenli\u011fi art\u0131rmak i\u00e7in uzak bir backend (S3, Azure Blob, Terraform Cloud) kullanmak, durum kilitlemeyi etkinle\u015ftirmek ve \u00f6zellikle \u00fcretim ortam\u0131 Workspaces'i i\u00e7in s\u0131k\u0131 IAM\/eri\u015fim kontrol politikalar\u0131 uygulamak \u00e7ok \u00f6nemlidir. Hassas verileri (\u015fifreler, API anahtarlar\u0131) do\u011frudan kodda tutmak yerine, AWS Secrets Manager, HashiCorp Vault gibi g\u00fcvenli depolama hizmetleri kullanmal\u0131s\u0131n\u0131z.<\/p>\n<\/li>\n<li>\n      <strong>Her ortam i\u00e7in ayr\u0131 <code>main.tf<\/code> olu\u015fturmal\u0131 m\u0131y\u0131m?<\/strong><\/p>\n<p>Hay\u0131r, Workspaces kullanman\u0131n ana amac\u0131 kod tekrar\u0131n\u0131 \u00f6nlemektir. Tek bir <code>main.tf<\/code> (veya mod\u00fcller arac\u0131l\u0131\u011f\u0131yla) dosyas\u0131 olu\u015fturmal\u0131 ve <code>terraform.workspace<\/code> de\u011fi\u015fkenini veya haritalanm\u0131\u015f de\u011fi\u015fkenleri kullanarak ortama \u00f6zg\u00fc farkl\u0131l\u0131klar\u0131 bu tek dosyada dinamik olarak y\u00f6netmelisiniz. Bu, altyap\u0131 kodunuzun daha temiz, daha bak\u0131m\u0131 kolay ve tutarl\u0131 olmas\u0131n\u0131 sa\u011flar.<\/p>\n<\/li>\n<li>\n      <strong>CI\/CD ile Workspaces nas\u0131l entegre edilir?<\/strong><\/p>\n<p>CI\/CD ara\u00e7lar\u0131n\u0131z\u0131n (Jenkins, GitLab CI, GitHub Actions, Azure DevOps vb.) da\u011f\u0131t\u0131m a\u015famalar\u0131nda <code>terraform init<\/code>, <code>terraform workspace select [ortam_ad\u0131]<\/code>, <code>terraform plan<\/code> ve <code>terraform apply<\/code> komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmas\u0131 gerekir. Genellikle, farkl\u0131 branch'ler veya manuel tetikleyiciler, ilgili ortam\u0131n Workspace'ine da\u011f\u0131t\u0131m\u0131 tetikler. \u00d6rne\u011fin, <code>develop<\/code> branch'ine push, <code>dev<\/code> Workspace'ine, <code>main<\/code>\/<code>master<\/code> branch'ine push ise <code>prod<\/code> Workspace'ine da\u011f\u0131t\u0131m\u0131 tetikleyebilir.<\/p>\n<\/li>\n<li>\n      <strong>\u00c7ok fazla Workspace performans\u0131 etkiler mi?<\/strong><\/p>\n<p>Terraform'un Workspaces \u00f6zelli\u011fi genellikle performans\u0131 do\u011frudan olumsuz etkilemez, \u00e7\u00fcnk\u00fc her Workspace kendi durum dosyas\u0131n\u0131 y\u00f6netir ve kaynaklar\u0131 ba\u011f\u0131ms\u0131z olarak planlar\/uygular. Ancak, \u00e7ok say\u0131da karma\u015f\u0131k Workspace'i ayn\u0131 anda veya s\u0131k s\u0131k de\u011fi\u015ftirmek, genel Terraform i\u015flemlerinin (plan, apply) s\u00fcresini dolayl\u0131 olarak etkileyebilir. \u00d6nemli olan, Workspaces'leri mant\u0131kl\u0131 bir \u015fekilde grupland\u0131rmak ve gereksiz Workspaces'leri temizlemektir. Ayr\u0131ca, b\u00fcy\u00fck ve karma\u015f\u0131k altyap\u0131lar i\u00e7in Terraform Cloud\/Enterprise gibi daha \u00f6l\u00e7eklenebilir \u00e7\u00f6z\u00fcmler d\u00fc\u015f\u00fcnmek de performans\u0131 optimize etmeye yard\u0131mc\u0131 olabilir.<\/p>\n<\/li>\n<\/ol>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Terraform Workspaces, altyap\u0131 y\u00f6netiminde \u00e7oklu ortam da\u011f\u0131t\u0131mlar\u0131n\u0131 nas\u0131l basitle\u015ftirir? Geli\u015ftirme, test ve \u00fcretim ortamlar\u0131 aras\u0131ndaki karma\u015f\u0131kl\u0131\u011f\u0131 gidererek verimli&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-33731","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 Workspaces ile \u00c7oklu Ortam Da\u011f\u0131t\u0131mlar\u0131 Rehberi<\/title>\n<meta name=\"description\" content=\"Terraform Workspaces, altyap\u0131 y\u00f6netiminde \u00e7oklu ortam da\u011f\u0131t\u0131mlar\u0131n\u0131 nas\u0131l basitle\u015ftirir? Geli\u015ftirme, test ve \u00fcretim ortamlar\u0131 aras\u0131ndaki karma\u015f\u0131kl\u0131\u011f\u0131 gidererek verimli ve g\u00fcvenilir da\u011f\u0131t\u0131mlar i\u00e7in kapsaml\u0131 bir rehber sunuyoruz.\" \/>\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-workspaces-ile-coklu-ortam-dagitimlari-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Terraform Workspaces ile \u00c7oklu Ortam Da\u011f\u0131t\u0131mlar\u0131 Rehberi\" \/>\n<meta property=\"og:description\" content=\"Terraform Workspaces, altyap\u0131 y\u00f6netiminde \u00e7oklu ortam da\u011f\u0131t\u0131mlar\u0131n\u0131 nas\u0131l basitle\u015ftirir? Geli\u015ftirme, test ve \u00fcretim ortamlar\u0131 aras\u0131ndaki karma\u015f\u0131kl\u0131\u011f\u0131 gidererek verimli ve g\u00fcvenilir da\u011f\u0131t\u0131mlar i\u00e7in kapsaml\u0131 bir rehber sunuyoruz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/terraform-workspaces-ile-coklu-ortam-dagitimlari-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-06T08:01:14+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=\"29 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-workspaces-ile-coklu-ortam-dagitimlari-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-workspaces-ile-coklu-ortam-dagitimlari-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Terraform Workspaces ile \u00c7oklu Ortam Da\u011f\u0131t\u0131mlar\u0131 Rehberi\",\"datePublished\":\"2025-11-06T08:01:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-workspaces-ile-coklu-ortam-dagitimlari-rehberi\/\"},\"wordCount\":4937,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/terraform-workspaces-ile-coklu-ortam-dagitimlari-rehberi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-workspaces-ile-coklu-ortam-dagitimlari-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/terraform-workspaces-ile-coklu-ortam-dagitimlari-rehberi\/\",\"name\":\"Terraform Workspaces ile \u00c7oklu Ortam Da\u011f\u0131t\u0131mlar\u0131 Rehberi\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-06T08:01:14+00:00\",\"description\":\"Terraform Workspaces, altyap\u0131 y\u00f6netiminde \u00e7oklu ortam da\u011f\u0131t\u0131mlar\u0131n\u0131 nas\u0131l basitle\u015ftirir? Geli\u015ftirme, test ve \u00fcretim ortamlar\u0131 aras\u0131ndaki karma\u015f\u0131kl\u0131\u011f\u0131 gidererek verimli ve g\u00fcvenilir da\u011f\u0131t\u0131mlar i\u00e7in kapsaml\u0131 bir rehber sunuyoruz.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-workspaces-ile-coklu-ortam-dagitimlari-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/terraform-workspaces-ile-coklu-ortam-dagitimlari-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-workspaces-ile-coklu-ortam-dagitimlari-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Terraform Workspaces ile \u00c7oklu Ortam Da\u011f\u0131t\u0131mlar\u0131 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 Workspaces ile \u00c7oklu Ortam Da\u011f\u0131t\u0131mlar\u0131 Rehberi","description":"Terraform Workspaces, altyap\u0131 y\u00f6netiminde \u00e7oklu ortam da\u011f\u0131t\u0131mlar\u0131n\u0131 nas\u0131l basitle\u015ftirir? Geli\u015ftirme, test ve \u00fcretim ortamlar\u0131 aras\u0131ndaki karma\u015f\u0131kl\u0131\u011f\u0131 gidererek verimli ve g\u00fcvenilir da\u011f\u0131t\u0131mlar i\u00e7in kapsaml\u0131 bir rehber sunuyoruz.","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-workspaces-ile-coklu-ortam-dagitimlari-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Terraform Workspaces ile \u00c7oklu Ortam Da\u011f\u0131t\u0131mlar\u0131 Rehberi","og_description":"Terraform Workspaces, altyap\u0131 y\u00f6netiminde \u00e7oklu ortam da\u011f\u0131t\u0131mlar\u0131n\u0131 nas\u0131l basitle\u015ftirir? Geli\u015ftirme, test ve \u00fcretim ortamlar\u0131 aras\u0131ndaki karma\u015f\u0131kl\u0131\u011f\u0131 gidererek verimli ve g\u00fcvenilir da\u011f\u0131t\u0131mlar i\u00e7in kapsaml\u0131 bir rehber sunuyoruz.","og_url":"https:\/\/fatihsoysal.com\/blog\/terraform-workspaces-ile-coklu-ortam-dagitimlari-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-06T08:01:14+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"29 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/terraform-workspaces-ile-coklu-ortam-dagitimlari-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/terraform-workspaces-ile-coklu-ortam-dagitimlari-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Terraform Workspaces ile \u00c7oklu Ortam Da\u011f\u0131t\u0131mlar\u0131 Rehberi","datePublished":"2025-11-06T08:01:14+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/terraform-workspaces-ile-coklu-ortam-dagitimlari-rehberi\/"},"wordCount":4937,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/terraform-workspaces-ile-coklu-ortam-dagitimlari-rehberi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/terraform-workspaces-ile-coklu-ortam-dagitimlari-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/terraform-workspaces-ile-coklu-ortam-dagitimlari-rehberi\/","name":"Terraform Workspaces ile \u00c7oklu Ortam Da\u011f\u0131t\u0131mlar\u0131 Rehberi","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-06T08:01:14+00:00","description":"Terraform Workspaces, altyap\u0131 y\u00f6netiminde \u00e7oklu ortam da\u011f\u0131t\u0131mlar\u0131n\u0131 nas\u0131l basitle\u015ftirir? Geli\u015ftirme, test ve \u00fcretim ortamlar\u0131 aras\u0131ndaki karma\u015f\u0131kl\u0131\u011f\u0131 gidererek verimli ve g\u00fcvenilir da\u011f\u0131t\u0131mlar i\u00e7in kapsaml\u0131 bir rehber sunuyoruz.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/terraform-workspaces-ile-coklu-ortam-dagitimlari-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/terraform-workspaces-ile-coklu-ortam-dagitimlari-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/terraform-workspaces-ile-coklu-ortam-dagitimlari-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Terraform Workspaces ile \u00c7oklu Ortam Da\u011f\u0131t\u0131mlar\u0131 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\/33731","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=33731"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33731\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33731"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33731"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33731"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}