{"id":34163,"date":"2025-11-12T04:01:11","date_gmt":"2025-11-12T01:01:11","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/the-curious-case-of-terraform-workspaces-ortamlari-nasil-yonetirsiniz\/"},"modified":"2025-11-12T04:01:11","modified_gmt":"2025-11-12T01:01:11","slug":"the-curious-case-of-terraform-workspaces-ortamlari-nasil-yonetirsiniz","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/the-curious-case-of-terraform-workspaces-ortamlari-nasil-yonetirsiniz\/","title":{"rendered":"The Curious Case of Terraform Workspaces: Ortamlar\u0131 Nas\u0131l Y\u00f6netirsiniz?"},"content":{"rendered":"<style>\n    body {\n        font-family: Arial, sans-serif;\n        line-height: 1.6;\n        color: #333;\n        max-width: 900px;\n        margin: 0 auto;\n        padding: 20px;\n    }\n    h2, h3 {\n        color: #2c3e50;\n        margin-top: 30px;\n        margin-bottom: 15px;\n    }\n    h2 {\n        border-bottom: 2px solid #3498db;\n        padding-bottom: 5px;\n    }\n    h3 {\n        color: #34495e;\n    }\n    p {\n        margin-bottom: 15px;\n    }\n    ul, ol {\n        margin-bottom: 15px;\n        margin-left: 20px;\n    }\n    li {\n        margin-bottom: 5px;\n    }\n    pre {\n        background-color: #ecf0f1;\n        border: 1px solid #ddd;\n        padding: 15px;\n        border-radius: 5px;\n        overflow-x: auto;\n        font-size: 0.9em;\n        margin-bottom: 20px;\n    }\n    code {\n        font-family: 'Courier New', Courier, monospace;\n        color: #c0392b;\n    }\n    pre code {\n        color: #2c3e50;\n    }\n    table {\n        width: 100%;\n        border-collapse: collapse;\n        margin-bottom: 20px;\n    }\n    th, td {\n        border: 1px solid #ddd;\n        padding: 8px;\n        text-align: left;\n    }\n    th {\n        background-color: #f2f2f2;\n        font-weight: bold;\n    }\n    .expert-tip {\n        background-color: #e8f5e9;\n        border-left: 5px solid #4caf50;\n        padding: 15px;\n        margin-top: 20px;\n        margin-bottom: 20px;\n        border-radius: 3px;\n    }\n    .expert-tip strong {\n        color: #2e7d32;\n    }<\/p>\n<p>    \/* Mobil uyumluluk i\u00e7in medya sorgular\u0131 *\/\n    @media (max-width: 768px) {\n        body {\n            padding: 10px;\n        }\n        pre {\n            white-space: pre-wrap;\n            word-wrap: break-word;\n        }\n        table, thead, tbody, th, td, tr {\n            display: block;\n        }\n        thead tr {\n            position: absolute;\n            top: -9999px;\n            left: -9999px;\n        }\n        tr {\n            border: 1px solid #ccc;\n            margin-bottom: 10px;\n        }\n        td {\n            border: none;\n            border-bottom: 1px solid #eee;\n            position: relative;\n            padding-left: 50%;\n            text-align: right;\n        }\n        td:before {\n            position: absolute;\n            top: 6px;\n            left: 6px;\n            width: 45%;\n            padding-right: 10px;\n            white-space: nowrap;\n            text-align: left;\n            font-weight: bold;\n        }\n        td:nth-of-type(1):before { content: \"Komut\"; }\n        td:nth-of-type(2):before { content: \"A\u00e7\u0131klama\"; }\n    }\n<\/style>\n<p>Terraform Workspaces ile \u00e7oklu ortamlar\u0131 (geli\u015ftirme, test, \u00fcretim) nas\u0131l kolayca y\u00f6netebilece\u011finizi merak m\u0131 ediyorsunuz? Bu kapsaml\u0131 rehberde, Workspaces&#8217;in temelinden ileri d\u00fczey kullan\u0131m\u0131na, ger\u00e7ek d\u00fcnya senaryolar\u0131ndan en iyi pratiklere kadar her \u015feyi ke\u015ffedin. Art\u0131k ortam y\u00f6netimindeki karma\u015f\u0131kl\u0131klar tarih olacak!<\/p>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde, ayn\u0131 altyap\u0131 kodunun farkl\u0131 ortamlarda (geli\u015ftirme, test, haz\u0131rl\u0131k, \u00fcretim gibi) da\u011f\u0131t\u0131lmas\u0131 olduk\u00e7a yayg\u0131n bir gerekliliktir. Ancak, bu durum beraberinde \u00f6nemli bir zorlu\u011fu getirir: Ortamlar aras\u0131nda hem yap\u0131sal benzerlikler bulunur hem de IP adresleri, kaynak boyutlar\u0131, g\u00fcvenlik gruplar\u0131 gibi kritik farkl\u0131l\u0131klar ortaya \u00e7\u0131kar. Bu farkl\u0131l\u0131klar\u0131 y\u00f6netmek, genellikle karma\u015f\u0131k konfig\u00fcrasyon dosyalar\u0131na, kopyala-yap\u0131\u015ft\u0131r hatalar\u0131na ve manuel m\u00fcdahalelere yol a\u00e7abilir. \u0130\u015fte tam da bu noktada, Terraform Workspaces sahneye \u00e7\u0131karak bu karma\u015f\u0131kl\u0131\u011f\u0131 sadele\u015ftiren g\u00fc\u00e7l\u00fc bir ara\u00e7 olarak kar\u015f\u0131m\u0131za \u00e7\u0131kar.<\/p>\n<p>Terraform Workspaces, temel olarak, ayn\u0131 Terraform konfig\u00fcrasyon dosyas\u0131 setini kullanarak birden fazla, ba\u011f\u0131ms\u0131z Terraform state dosyas\u0131 y\u00f6netmenizi sa\u011flar. Her bir workspace, kendi state dosyas\u0131na sahip oldu\u011fu i\u00e7in, bir ortamda yapt\u0131\u011f\u0131n\u0131z de\u011fi\u015fiklikler ba\u015fka bir ortam\u0131 etkilemez. \u00d6rne\u011fin, geli\u015ftirme ortam\u0131nda bir deneme yaparken, \u00fcretim ortam\u0131n\u0131z\u0131n istikrar\u0131ndan endi\u015fe etmenize gerek kalmaz. Bu, \u00f6zellikle s\u00fcrekli entegrasyon ve s\u00fcrekli da\u011f\u0131t\u0131m (CI\/CD) boru hatlar\u0131nda b\u00fcy\u00fck esneklik ve g\u00fcvenlik sa\u011flar. Genellikle &#8220;ortam&#8221; veya &#8220;evre&#8221; kavramlar\u0131yla kar\u0131\u015ft\u0131r\u0131lsa da, Workspaces asl\u0131nda bir altyap\u0131 kodunun birden fazla ayr\u0131 durumunu y\u00f6netmenin bir yoludur. Bu sayede, ayn\u0131 kod taban\u0131n\u0131 korurken, farkl\u0131 ortamlar\u0131n kendine \u00f6zg\u00fc gereksinimlerini kar\u015f\u0131layabilirsiniz.<\/p>\n<p>Peki, Workspaces&#8217;in temel amac\u0131 nedir? Amac\u0131, ayn\u0131 Terraform konfig\u00fcrasyonuyla \u00e7al\u0131\u015f\u0131rken farkl\u0131 state dosyalar\u0131 olu\u015fturarak kaynaklar\u0131n izolasyonunu sa\u011flamakt\u0131r. Diyelim ki bir web uygulaman\u0131z var ve bu uygulaman\u0131n hem geli\u015ftirme hem de \u00fcretim ortam\u0131 i\u00e7in ayn\u0131 EC2 sunucusuna, ayn\u0131 veritaban\u0131 kurulumuna ve ayn\u0131 a\u011f yap\u0131land\u0131rmas\u0131na ihtiyac\u0131 var. Ancak, geli\u015ftirme ortam\u0131ndaki sunucunun daha k\u00fc\u00e7\u00fck, veritaban\u0131n\u0131n daha ucuz olmas\u0131, \u00fcretim ortam\u0131n\u0131n ise y\u00fcksek kullan\u0131labilirlik ve performans sunmas\u0131 gerekebilir. Geleneksel yakla\u015f\u0131mla, bu iki ortam i\u00e7in ayr\u0131 ayr\u0131 Terraform dizinleri olu\u015fturup her birinde neredeyse ayn\u0131 kodu tekrarlaman\u0131z gerekebilir. Bu da kod tekrar\u0131na, bak\u0131m zorlu\u011funa ve hata riskine yol a\u00e7ar. Terraform Workspaces ise bu sorunu, tek bir kod taban\u0131 \u00fczerinden farkl\u0131 ortamlar i\u00e7in ayr\u0131 state dosyalar\u0131 olu\u015fturarak ve bu state dosyalar\u0131na \u00f6zel de\u011ferler atayarak \u00e7\u00f6zer. Bu, geli\u015ftiricilerin ve DevOps ekiplerinin daha h\u0131zl\u0131, daha g\u00fcvenli ve daha verimli \u00e7al\u0131\u015fmas\u0131na olanak tan\u0131r. K\u0131sacas\u0131, Workspaces, altyap\u0131 kodunuzu DRY (Don&#8217;t Repeat Yourself) prensibine uygun hale getirirken, ortamlar aras\u0131 izolasyonu sa\u011flamak i\u00e7in m\u00fckemmel bir mekanizma sunar.<\/p>\n<h2>Temel Kavramlar: Terraform State ve Workspaces \u0130li\u015fkisi Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h2>\n<p>Terraform Workspaces&#8217;\u0131 anlaman\u0131n anahtar\u0131, Terraform&#8217;un &#8220;state&#8221; (durum) kavram\u0131n\u0131 derinlemesine kavramaktan ge\u00e7er. Terraform state dosyas\u0131, Terraform&#8217;un y\u00f6netti\u011fi ger\u00e7ek altyap\u0131 kaynaklar\u0131n\u0131n bir haritas\u0131 ve meta verilerinin sakland\u0131\u011f\u0131 JSON format\u0131nda bir dosyad\u0131r. Bu dosya, Terraform&#8217;un &#8220;ger\u00e7ek d\u00fcnya&#8221; ile &#8220;tan\u0131mlad\u0131\u011f\u0131n\u0131z ideal durum&#8221; aras\u0131ndaki fark\u0131 anlamas\u0131n\u0131 sa\u011flar. Yani, <code>terraform plan<\/code> komutunu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, Terraform \u00f6nce state dosyas\u0131ndaki bilgileri kontrol eder, ard\u0131ndan konfig\u00fcrasyon dosyalar\u0131n\u0131zla kar\u015f\u0131la\u015ft\u0131r\u0131r ve son olarak ger\u00e7ek bulut sa\u011flay\u0131c\u0131n\u0131zdaki (AWS, Azure, GCP vb.) kaynaklar\u0131n mevcut durumunu sorgular. Bu \u00fc\u00e7 durumu kar\u015f\u0131la\u015ft\u0131rarak neyin olu\u015fturulmas\u0131, de\u011fi\u015ftirilmesi veya silinmesi gerekti\u011fine karar verir. State dosyas\u0131 bu nedenle Terraform operasyonlar\u0131n\u0131n kalbidir ve olmazsa olmaz\u0131d\u0131r.<\/p>\n<p>Varsay\u0131lan olarak, Terraform her zaman &#8220;default&#8221; ad\u0131nda bir workspace ile ba\u015flar ve t\u00fcm operasyonlar\u0131 bu workspace&#8217;in state dosyas\u0131 \u00fczerinde ger\u00e7ekle\u015ftirir. Bir <code>terraform init<\/code> yapt\u0131\u011f\u0131n\u0131zda, bulundu\u011funuz dizinde <code>.terraform<\/code> klas\u00f6r\u00fc ve genellikle <code>terraform.tfstate<\/code> ad\u0131nda bir state dosyas\u0131 olu\u015fur. E\u011fer bu state dosyas\u0131n\u0131 ba\u015fka bir yere ta\u015f\u0131mazsan\u0131z veya uzak bir depolama (remote backend) yap\u0131land\u0131rmazsan\u0131z, t\u00fcm altyap\u0131 tan\u0131m\u0131n\u0131z ve durumu bu yerel dosyada saklan\u0131r. Ancak, \u00e7oklu ortam senaryolar\u0131nda, birden fazla altyap\u0131 setini ayn\u0131 konfig\u00fcrasyon kodundan y\u00f6netmek istedi\u011finizde, &#8220;default&#8221; workspace tek ba\u015f\u0131na yeterli olmaz.<\/p>\n<p>\u0130\u015fte bu noktada Terraform Workspaces devreye girer. Workspaces, her birinin kendi ba\u011f\u0131ms\u0131z state dosyas\u0131na sahip olaca\u011f\u0131 mant\u0131ksal olarak izole edilmi\u015f ortamlar olu\u015fturman\u0131za olanak tan\u0131r. \u00d6rne\u011fin, &#8220;dev&#8221; (geli\u015ftirme), &#8220;test&#8221; ve &#8220;prod&#8221; (\u00fcretim) ad\u0131nda \u00fc\u00e7 farkl\u0131 workspace olu\u015fturabilirsiniz. Her bir workspace&#8217;i se\u00e7ti\u011finizde, Terraform o workspace&#8217;e ait state dosyas\u0131n\u0131 kullan\u0131r. B\u00f6ylece, &#8220;dev&#8221; workspace&#8217;inde <code>terraform apply<\/code> yapt\u0131\u011f\u0131n\u0131zda, sadece &#8220;dev&#8221; ortam\u0131na ait kaynaklar etkilenecek ve &#8220;prod&#8221; ortam\u0131n\u0131z tamamen g\u00fcvende kalacakt\u0131r. Bu izolasyon, \u00f6zellikle b\u00fcy\u00fck ekiplerde ve kritik altyap\u0131larda hata yapma riskini minimize eder.<\/p>\n<p>Terraform Workspaces&#8217;i y\u00f6netmek i\u00e7in birka\u00e7 temel komut bulunmaktad\u0131r:<\/p>\n<ul>\n<li>\n        <code>terraform workspace new <WORKSPACE_ADI><\/code>: Yeni bir workspace olu\u015fturur ve otomatik olarak ona ge\u00e7er. \u00d6rne\u011fin, <\/p>\n<pre><code>terraform workspace new dev<\/pre>\n<p><\/code><br \/>\n        bir \"dev\" workspace'i olu\u015fturur.\n    <\/li>\n<li>\n        <code>terraform workspace select <WORKSPACE_ADI><\/code>: Mevcut workspace'i de\u011fi\u015ftirir. Belirtilen workspace'e ge\u00e7i\u015f yapar. \u00d6rne\u011fin, <\/p>\n<pre><code>terraform workspace select prod<\/pre>\n<p><\/code><br \/>\n        ile \u00fcretim ortam\u0131na ge\u00e7ebilirsiniz.\n    <\/li>\n<li>\n        <code>terraform workspace show<\/code>: \u015eu anda hangi workspace'in aktif oldu\u011funu g\u00f6sterir. Bu, hangi ortam \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131z\u0131 do\u011frulamak i\u00e7in \u00e7ok \u00f6nemlidir.\n    <\/li>\n<li>\n        <code>terraform workspace list<\/code>: Var olan t\u00fcm workspace'leri listeler. Aktif olan workspace'in yan\u0131nda bir y\u0131ld\u0131z (*) i\u015fareti bulunur.\n    <\/li>\n<li>\n        <code>terraform workspace delete <WORKSPACE_ADI><\/code>: Belirtilen workspace'i siler. Ancak, bu workspace'e ba\u011fl\u0131 herhangi bir kaynak varsa, silme i\u015flemi ba\u015far\u0131s\u0131z olur. \u00d6nce kaynaklar\u0131 yok etmeniz (<code>terraform destroy<\/code>) veya state dosyas\u0131n\u0131 manuel olarak temizlemeniz gerekebilir. Bir workspace'i silmeden \u00f6nce, o workspace'in art\u0131k kullan\u0131lmad\u0131\u011f\u0131ndan ve herhangi bir canl\u0131 kayna\u011f\u0131 y\u00f6netmedi\u011finden emin olmak kritik \u00f6neme sahiptir.<\/li>\n<\/ul>\n<p>Bu komutlar sayesinde, farkl\u0131 ortamlar aras\u0131nda kolayca ge\u00e7i\u015f yapabilir, her ortam i\u00e7in ayr\u0131 ayr\u0131 <code>terraform apply<\/code> i\u015flemleri y\u00fcr\u00fctebilir ve state y\u00f6netimini merkezi, ancak izole bir \u015fekilde ger\u00e7ekle\u015ftirebilirsiniz. Unutmay\u0131n, Workspaces en iyi uzak backends (AWS S3, Azure Blob Storage, HashiCorp Consul\/Terraform Cloud vb.) ile birlikte kullan\u0131ld\u0131\u011f\u0131nda potansiyelini tam olarak ortaya koyar. Uzak backends, state dosyas\u0131n\u0131n g\u00fcvenli, s\u00fcr\u00fcml\u00fc ve tak\u0131m i\u00e7inde payla\u015f\u0131labilir olmas\u0131n\u0131 sa\u011flar, bu da i\u015fbirli\u011fi i\u00e7in hayati \u00f6neme sahiptir.<\/p>\n<div class=\"expert-tip\">\n    <strong>Uzman \u0130pucu:<\/strong> Yerel state dosyalar\u0131n\u0131 birden fazla ki\u015fiyle \u00e7al\u0131\u015f\u0131rken asla kullanmay\u0131n. Her zaman S3, Azure Blob Storage veya Terraform Cloud gibi bir uzak backend (remote backend) yap\u0131land\u0131r\u0131n. Workspaces, uzak backends ile birlikte kullan\u0131ld\u0131\u011f\u0131nda ger\u00e7ek g\u00fcc\u00fcn\u00fc g\u00f6sterir, \u00e7\u00fcnk\u00fc her workspace'in state dosyas\u0131 uzakta g\u00fcvenle saklan\u0131r.\n<\/div>\n<h2>Uygulamal\u0131 K\u0131s\u0131m: Basit Bir Workspaces Senaryosu Nas\u0131l Hayata Ge\u00e7irilir?<\/h2>\n<p>Terraform Workspaces'in teorik altyap\u0131s\u0131n\u0131 anlad\u0131\u011f\u0131m\u0131za g\u00f6re, \u015fimdi gelin bunu basit bir \u00f6rnekle nas\u0131l hayata ge\u00e7irebilece\u011fimizi g\u00f6relim. Bu senaryoda, AWS \u00fczerinde iki farkl\u0131 ortam (geli\u015ftirme ve \u00fcretim) i\u00e7in basit bir S3 kovas\u0131 (bucket) olu\u015fturaca\u011f\u0131z. Her iki ortam da ayn\u0131 kod dosyas\u0131n\u0131 kullanacak, ancak S3 kovalar\u0131n\u0131n isimleri ve belki de baz\u0131 \u00f6zellikleri farkl\u0131 olacak. Bu, Workspaces'in ayn\u0131 kod taban\u0131yla farkl\u0131 ortamlar y\u00f6netme yetene\u011fini a\u00e7\u0131k\u00e7a g\u00f6sterecektir.<\/p>\n<h3>Ad\u0131m 1: Terraform Konfig\u00fcrasyon Dosyalar\u0131n\u0131 Haz\u0131rlama<\/h3>\n<p>\u00d6ncelikle, projemiz i\u00e7in bir dizin olu\u015ftural\u0131m ve i\u00e7ine temel Terraform dosyalar\u0131m\u0131z\u0131 ekleyelim. <code>main.tf<\/code> ve <code>variables.tf<\/code> dosyalar\u0131n\u0131 kullanaca\u011f\u0131z.<\/p>\n<p><strong><code>main.tf<\/code><\/strong><\/p>\n<pre><code>resource \"aws_s3_bucket\" \"my_bucket\" {\n  bucket = var.bucket_name\n  tags = {\n    Environment = terraform.workspace\n    Project     = \"TerraformWorkspacesDemo\"\n  }\n}\n\nresource \"aws_s3_bucket_acl\" \"my_bucket_acl\" {\n  bucket = aws_s3_bucket.my_bucket.id\n  acl    = \"private\"\n}\n\noutput \"s3_bucket_id\" {\n  value       = aws_s3_bucket.my_bucket.id\n  description = \"Created S3 bucket ID.\"\n}\n\noutput \"s3_bucket_arn\" {\n  value       = aws_s3_bucket.my_bucket.arn\n  description = \"Created S3 bucket ARN.\"\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Burada dikkat etmeniz gereken \u00f6nemli nokta, <code>bucket_name<\/code> de\u011fi\u015fkenini kullanmam\u0131z ve <code>tags<\/code> i\u00e7inde <code>terraform.workspace<\/code> yerle\u015fik de\u011fi\u015fkenine do\u011frudan referans vermemizdir. Bu, her workspace i\u00e7in etiketin otomatik olarak ayarlanmas\u0131n\u0131 sa\u011flar.<\/p>\n<p><strong><code>variables.tf<\/code><\/strong><\/p>\n<pre><code>variable \"region\" {\n  description = \"AWS region to deploy resources.\"\n  type        = string\n  default     = \"us-east-1\"\n}\n\nvariable \"bucket_name_prefix\" {\n  description = \"Prefix for the S3 bucket name.\"\n  type        = string\n  default     = \"my-app\"\n}\n\nvariable \"bucket_name\" {\n  description = \"Full S3 bucket name.\"\n  type        = string\n  default     = \"${var.bucket_name_prefix}-${terraform.workspace}-storage\"\n}\n\nprovider \"aws\" {\n  region = var.region\n}\n<\/pre>\n<p><\/code><\/p>\n<p><code>variables.tf<\/code> dosyas\u0131nda, <code>bucket_name<\/code> de\u011fi\u015fkeninin varsay\u0131lan de\u011ferini <code>bucket_name_prefix<\/code> ve <code>terraform.workspace<\/code> de\u011ferlerini birle\u015ftirerek olu\u015fturdu\u011fumuza dikkat edin. Bu sayede, \"dev\" workspace'i i\u00e7in \"my-app-dev-storage\", \"prod\" workspace'i i\u00e7in \"my-app-prod-storage\" gibi benzersiz isimler otomatik olarak olu\u015facakt\u0131r.<\/p>\n<h3>Ad\u0131m 2: Terraform'u Ba\u015flatma ve Workspaces Olu\u015fturma<\/h3>\n<p>Konfig\u00fcrasyon dosyalar\u0131n\u0131 kaydettikten sonra, terminalinizi a\u00e7\u0131n ve proje dizininize gidin. \u0130lk olarak Terraform'u ba\u015flatmal\u0131y\u0131z:<\/p>\n<pre><code>terraform init\n<\/pre>\n<p><\/code><\/p>\n<p>Bu komut, AWS sa\u011flay\u0131c\u0131s\u0131n\u0131 indirecek ve <code>.terraform<\/code> dizinini olu\u015fturacakt\u0131r. \u015eimdi, geli\u015ftirme (dev) ve \u00fcretim (prod) ortamlar\u0131m\u0131z i\u00e7in iki yeni workspace olu\u015ftural\u0131m:<\/p>\n<pre><code>terraform workspace new dev\n<\/pre>\n<p><\/code><\/p>\n<pre><code>terraform workspace new prod\n<\/pre>\n<p><\/code><\/p>\n<p>Bu komutlar\u0131 \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, Terraform her bir workspace i\u00e7in ayr\u0131 bir state dosyas\u0131 olu\u015fturmaya haz\u0131r olacakt\u0131r.<\/p>\n<h3>Ad\u0131m 3: Geli\u015ftirme Ortam\u0131n\u0131 Da\u011f\u0131tma<\/h3>\n<p>\u015eu an \"prod\" workspace'inde olmal\u0131y\u0131z \u00e7\u00fcnk\u00fc en son onu olu\u015fturduk. Geli\u015ftirme ortam\u0131na ge\u00e7i\u015f yapal\u0131m:<\/p>\n<pre><code>terraform workspace select dev\n<\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi plan\u0131m\u0131z\u0131 olu\u015ftural\u0131m ve uygulayal\u0131m:<\/p>\n<pre><code>terraform plan\n<\/pre>\n<p><\/code><\/p>\n<p><code>terraform plan<\/code> \u00e7\u0131kt\u0131s\u0131, \"my-app-dev-storage\" ad\u0131nda bir S3 kovas\u0131n\u0131n olu\u015fturulaca\u011f\u0131n\u0131 g\u00f6stermelidir. Onaylad\u0131ktan sonra:<\/p>\n<pre><code>terraform apply --auto-approve\n<\/pre>\n<p><\/code><\/p>\n<p>Birka\u00e7 saniye i\u00e7inde S3 kovas\u0131 olu\u015fturulacak ve \"dev\" workspace'ine ait state dosyas\u0131nda kaydedilecektir. \u00c7\u0131kt\u0131larda <code>s3_bucket_id<\/code> ve <code>s3_bucket_arn<\/code> de\u011ferlerini g\u00f6rebilirsiniz.<\/p>\n<h3>Ad\u0131m 4: \u00dcretim Ortam\u0131n\u0131 Da\u011f\u0131tma<\/h3>\n<p>\u015eimdi ayn\u0131 konfig\u00fcrasyon dosyalar\u0131n\u0131 kullanarak \u00fcretim ortam\u0131m\u0131z\u0131 da\u011f\u0131tal\u0131m. \u00d6ncelikle \u00fcretim workspace'ine ge\u00e7i\u015f yapal\u0131m:<\/p>\n<pre><code>terraform workspace select prod\n<\/pre>\n<p><\/code><\/p>\n<p>Ard\u0131ndan, plan\u0131 kontrol edelim ve uygulayal\u0131m:<\/p>\n<pre><code>terraform plan\n<\/pre>\n<p><\/code><\/p>\n<p>Bu seferki <code>terraform plan<\/code> \u00e7\u0131kt\u0131s\u0131, \"my-app-prod-storage\" ad\u0131nda yepyeni bir S3 kovas\u0131n\u0131n olu\u015fturulaca\u011f\u0131n\u0131 g\u00f6sterecektir. Bu, Workspaces'in sihri! Ayn\u0131 kod, farkl\u0131 bir state dosyas\u0131 ve farkl\u0131 bir kaynak ad\u0131.<\/p>\n<pre><code>terraform apply --auto-approve\n<\/pre>\n<p><\/code><\/p>\n<p>Bu komut da \"prod\" ortam\u0131 i\u00e7in S3 kovas\u0131n\u0131 olu\u015fturacak ve bunu \"prod\" workspace'ine ait state dosyas\u0131na kaydedecektir.<\/p>\n<h3>Sonu\u00e7: \u0130zolasyonun G\u00fcc\u00fc<\/h3>\n<p>Bu basit \u00f6rnekle, ayn\u0131 Terraform konfig\u00fcrasyonunu kullanarak hem \"dev\" hem de \"prod\" ortamlar\u0131 i\u00e7in ba\u011f\u0131ms\u0131z S3 kovalar\u0131 olu\u015fturduk. Her bir workspace kendi state dosyas\u0131n\u0131 y\u00f6netti\u011fi i\u00e7in, \"dev\" ortam\u0131ndaki bir de\u011fi\u015fiklik \"prod\" ortam\u0131n\u0131 etkilemedi. Bu, Terraform Workspaces'in en temel ve en g\u00fc\u00e7l\u00fc yetene\u011fidir: Ortamlar aras\u0131nda g\u00fcvenli ve izole bir y\u00f6netim sa\u011flamak.<\/p>\n<p><strong>Vaka Analizi 1: K\u00fc\u00e7\u00fck Bir Startup'\u0131n Ortam Ayr\u0131m\u0131<\/strong><\/p>\n<p>K\u00fc\u00e7\u00fck bir SaaS startup'\u0131 olan \"Clouddy\", ba\u015flang\u0131\u00e7ta t\u00fcm altyap\u0131s\u0131n\u0131 tek bir Terraform dizini i\u00e7inde y\u00f6netiyordu. Geli\u015ftiriciler testler yapmak i\u00e7in \u00fcretim ortam\u0131ndaki kaynaklar\u0131 manuel olarak de\u011fi\u015ftiriyor, bu da s\u0131k s\u0131k kesintilere ve veri tutars\u0131zl\u0131klar\u0131na neden oluyordu. Geli\u015ftiricilerden biri, Terraform Workspaces'i \u00f6nerdi. Bir hafta i\u00e7inde, t\u00fcm uygulamalar\u0131n\u0131n altyap\u0131s\u0131 i\u00e7in tek bir Terraform konfig\u00fcrasyon dosyas\u0131 olu\u015fturdular. Bu dosya, <code>terraform.workspace<\/code> de\u011fi\u015fkenini kullanarak veritaban\u0131 boyutlar\u0131n\u0131, sunucu tiplerini ve API anahtarlar\u0131n\u0131 workspace'e g\u00f6re dinamik olarak ayarl\u0131yordu. \"dev\", \"staging\" ve \"production\" ad\u0131nda \u00fc\u00e7 workspace olu\u015fturdular. Sonu\u00e7: Geli\u015ftirme s\u00fcre\u00e7leri h\u0131zland\u0131, \u00fcretim ortam\u0131 kesintileri s\u0131f\u0131ra indi ve ekip i\u00e7i i\u015fbirli\u011fi \u00f6nemli \u00f6l\u00e7\u00fcde artt\u0131. Art\u0131k her ortam kendi ba\u011f\u0131ms\u0131z state dosyas\u0131 ile y\u00f6netiliyordu ve hata yapma riski b\u00fcy\u00fck \u00f6l\u00e7\u00fcde azald\u0131.<\/p>\n<h2>Workspaces ile Dinamik Kaynak Y\u00f6netimi: <code>terraform.workspace<\/code> De\u011fi\u015fkeni Ne \u0130\u015fe Yarar?<\/h2>\n<p>Terraform Workspaces'in ger\u00e7ek g\u00fcc\u00fc, yaln\u0131zca state dosyalar\u0131n\u0131 ay\u0131rmakla kalmay\u0131p, ayn\u0131 zamanda konfig\u00fcrasyonunuzu aktif olarak se\u00e7ili olan workspace'e g\u00f6re dinamik hale getirebilmesidir. Bu dinamizmi sa\u011flayan temel mekanizma, Terraform'un yerle\u015fik olarak sa\u011flad\u0131\u011f\u0131 \u00f6zel bir de\u011fi\u015fken olan <code>terraform.workspace<\/code>'dir. Bu de\u011fi\u015fken, o anki aktif workspace'in ad\u0131n\u0131 bir string olarak d\u00f6nd\u00fcr\u00fcr ve bu sayede kaynak tan\u0131mlar\u0131n\u0131z\u0131, de\u011fi\u015fken de\u011ferlerinizi veya ko\u015fullu mant\u0131\u011f\u0131n\u0131z\u0131 workspace'e g\u00f6re ayarlayabilirsiniz.<\/p>\n<p>\u00d6nceki \u00f6rne\u011fimizde g\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, <code>bucket_name<\/code> de\u011fi\u015fkenini <code>${var.bucket_name_prefix}-${terraform.workspace}-storage<\/code> \u015feklinde tan\u0131mlayarak, S3 kova ad\u0131n\u0131 do\u011frudan aktif workspace'in ad\u0131na g\u00f6re belirledik. Bu, manuel m\u00fcdahaleyi ortadan kald\u0131r\u0131r ve her ortam i\u00e7in benzersiz, ancak ayn\u0131 desenle isimlendirilmi\u015f kaynaklar olu\u015fturman\u0131z\u0131 sa\u011flar. Ancak <code>terraform.workspace<\/code>'in kullan\u0131m alan\u0131 sadece isimlendirme ile s\u0131n\u0131rl\u0131 de\u011fildir; \u00e7ok daha geni\u015f kapsaml\u0131 senaryolarda kullan\u0131labilir.<\/p>\n<p><strong>Dinamik Kaynak \u00d6zellikleri:<\/strong><\/p>\n<p>Bir ortamda daha k\u00fc\u00e7\u00fck, di\u011ferinde daha b\u00fcy\u00fck kaynaklar olu\u015fturman\u0131z gerekebilir. <code>terraform.workspace<\/code> kullanarak bu fark\u0131 kolayca y\u00f6netebilirsiniz. \u00d6rne\u011fin, geli\u015ftirme ortam\u0131nda daha k\u00fc\u00e7\u00fck bir EC2 instance tipi kullan\u0131rken, \u00fcretim ortam\u0131nda daha g\u00fc\u00e7l\u00fc bir tane kullanmak isteyebilirsiniz:<\/p>\n<pre><code>variable \"instance_type_map\" {\n  description = \"Mapping of instance types per workspace.\"\n  type        = map(string)\n  default = {\n    \"default\"   = \"t2.micro\"\n    \"dev\"       = \"t2.medium\"\n    \"staging\"   = \"t3.large\"\n    \"prod\"      = \"m5.xlarge\"\n  }\n}\n\nresource \"aws_instance\" \"app_server\" {\n  ami           = \"ami-0abcdef1234567890\" # \u00d6rnek AMI\n  instance_type = var.instance_type_map[terraform.workspace]\n  tags = {\n    Name        = \"app-server-${terraform.workspace}\"\n    Environment = terraform.workspace\n  }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>instance_type_map<\/code> ad\u0131nda bir de\u011fi\u015fken tan\u0131mlad\u0131k ve bu de\u011fi\u015fkene farkl\u0131 workspace'ler i\u00e7in farkl\u0131 instance tipleri atad\u0131k. <code>aws_instance<\/code> kayna\u011f\u0131n\u0131 olu\u015ftururken, <code>instance_type<\/code> \u00f6zelli\u011fini <code>var.instance_type_map[terraform.workspace]<\/code> olarak belirleyerek, aktif workspace'e g\u00f6re otomatik olarak do\u011fru instance tipinin se\u00e7ilmesini sa\u011flad\u0131k. Bu yakla\u015f\u0131m, sadece instance tipleri i\u00e7in de\u011fil, ayn\u0131 zamanda disk boyutlar\u0131, veritaban\u0131 kapasiteleri, autoscaling grup ayarlar\u0131 gibi di\u011fer bir\u00e7ok kaynak \u00f6zelli\u011fi i\u00e7in de uygulanabilir.<\/p>\n<p><strong>Ko\u015fullu Kaynak Yarat\u0131m\u0131:<\/strong><\/p>\n<p>Bazen, belirli bir kayna\u011f\u0131n sadece belirli bir workspace'te olu\u015fturulmas\u0131n\u0131 isteyebilirsiniz. \u00d6rne\u011fin, geli\u015ftirme ortam\u0131nda hata ay\u0131klama i\u00e7in bir izleme servisi (monitoring service) veya bir test veritaban\u0131 kullan\u0131rken, \u00fcretim ortam\u0131nda buna ihtiya\u00e7 duymayabilirsiniz. <code>count<\/code> metanargs'\u0131 <code>terraform.workspace<\/code> ile birle\u015ftirerek bunu ba\u015farabilirsiniz:<\/p>\n<pre><code>resource \"aws_db_instance\" \"test_db\" {\n  count                = terraform.workspace == \"dev\" ? 1 : 0\n  allocated_storage    = 20\n  engine               = \"mysql\"\n  engine_version       = \"8.0\"\n  instance_class       = \"db.t3.micro\"\n  db_name              = \"testdb\"\n  username             = \"admin\"\n  password             = \"Password123!\"\n  skip_final_snapshot  = true\n  # ... di\u011fer ayarlar\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>aws_db_instance<\/code> kayna\u011f\u0131 yaln\u0131zca aktif workspace \"dev\" oldu\u011funda olu\u015fturulur (<code>count = 1<\/code>). Di\u011fer t\u00fcm workspace'lerde (<code>count = 0<\/code>), bu kaynak g\u00f6z ard\u0131 edilir. Bu, \u00f6zellikle maliyet tasarrufu ve kaynak karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 azaltma a\u00e7\u0131s\u0131ndan \u00f6nemlidir. Benzer \u015fekilde, <code>for_each<\/code> metanargs'\u0131 da <code>terraform.workspace<\/code> ile kullan\u0131larak daha karma\u015f\u0131k ko\u015fullu kaynak olu\u015fturma senaryolar\u0131 desteklenebilir.<\/p>\n<p><code>terraform.workspace<\/code> de\u011fi\u015fkeni, Terraform konfig\u00fcrasyonlar\u0131n\u0131z\u0131 daha esnek, okunabilir ve tekrar kullan\u0131labilir hale getirir. Tek bir kod taban\u0131ndan birden fazla ortam\u0131 y\u00f6netirken, her ortam\u0131n kendine \u00f6zg\u00fc gereksinimlerini kar\u015f\u0131lamak i\u00e7in bu de\u011fi\u015fkeni stratejik olarak kullanmak, altyap\u0131 y\u00f6netim s\u00fcre\u00e7lerinizi \u00f6nemli \u00f6l\u00e7\u00fcde optimize edebilir. Ancak, bu de\u011fi\u015fkeni a\u015f\u0131r\u0131 kullanmaktan ka\u00e7\u0131nmak da \u00f6nemlidir, \u00e7\u00fcnk\u00fc \u00e7ok fazla <code>if\/else<\/code> veya ko\u015fullu mant\u0131k, konfig\u00fcrasyonunuzu okumay\u0131 ve bak\u0131m\u0131n\u0131 zorla\u015ft\u0131rabilir. Dengeli bir yakla\u015f\u0131m her zaman en iyisidir.<\/p>\n<h2>Workspaces'in Art\u0131lar\u0131 ve Eksileri: Ne Zaman Kullanmal\u0131, Ne Zaman Ka\u00e7\u0131nmal\u0131?<\/h2>\n<p>Terraform Workspaces, belirli senaryolar i\u00e7in g\u00fc\u00e7l\u00fc bir ara\u00e7 olsa da, her durum i\u00e7in en iyi \u00e7\u00f6z\u00fcm de\u011fildir. Her teknolojide oldu\u011fu gibi, Workspaces'in de kendine \u00f6zg\u00fc avantajlar\u0131 ve dezavantajlar\u0131 vard\u0131r. Bu b\u00f6l\u00fcm, Workspaces'i ne zaman tercih etmeniz gerekti\u011fini ve ne zaman alternatif \u00e7\u00f6z\u00fcmlere y\u00f6nelmeniz gerekti\u011fini anlaman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h3>Workspaces'in Art\u0131lar\u0131<\/h3>\n<ol>\n<li>\n        <strong>Ortam \u0130zolasyonu:<\/strong> En b\u00fcy\u00fck avantaj\u0131 budur. Her workspace'in kendi ba\u011f\u0131ms\u0131z state dosyas\u0131 oldu\u011fu i\u00e7in, bir ortamda yap\u0131lan de\u011fi\u015fiklikler di\u011ferini etkilemez. Bu, \u00f6zellikle kritik \u00fcretim ortamlar\u0131 i\u00e7in g\u00fcvenli\u011fi art\u0131r\u0131r ve hata yapma riskini azalt\u0131r.\n    <\/li>\n<li>\n        <strong>Tek Kod Taban\u0131:<\/strong> Ayn\u0131 Terraform konfig\u00fcrasyon dosyalar\u0131n\u0131 birden fazla ortam i\u00e7in kullanman\u0131z\u0131 sa\u011flar. Bu, kod tekrar\u0131n\u0131 \u00f6nler, bak\u0131m\u0131 kolayla\u015ft\u0131r\u0131r ve <code>DRY (Don&#039;t Repeat Yourself)<\/code> prensibine uymay\u0131 te\u015fvik eder.\n    <\/li>\n<li>\n        <strong>H\u0131zl\u0131 Ortam Ge\u00e7i\u015fi:<\/strong> <code>terraform workspace select<\/code> komutu ile farkl\u0131 ortamlar aras\u0131nda an\u0131nda ge\u00e7i\u015f yapabilirsiniz. Bu, geli\u015ftirme veya hata ay\u0131klama s\u00fcre\u00e7lerinde zaman kazand\u0131r\u0131r.\n    <\/li>\n<li>\n        <strong>Basit Kullan\u0131m:<\/strong> Temel Workspaces komutlar\u0131 (new, select, list, show, delete) olduk\u00e7a basittir ve h\u0131zl\u0131ca \u00f6\u011frenilebilir. K\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli projeler i\u00e7in ideal bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r.\n    <\/li>\n<li>\n        <strong>Dinamik Kaynak Y\u00f6netimi:<\/strong> <code>terraform.workspace<\/code> de\u011fi\u015fkeni sayesinde, kaynaklar\u0131n\u0131z\u0131 workspace'e g\u00f6re dinamik olarak yap\u0131land\u0131rabilirsiniz. Bu, farkl\u0131 ortamlar\u0131n farkl\u0131 kaynak tipleri, boyutlar\u0131 veya konfig\u00fcrasyonlar\u0131 olabilece\u011fi senaryolarda \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/li>\n<\/ol>\n<h3>Workspaces'in Eksileri ve Ne Zaman Ka\u00e7\u0131nmal\u0131?<\/h3>\n<ol>\n<li>\n        <strong><code>terraform.workspace<\/code> Ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 ve Karma\u015f\u0131kl\u0131k:<\/strong> <code>terraform.workspace<\/code> de\u011fi\u015fkenine a\u015f\u0131r\u0131 ba\u011f\u0131ml\u0131l\u0131k, konfig\u00fcrasyonunuzu karma\u015f\u0131kla\u015ft\u0131rabilir. \u00c7ok say\u0131da <code>if\/else<\/code> ko\u015fulu veya harita aramas\u0131, kodu okumay\u0131 ve anlamay\u0131 zorla\u015ft\u0131rabilir, bu da bak\u0131m maliyetini art\u0131r\u0131r. E\u011fer ortamlar aras\u0131nda \u00e7ok fazla parametre veya kaynak fark\u0131 varsa, bu yakla\u015f\u0131m s\u00fcrd\u00fcr\u00fclemez hale gelebilir.\n    <\/li>\n<li>\n        <strong>Mod\u00fcl Yeniden Kullan\u0131m Zorlu\u011fu:<\/strong> E\u011fer Terraform mod\u00fcllerini yo\u011fun bir \u015fekilde kullan\u0131yorsan\u0131z ve bu mod\u00fcllerin her ortamda \u00e7ok farkl\u0131 \u015fekillerde davranmas\u0131 gerekiyorsa, Workspaces ile y\u00f6netmek zorla\u015fabilir. Mod\u00fcllerin farkl\u0131 giri\u015f de\u011fi\u015fkenlerine veya farkl\u0131 kaynak say\u0131lar\u0131na sahip olmas\u0131 Workspaces mant\u0131\u011f\u0131n\u0131 bozabilir veya a\u015f\u0131r\u0131 karma\u015f\u0131k hale getirebilir.\n    <\/li>\n<li>\n        <strong>State Dosyas\u0131 Boyutlar\u0131:<\/strong> E\u011fer Workspaces'i \u00e7ok say\u0131da kaynak ve ortam i\u00e7in kullan\u0131rsan\u0131z, tek bir root mod\u00fclde y\u00f6netilen state dosyalar\u0131 olduk\u00e7a b\u00fcy\u00fcyebilir. B\u00fcy\u00fck state dosyalar\u0131, <code>terraform plan<\/code> ve <code>apply<\/code> s\u00fcrelerini yava\u015flatabilir ve sorun gidermeyi zorla\u015ft\u0131rabilir.\n    <\/li>\n<li>\n        <strong>S\u00fcr\u00fcm Kontrol\u00fc ve Geri D\u00f6n\u00fc\u015f Sorunlar\u0131:<\/strong> Ayn\u0131 kod taban\u0131n\u0131n farkl\u0131 Workspaces i\u00e7in kullan\u0131lmas\u0131, bazen bir de\u011fi\u015fikli\u011fin sadece bir workspace'i etkilemesini garanti etmeyi zorla\u015ft\u0131rabilir. Yanl\u0131\u015fl\u0131kla yap\u0131lan bir <code>apply<\/code> i\u015flemi, hedeflenen workspace d\u0131\u015f\u0131nda ba\u015fka bir workspace'i de etkileyebilir. Ayr\u0131ca, Workspaces'i silmek, state dosyas\u0131n\u0131 kaybetmenize yol a\u00e7abilir.\n    <\/li>\n<\/ol>\n<h3>Alternatif Yakla\u015f\u0131mlar<\/h3>\n<p>E\u011fer Workspaces'in dezavantajlar\u0131 projenizin gereksinimleriyle \u00e7eli\u015fiyorsa, a\u015fa\u011f\u0131daki alternatifleri de\u011ferlendirebilirsiniz:<\/p>\n<ol>\n<li>\n        <strong>Ayr\u0131 Dizinler (Separate Directories):<\/strong> Her ortam i\u00e7in ayr\u0131 bir dizin olu\u015fturmak ve her dizinde kendi <code>main.tf<\/code>, <code>variables.tf<\/code> ve <code>terraform.tfvars<\/code> dosyalar\u0131n\u0131 bulundurmak. Bu, en a\u00e7\u0131k ve basit yakla\u015f\u0131md\u0131r. Her ortam i\u00e7in tam izolasyon sa\u011flar, ancak kod tekrar\u0131na neden olabilir. E\u011fer ortamlar aras\u0131nda \u00e7ok az ortak kod varsa veya kod tekrar\u0131 kabul edilebilir d\u00fczeydeyse bu tercih edilebilir.\n    <\/li>\n<li>\n        <strong>Terragrunt:<\/strong> Terragrunt, Terraform'u saran ve \u00f6zellikle \u00e7oklu ortam\/mod\u00fcl senaryolar\u0131n\u0131 ele almak i\u00e7in tasarlanm\u0131\u015f bir ara\u00e7t\u0131r. Kod tekrar\u0131n\u0131 azaltmak i\u00e7in mod\u00fclleri farkl\u0131 ortamlar aras\u0131nda DRY prensibine uygun bir \u015fekilde kullan\u0131r. Uzak state y\u00f6netimi, ba\u011f\u0131ml\u0131l\u0131klar ve girdi de\u011fi\u015fkenlerini y\u00f6netmede Workspaces'ten \u00e7ok daha geli\u015fmi\u015f yetenekler sunar. B\u00fcy\u00fck \u00f6l\u00e7ekli ve karma\u015f\u0131k altyap\u0131lar i\u00e7in Workspaces'e g\u00f6re daha iyi bir se\u00e7enektir.\n    <\/li>\n<li>\n        <strong>Terraform Modules (Mod\u00fcller):<\/strong> Ortak altyap\u0131 bile\u015fenlerini mod\u00fcller halinde paketleyerek, bunlar\u0131 farkl\u0131 ortam dizinlerinde veya Terragrunt ile \u00e7a\u011f\u0131rabilirsiniz. Mod\u00fcller, kodun yeniden kullan\u0131labilirli\u011fini art\u0131r\u0131r ve karma\u015f\u0131kl\u0131\u011f\u0131 soyutlar.<\/li>\n<\/ol>\n<p><strong>Vaka Analizi 2: B\u00fcy\u00fck Bir Kurulu\u015fta Workspaces ile Zorluklar<\/strong><\/p>\n<p>Finans sekt\u00f6r\u00fcnde faaliyet g\u00f6steren b\u00fcy\u00fck bir kurulu\u015f, yeni bir uygulaman\u0131n altyap\u0131s\u0131 i\u00e7in ba\u015flang\u0131\u00e7ta Terraform Workspaces kullanmaya karar verdi. \"dev\", \"test\", \"stage\" ve \"prod\" olmak \u00fczere d\u00f6rt workspace olu\u015fturdular. Ba\u015flang\u0131\u00e7ta her \u015fey yolundayd\u0131. Ancak uygulama b\u00fcy\u00fcd\u00fck\u00e7e ve farkl\u0131 ekipler farkl\u0131 ortamlar i\u00e7in \u00f6zelle\u015ftirmeler yapmaya ba\u015flad\u0131k\u00e7a, <code>terraform.workspace<\/code> de\u011fi\u015fkeniyle yap\u0131lan ko\u015fullu mant\u0131k (<code>count<\/code>, <code>for_each<\/code>, <code>lookup<\/code> kullan\u0131mlar\u0131) giderek karma\u015f\u0131kla\u015ft\u0131. <code>main.tf<\/code> dosyas\u0131 binlerce sat\u0131ra ula\u015ft\u0131 ve i\u00e7inde onlarca farkl\u0131 ortam senaryosunu ele alan i\u00e7 i\u00e7e ko\u015fullar bar\u0131nd\u0131r\u0131yordu. Yeni bir kaynak eklemek veya mevcut bir kayna\u011f\u0131n sadece belirli bir ortamda davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftirmek k\u00e2busa d\u00f6n\u00fc\u015ft\u00fc. <code>terraform plan<\/code> komutu dakikalarca s\u00fcr\u00fcyordu ve state dosyalar\u0131 gigabaytlarca boyuta ula\u015fm\u0131\u015ft\u0131. Sonunda, ekip Workspaces'ten vazge\u00e7meye ve Terragrunt'a ge\u00e7i\u015f yapmaya karar verdi. Terragrunt ile her ortam i\u00e7in ayr\u0131 bir dizin yap\u0131s\u0131 olu\u015fturdular ve ortak altyap\u0131 bile\u015fenlerini mod\u00fcller halinde paketleyerek Terragrunt'un DRY mekanizmas\u0131n\u0131 kulland\u0131lar. Bu ge\u00e7i\u015f, ba\u015flang\u0131\u00e7ta zorlu olsa da, uzun vadede altyap\u0131 kodunun y\u00f6netimini ve \u00f6l\u00e7eklenebilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirdi.<\/p>\n<p>\u00d6zetle, Workspaces basit ve orta \u00f6l\u00e7ekli projeler i\u00e7in harika bir \u00e7\u00f6z\u00fcmd\u00fcr, \u00f6zellikle ortamlar aras\u0131ndaki farklar nispeten az ve <code>terraform.workspace<\/code> ile kolayca y\u00f6netilebiliyorsa. Ancak, ortamlar aras\u0131nda b\u00fcy\u00fck mimari farkl\u0131l\u0131klar varsa, \u00e7ok say\u0131da kaynak ve karma\u015f\u0131k mod\u00fcl yap\u0131s\u0131 kullan\u0131l\u0131yorsa, Terragrunt veya ayr\u0131 dizinler gibi alternatif yakla\u015f\u0131mlar daha s\u00fcrd\u00fcr\u00fclebilir olabilir.<\/p>\n<h2>En \u0130yi Pratikler ve \u0130leri D\u00fczey Kullan\u0131m: Terraform Workspaces'ten En Verimli \u015eekilde Yararlanma<\/h2>\n<p>Terraform Workspaces'\u0131 do\u011fru kullanmak, altyap\u0131 y\u00f6netim s\u00fcre\u00e7lerinizi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde iyile\u015ftirebilir. Ancak, maksimum verimlilik ve g\u00fcvenlik sa\u011flamak i\u00e7in baz\u0131 en iyi pratikleri ve ileri d\u00fczey kullan\u0131m senaryolar\u0131n\u0131 bilmek \u00f6nemlidir.<\/p>\n<h3>1. Uzak Backends (Remote Backends) ile Kullan\u0131m<\/h3>\n<p>Bu, Terraform Workspaces kullan\u0131m\u0131n\u0131n temel ta\u015f\u0131d\u0131r ve kesinlikle uyulmas\u0131 gereken bir kurald\u0131r. Yerel <code>terraform.tfstate<\/code> dosyalar\u0131, sadece ki\u015fisel \u00f6\u011frenme ve deneme ama\u00e7l\u0131 kullan\u0131lmal\u0131d\u0131r. \u00dcretim ortamlar\u0131nda veya bir ekiple \u00e7al\u0131\u015f\u0131rken, state dosyas\u0131n\u0131 uzak bir depolama servisinde saklamal\u0131s\u0131n\u0131z. Bu, a\u015fa\u011f\u0131daki avantajlar\u0131 sa\u011flar:<\/p>\n<ul>\n<li>\n        <strong>Merkezi Durum Y\u00f6netimi:<\/strong> Herkes ayn\u0131 state dosyas\u0131n\u0131 g\u00f6r\u00fcr, bu da tutars\u0131zl\u0131klar\u0131 \u00f6nler.\n    <\/li>\n<li>\n        <strong>State Kilitleme (State Locking):<\/strong> Birden fazla ki\u015finin ayn\u0131 anda <code>terraform apply<\/code> yapmas\u0131n\u0131 engelleyerek state dosyas\u0131n\u0131n bozulmas\u0131n\u0131 \u00f6nler.\n    <\/li>\n<li>\n        <strong>S\u00fcr\u00fcmleme (Versioning):<\/strong> State dosyas\u0131n\u0131n ge\u00e7mi\u015f s\u00fcr\u00fcmlerini saklayarak olas\u0131 hatalarda geri d\u00f6n\u00fc\u015f yapmay\u0131 sa\u011flar.\n    <\/li>\n<li>\n        <strong>\u015eifreleme:<\/strong> Bir\u00e7ok uzak backend, state dosyas\u0131n\u0131 depolarken \u015fifreleme sunar.\n    <\/li>\n<\/ul>\n<p>\u00d6rnek bir S3 backend konfig\u00fcrasyonu:<\/p>\n<pre><code>terraform {\n  backend \"s3\" {\n    bucket         = \"my-terraform-state-bucket\"\n    key            = \"environments\/app.tfstate\" # Workspaces bu path'e alt dizinler ekler\n    region         = \"us-east-1\"\n    encrypt        = true\n    dynamodb_table = \"terraform-state-locking\" # State kilitleme i\u00e7in\n  }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu konfig\u00fcrasyonla, <code>dev<\/code> workspace'i i\u00e7in state dosyas\u0131 <code>s3:\/\/my-terraform-state-bucket\/environments\/app.tfstate.d\/dev\/terraform.tfstate<\/code> yolunda saklan\u0131rken, <code>prod<\/code> i\u00e7in <code>s3:\/\/my-terraform-state-bucket\/environments\/app.tfstate.d\/prod\/terraform.tfstate<\/code> yolunda saklanacakt\u0131r. Bu yap\u0131, her workspace i\u00e7in state dosyas\u0131n\u0131n otomatik olarak ayr\u0131lmas\u0131n\u0131 ve g\u00fcvenle depolanmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>2. Naming Conventions (\u0130simlendirme Kurallar\u0131)<\/h3>\n<p>Workspaces'lerinizi adland\u0131r\u0131rken tutarl\u0131 ve a\u00e7\u0131klay\u0131c\u0131 kurallar kullan\u0131n. \u00d6rne\u011fin: <code>dev<\/code>, <code>test<\/code>, <code>staging<\/code>, <code>prod<\/code> veya daha spesifik olarak <code>feature-branch-name<\/code>, <code>qa-environment-1<\/code>. Bu, ekibinizin hangi ortam \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 kolayca anlamas\u0131na yard\u0131mc\u0131 olur.<\/p>\n<h3>3. <code>terraform.workspace<\/code> Kullan\u0131m\u0131n\u0131 Dengeli Tutun<\/h3>\n<p>Yukar\u0131da da belirtti\u011fimiz gibi, <code>terraform.workspace<\/code> g\u00fc\u00e7l\u00fcd\u00fcr ancak a\u015f\u0131r\u0131 kullan\u0131m\u0131 kod karma\u015f\u0131kl\u0131\u011f\u0131na yol a\u00e7abilir. E\u011fer ortamlar aras\u0131nda \u00e7ok fazla parametre farkl\u0131l\u0131\u011f\u0131 varsa, bunlar\u0131 <code>variables.tf<\/code> i\u00e7inde <code>map<\/code> veya <code>object<\/code> tipleriyle tan\u0131mlayarak ve <code>terraform.workspace<\/code> ile dinamik olarak se\u00e7erek y\u00f6netin. Ancak, \u00e7ok b\u00fcy\u00fck ve karma\u015f\u0131k farkl\u0131l\u0131klar i\u00e7in ayr\u0131 <code>tfvars<\/code> dosyalar\u0131 veya Terragrunt gibi ara\u00e7lar daha uygun olabilir.<\/p>\n<pre><code># variables.tf\nvariable \"instance_config\" {\n  type = map(object({\n    instance_type = string\n    min_size      = number\n    max_size      = number\n  }))\n  default = {\n    \"dev\" = {\n      instance_type = \"t3.small\"\n      min_size      = 1\n      max_size      = 1\n    }\n    \"prod\" = {\n      instance_type = \"m5.large\"\n      min_size      = 2\n      max_size      = 4\n    }\n  }\n}\n\n# main.tf\nresource \"aws_autoscaling_group\" \"app_asg\" {\n  # ...\n  min_size = var.instance_config[terraform.workspace].min_size\n  max_size = var.instance_config[terraform.workspace].max_size\n  # ...\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>4. CI\/CD Entegrasyonu<\/h3>\n<p>Workspaces, CI\/CD boru hatlar\u0131na m\u00fckemmel bir \u015fekilde entegre edilebilir. Bir git dal\u0131ndan (branch) birle\u015ftirme (merge) yap\u0131ld\u0131\u011f\u0131nda, ilgili workspace'i se\u00e7ip <code>terraform plan<\/code> ve <code>terraform apply<\/code> komutlar\u0131n\u0131 otomatik olarak \u00e7al\u0131\u015ft\u0131rabilirsiniz. \u00d6rne\u011fin, <code>develop<\/code> dal\u0131 <code>dev<\/code> workspace'ine, <code>main<\/code> veya <code>master<\/code> dal\u0131 <code>prod<\/code> workspace'ine da\u011f\u0131t\u0131m yapabilir.<\/p>\n<pre><code># \u00d6rnek GitLab CI\/CD Job\ndeploy_to_dev:\n  stage: deploy\n  script:\n    - terraform init\n    - terraform workspace select dev || terraform workspace new dev\n    - terraform plan -out=planfile-dev\n    - terraform apply planfile-dev\n  only:\n    - develop\n\ndeploy_to_prod:\n  stage: deploy\n  script:\n    - terraform init\n    - terraform workspace select prod\n    - terraform plan -out=planfile-prod\n    - terraform apply planfile-prod\n  only:\n    - main\n<\/pre>\n<p><\/code><\/p>\n<h3>5. G\u00fcvenlik Hususlar\u0131<\/h3>\n<ul>\n<li>\n        <strong>State Dosyas\u0131 Hassasiyeti:<\/strong> State dosyalar\u0131, hassas bilgileri (\u00f6rne\u011fin, \u015fifreler, API anahtarlar\u0131) a\u00e7\u0131k metin olarak i\u00e7erebilir. Bu nedenle, uzak backend'inizi \u015fifrelemeyi etkinle\u015ftirin ve state dosyas\u0131na eri\u015fimi s\u0131k\u0131ca kontrol edin.\n    <\/li>\n<li>\n        <strong>Eri\u015fim Kontrol\u00fc (IAM):<\/strong> Terraform'u \u00e7al\u0131\u015ft\u0131ran kullan\u0131c\u0131lar\u0131n veya CI\/CD servis hesaplar\u0131n\u0131n yaln\u0131zca ihtiya\u00e7 duyduklar\u0131 kaynaklara eri\u015febilmesi i\u00e7in en az ayr\u0131cal\u0131k (Least Privilege) ilkesini uygulay\u0131n.<\/li>\n<\/ul>\n<h3>6. Workspace Silme \u0130\u015flemi<\/h3>\n<p>Bir workspace'i silmeden \u00f6nce, o workspace'e ba\u011fl\u0131 t\u00fcm kaynaklar\u0131 <code>terraform destroy<\/code> ile yok etti\u011finizden emin olun. Aksi takdirde, kaynaklar bulut sa\u011flay\u0131c\u0131n\u0131zda kalmaya devam eder ancak Terraform'un bilgisi d\u0131\u015f\u0131nda olurlar (orphan resources).<\/p>\n<pre><code>terraform workspace select dev\nterraform destroy --auto-approve\nterraform workspace delete dev\n<\/pre>\n<p><\/code><\/p>\n<p>Bu ad\u0131mlar, Workspaces'in g\u00fcvenli ve verimli bir \u015fekilde kullan\u0131lmas\u0131n\u0131 sa\u011flar. Bu pratikleri takip ederek, altyap\u0131 y\u00f6netim s\u00fcre\u00e7lerinizde daha az hata yapacak, daha h\u0131zl\u0131 da\u011f\u0131t\u0131m yapacak ve daha kolay i\u015fbirli\u011fi sa\u011flayacaks\u0131n\u0131z.<\/p>\n<h2>Sonu\u00e7 ve Gelecek Perspektifi: Terraform Workspaces ile Nereye Kadar Gidebiliriz?<\/h2>\n<p>Terraform Workspaces, altyap\u0131 y\u00f6netimi d\u00fcnyas\u0131nda, ayn\u0131 kod taban\u0131n\u0131 kullanarak farkl\u0131 ortamlar\u0131 izole bir \u015fekilde y\u00f6netme konusunda paha bi\u00e7ilmez bir kolayl\u0131k sunar. Bu makale boyunca, Workspaces'in temel prensiplerini, <code>terraform.workspace<\/code> de\u011fi\u015fkeniyle dinamik yap\u0131land\u0131rma yetene\u011fini, uygulaman\u0131n ad\u0131m ad\u0131m nas\u0131l yap\u0131ld\u0131\u011f\u0131n\u0131 ve bu arac\u0131n ne zaman kullan\u0131l\u0131p ne zaman alternatif \u00e7\u00f6z\u00fcmlere y\u00f6nelilmesi gerekti\u011fini derinlemesine inceledik. Geli\u015ftirme, test ve \u00fcretim gibi evreler aras\u0131nda kaynak izolasyonu sa\u011flamak, tek bir Terraform konfig\u00fcrasyonuyla \u00e7al\u0131\u015fman\u0131n getirdi\u011fi karma\u015f\u0131kl\u0131\u011f\u0131 azaltmak ve DRY prensibine sad\u0131k kalmak isteyen ekipler i\u00e7in Workspaces, kesinlikle dikkate al\u0131nmas\u0131 gereken bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<p>Workspaces'in en b\u00fcy\u00fck g\u00fcc\u00fc, \u00f6zellikle k\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli projelerde veya ortamlar aras\u0131 farklar\u0131n nispeten az oldu\u011fu durumlarda ortaya \u00e7\u0131kar. Basit ve anla\u015f\u0131l\u0131r yap\u0131s\u0131yla, h\u0131zla benimsenip kullan\u0131lmaya ba\u015flanabilir. Uzak backends ile birle\u015fti\u011finde, ekiplerin g\u00fcvenli ve i\u015fbirlik\u00e7i bir \u015fekilde altyap\u0131y\u0131 y\u00f6netmesine olanak tan\u0131r. CI\/CD boru hatlar\u0131yla entegrasyonu sayesinde, da\u011f\u0131t\u0131m s\u00fcre\u00e7leri otomatize edilebilir ve daha az manuel hatayla \u00e7al\u0131\u015f\u0131labilir.<\/p>\n<p>Ancak, her ara\u00e7 gibi Workspaces'in de s\u0131n\u0131rlar\u0131 vard\u0131r. Ortamlar aras\u0131 \u00e7ok b\u00fcy\u00fck mimari farkl\u0131l\u0131klar, a\u015f\u0131r\u0131 <code>terraform.workspace<\/code> ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 veya \u00e7ok say\u0131da mod\u00fcl ve kaynak i\u00e7eren b\u00fcy\u00fck \u00f6l\u00e7ekli altyap\u0131larda, Workspaces karma\u015f\u0131kl\u0131k y\u00f6netimi konusunda zorlanabilir. Bu t\u00fcr senaryolarda, Terragrunt veya ortam ba\u015f\u0131na ayr\u0131 dizinler gibi daha g\u00fc\u00e7l\u00fc ve esnek ara\u00e7lar veya yakla\u015f\u0131mlar daha uygun olabilir. Gelecekte, Terraform'un kendisi ve ekosistemi s\u00fcrekli geli\u015fti\u011fi i\u00e7in, Workspaces'in yetenekleri ve kullan\u0131m alanlar\u0131 da de\u011fi\u015febilir. HashiCorp'un Terraform Cloud gibi hizmetleri, Workspaces y\u00f6netimini daha da kolayla\u015ft\u0131ran ek \u00f6zellikler sunarak bu alandaki geli\u015fmeleri desteklemektedir.<\/p>\n<p>Sonu\u00e7 olarak, Terraform Workspaces, altyap\u0131 kodunuzu daha organize, y\u00f6netilebilir ve tekrar kullan\u0131labilir hale getirmek i\u00e7in g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Do\u011fru kullan\u0131ld\u0131\u011f\u0131nda, geli\u015ftirme ekiplerinin daha h\u0131zl\u0131 ve g\u00fcvenli bir \u015fekilde de\u011fer yaratmas\u0131na yard\u0131mc\u0131 olur. Projenizin \u00f6l\u00e7e\u011fini ve ortamlar aras\u0131ndaki farkl\u0131l\u0131klar\u0131 dikkatlice de\u011ferlendirerek Workspaces'in sizin i\u00e7in do\u011fru se\u00e7im olup olmad\u0131\u011f\u0131n\u0131 belirleyebilirsiniz. Unutmay\u0131n, en iyi ara\u00e7, projenizin spesifik ihtiya\u00e7lar\u0131na en uygun olan\u0131d\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<h4>Q1: Terraform'daki \"default\" workspace ne anlama geliyor?<\/h4>\n<p><strong>Cevap:<\/strong> \"default\" workspace, Terraform'u ilk kez ba\u015flatt\u0131\u011f\u0131n\u0131zda (<code>terraform init<\/code>) otomatik olarak olu\u015fturulan ve hi\u00e7bir \u00f6zel workspace belirtilmedi\u011finde kullan\u0131lan varsay\u0131lan state y\u00f6netim alan\u0131d\u0131r. T\u00fcm yeni kaynaklar ve de\u011fi\u015fiklikler, siz ba\u015fka bir workspace olu\u015fturup ona ge\u00e7ene kadar \"default\" workspace'in state dosyas\u0131na kaydedilir.<\/p>\n<h4>Q2: Terraform Workspaces ile Terragrunt aras\u0131ndaki temel fark nedir?<\/h4>\n<p><strong>Cevap:<\/strong> Terraform Workspaces, ayn\u0131 Terraform konfig\u00fcrasyonunu kullanarak birden fazla, ba\u011f\u0131ms\u0131z state dosyas\u0131 y\u00f6netmenizi sa\u011flar ve tek bir root mod\u00fcl i\u00e7inde ortam farkl\u0131l\u0131klar\u0131n\u0131 ele almaya odaklan\u0131r. Terragrunt ise Terraform'un \u00fczerine in\u015fa edilmi\u015f bir \"wrapper\" (sar\u0131c\u0131) ara\u00e7t\u0131r. \u00d6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k \u00e7oklu ortam projelerinde kod tekrar\u0131n\u0131 azaltmak, uzak state'i y\u00f6netmek, ba\u011f\u0131ml\u0131l\u0131klar\u0131 tan\u0131mlamak ve Terraform mod\u00fcllerini DRY prensibine uygun bir \u015fekilde kullanmak i\u00e7in tasarlanm\u0131\u015ft\u0131r. Terragrunt, genellikle Workspaces'in yetersiz kald\u0131\u011f\u0131 b\u00fcy\u00fck \u00f6l\u00e7ekli senaryolarda tercih edilir.<\/p>\n<h4>Q3: <code>terraform workspace new<\/code> ve <code>terraform init<\/code> farkl\u0131 ortamlar i\u00e7in nas\u0131l kullan\u0131l\u0131r?<\/h4>\n<p><strong>Cevap:<\/strong> <code>terraform init<\/code>, Terraform'un bir dizini ba\u015flatmas\u0131 ve sa\u011flay\u0131c\u0131lar\u0131, mod\u00fclleri indirmesi i\u00e7in temel bir komuttur. Bu komutu, bir dizinde sadece bir kez \u00e7al\u0131\u015ft\u0131rman\u0131z yeterlidir, Workspaces'ten ba\u011f\u0131ms\u0131zd\u0131r. <code>terraform workspace new<\/code> ise <code>init<\/code> sonras\u0131nda kullan\u0131l\u0131r ve yeni bir workspace olu\u015fturarak o workspace'e otomatik olarak ge\u00e7i\u015f yapar. Yani, \u00f6nce <code>terraform init<\/code> yapar, ard\u0131ndan istedi\u011finiz kadar <code>terraform workspace new <ADI><\/code> komutunu kullanarak farkl\u0131 ortamlar i\u00e7in state'ler olu\u015fturursunuz.<\/p>\n<h4>Q4: Mevcut bir state dosyas\u0131n\u0131 Workspaces'e nas\u0131l ta\u015f\u0131r\u0131m?<\/h4>\n<p><strong>Cevap:<\/strong> Mevcut bir \"default\" workspace state dosyan\u0131z\u0131 yeni bir workspace'e ta\u015f\u0131mak i\u00e7in \u00f6zel bir komuta ihtiyac\u0131n\u0131z yoktur. Sadece <code>terraform workspace new <YENI_WORKSPACE_ADI><\/code> komutunu \u00e7al\u0131\u015ft\u0131rarak yeni bir workspace olu\u015fturdu\u011funuzda, Terraform mevcut \"default\" state dosyas\u0131n\u0131 otomatik olarak yeni workspace'in alt\u0131na kopyalar ve yeni workspace'i aktif hale getirir. \"default\" workspace'in kendisi bo\u015f kal\u0131r veya \u00f6nceki state'i korunur. E\u011fer mevcut state'i tamamen ta\u015f\u0131mak istiyorsan\u0131z, en iyi yol yeni bir workspace olu\u015fturup, default'taki kaynaklar\u0131 yeni workspace'e manuel olarak import etmek veya destroy edip yeni workspace'te yeniden olu\u015fturmakt\u0131r (ancak bu riskli olabilir).<\/p>\n<h4>Q5: Workspaces kullan\u0131rken state dosyam g\u00fcvende mi?<\/h4>\n<p><strong>Cevap:<\/strong> Workspaces kullan\u0131rken state dosyan\u0131z\u0131n g\u00fcvenli\u011fi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde sizin kulland\u0131\u011f\u0131n\u0131z backend (depolama) tipine ba\u011fl\u0131d\u0131r. E\u011fer yerel state (<code>terraform.tfstate<\/code>) kullan\u0131yorsan\u0131z, dosya sisteminizin g\u00fcvenli\u011fi ile s\u0131n\u0131rl\u0131d\u0131r ve hassas bilgiler a\u00e7\u0131k\u00e7a g\u00f6r\u00fclebilir. Ancak, S3, Azure Blob Storage veya Terraform Cloud gibi uzak backends kulland\u0131\u011f\u0131n\u0131zda, bu hizmetler genellikle \u015fifreleme, s\u00fcr\u00fcmleme, eri\u015fim kontrol\u00fc ve state kilitleme gibi g\u00fcvenlik \u00f6zellikleri sunar. Bu nedenle, hassas veriler i\u00e7eren state dosyalar\u0131 i\u00e7in her zaman \u015fifrelenmi\u015f bir uzak backend kullanman\u0131z \u015fiddetle tavsiye edilir.<\/p>\n","protected":false},"excerpt":{"rendered":"Terraform Workspaces ile \u00e7oklu ortamlar\u0131 (geli\u015ftirme, test, \u00fcretim) nas\u0131l kolayca y\u00f6netebilece\u011finizi merak m\u0131 ediyorsunuz? Bu kapsaml\u0131 rehberde, Workspaces&#8217;in&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-34163","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>The Curious Case of Terraform Workspaces: Ortamlar\u0131 Nas\u0131l Y\u00f6netirsiniz?<\/title>\n<meta name=\"description\" content=\"Terraform Workspaces ile \u00e7oklu ortamlar\u0131 (geli\u015ftirme, test, \u00fcretim) nas\u0131l kolayca y\u00f6netebilece\u011finizi merak m\u0131 ediyorsunuz? Bu kapsaml\u0131 rehberde, Workspaces&#039;in temelinden ileri d\u00fczey kullan\u0131m\u0131na, ger\u00e7ek d\u00fcnya senaryolar\u0131ndan en iyi pratiklere kadar her \u015feyi ke\u015ffedin. Art\u0131k ortam y\u00f6netimindeki karma\u015f\u0131kl\u0131klar tarih olacak!\" \/>\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\/the-curious-case-of-terraform-workspaces-ortamlari-nasil-yonetirsiniz\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"The Curious Case of Terraform Workspaces: Ortamlar\u0131 Nas\u0131l Y\u00f6netirsiniz?\" \/>\n<meta property=\"og:description\" content=\"Terraform Workspaces ile \u00e7oklu ortamlar\u0131 (geli\u015ftirme, test, \u00fcretim) nas\u0131l kolayca y\u00f6netebilece\u011finizi merak m\u0131 ediyorsunuz? Bu kapsaml\u0131 rehberde, Workspaces&#039;in temelinden ileri d\u00fczey kullan\u0131m\u0131na, ger\u00e7ek d\u00fcnya senaryolar\u0131ndan en iyi pratiklere kadar her \u015feyi ke\u015ffedin. Art\u0131k ortam y\u00f6netimindeki karma\u015f\u0131kl\u0131klar tarih olacak!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/the-curious-case-of-terraform-workspaces-ortamlari-nasil-yonetirsiniz\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-12T01:01:11+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"27 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/the-curious-case-of-terraform-workspaces-ortamlari-nasil-yonetirsiniz\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/the-curious-case-of-terraform-workspaces-ortamlari-nasil-yonetirsiniz\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"The Curious Case of Terraform Workspaces: Ortamlar\u0131 Nas\u0131l Y\u00f6netirsiniz?\",\"datePublished\":\"2025-11-12T01:01:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/the-curious-case-of-terraform-workspaces-ortamlari-nasil-yonetirsiniz\/\"},\"wordCount\":4936,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/the-curious-case-of-terraform-workspaces-ortamlari-nasil-yonetirsiniz\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/the-curious-case-of-terraform-workspaces-ortamlari-nasil-yonetirsiniz\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/the-curious-case-of-terraform-workspaces-ortamlari-nasil-yonetirsiniz\/\",\"name\":\"The Curious Case of Terraform Workspaces: Ortamlar\u0131 Nas\u0131l Y\u00f6netirsiniz?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-12T01:01:11+00:00\",\"description\":\"Terraform Workspaces ile \u00e7oklu ortamlar\u0131 (geli\u015ftirme, test, \u00fcretim) nas\u0131l kolayca y\u00f6netebilece\u011finizi merak m\u0131 ediyorsunuz? Bu kapsaml\u0131 rehberde, Workspaces'in temelinden ileri d\u00fczey kullan\u0131m\u0131na, ger\u00e7ek d\u00fcnya senaryolar\u0131ndan en iyi pratiklere kadar her \u015feyi ke\u015ffedin. Art\u0131k ortam y\u00f6netimindeki karma\u015f\u0131kl\u0131klar tarih olacak!\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/the-curious-case-of-terraform-workspaces-ortamlari-nasil-yonetirsiniz\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/the-curious-case-of-terraform-workspaces-ortamlari-nasil-yonetirsiniz\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/the-curious-case-of-terraform-workspaces-ortamlari-nasil-yonetirsiniz\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"The Curious Case of Terraform Workspaces: Ortamlar\u0131 Nas\u0131l Y\u00f6netirsiniz?\"}]},{\"@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":"The Curious Case of Terraform Workspaces: Ortamlar\u0131 Nas\u0131l Y\u00f6netirsiniz?","description":"Terraform Workspaces ile \u00e7oklu ortamlar\u0131 (geli\u015ftirme, test, \u00fcretim) nas\u0131l kolayca y\u00f6netebilece\u011finizi merak m\u0131 ediyorsunuz? Bu kapsaml\u0131 rehberde, Workspaces'in temelinden ileri d\u00fczey kullan\u0131m\u0131na, ger\u00e7ek d\u00fcnya senaryolar\u0131ndan en iyi pratiklere kadar her \u015feyi ke\u015ffedin. Art\u0131k ortam y\u00f6netimindeki karma\u015f\u0131kl\u0131klar tarih olacak!","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\/the-curious-case-of-terraform-workspaces-ortamlari-nasil-yonetirsiniz\/","og_locale":"tr_TR","og_type":"article","og_title":"The Curious Case of Terraform Workspaces: Ortamlar\u0131 Nas\u0131l Y\u00f6netirsiniz?","og_description":"Terraform Workspaces ile \u00e7oklu ortamlar\u0131 (geli\u015ftirme, test, \u00fcretim) nas\u0131l kolayca y\u00f6netebilece\u011finizi merak m\u0131 ediyorsunuz? Bu kapsaml\u0131 rehberde, Workspaces'in temelinden ileri d\u00fczey kullan\u0131m\u0131na, ger\u00e7ek d\u00fcnya senaryolar\u0131ndan en iyi pratiklere kadar her \u015feyi ke\u015ffedin. Art\u0131k ortam y\u00f6netimindeki karma\u015f\u0131kl\u0131klar tarih olacak!","og_url":"https:\/\/fatihsoysal.com\/blog\/the-curious-case-of-terraform-workspaces-ortamlari-nasil-yonetirsiniz\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-12T01:01:11+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"27 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/the-curious-case-of-terraform-workspaces-ortamlari-nasil-yonetirsiniz\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/the-curious-case-of-terraform-workspaces-ortamlari-nasil-yonetirsiniz\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"The Curious Case of Terraform Workspaces: Ortamlar\u0131 Nas\u0131l Y\u00f6netirsiniz?","datePublished":"2025-11-12T01:01:11+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/the-curious-case-of-terraform-workspaces-ortamlari-nasil-yonetirsiniz\/"},"wordCount":4936,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/the-curious-case-of-terraform-workspaces-ortamlari-nasil-yonetirsiniz\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/the-curious-case-of-terraform-workspaces-ortamlari-nasil-yonetirsiniz\/","url":"https:\/\/fatihsoysal.com\/blog\/the-curious-case-of-terraform-workspaces-ortamlari-nasil-yonetirsiniz\/","name":"The Curious Case of Terraform Workspaces: Ortamlar\u0131 Nas\u0131l Y\u00f6netirsiniz?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-12T01:01:11+00:00","description":"Terraform Workspaces ile \u00e7oklu ortamlar\u0131 (geli\u015ftirme, test, \u00fcretim) nas\u0131l kolayca y\u00f6netebilece\u011finizi merak m\u0131 ediyorsunuz? Bu kapsaml\u0131 rehberde, Workspaces'in temelinden ileri d\u00fczey kullan\u0131m\u0131na, ger\u00e7ek d\u00fcnya senaryolar\u0131ndan en iyi pratiklere kadar her \u015feyi ke\u015ffedin. Art\u0131k ortam y\u00f6netimindeki karma\u015f\u0131kl\u0131klar tarih olacak!","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/the-curious-case-of-terraform-workspaces-ortamlari-nasil-yonetirsiniz\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/the-curious-case-of-terraform-workspaces-ortamlari-nasil-yonetirsiniz\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/the-curious-case-of-terraform-workspaces-ortamlari-nasil-yonetirsiniz\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"The Curious Case of Terraform Workspaces: Ortamlar\u0131 Nas\u0131l Y\u00f6netirsiniz?"}]},{"@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\/34163","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=34163"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34163\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34163"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34163"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34163"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}