{"id":36299,"date":"2025-12-13T02:40:49","date_gmt":"2025-12-12T23:40:49","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=36299"},"modified":"2025-12-13T02:40:49","modified_gmt":"2025-12-12T23:40:49","slug":"ozel-bir-terraform-modulu-nasil-olusturulur","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/ozel-bir-terraform-modulu-nasil-olusturulur\/","title":{"rendered":"\u00d6zel Bir Terraform Mod\u00fcl\u00fc Nas\u0131l Olu\u015fturulur?"},"content":{"rendered":"<p><body><\/p>\n<h2>\u00d6zel Bir Terraform Mod\u00fcl\u00fc Nas\u0131l Olu\u015fturulur?<\/h2>\n<h3>Giri\u015f<\/h3>\n<p>Modern bulut altyap\u0131s\u0131 y\u00f6netimi, karma\u015f\u0131kl\u0131\u011f\u0131 azaltmak, tekrarlanabilirli\u011fi sa\u011flamak ve s\u00fcre\u00e7leri otomatikle\u015ftirmek \u00fczerine kuruludur. Bu hedeflere ula\u015fmak i\u00e7in &#8220;altyap\u0131y\u0131 kod olarak&#8221; (Infrastructure as Code &#8211; IaC) yakla\u015f\u0131m\u0131 benimsenmi\u015ftir. IaC ara\u00e7lar\u0131 aras\u0131nda Terraform, bulut sa\u011flay\u0131c\u0131s\u0131ndan ba\u011f\u0131ms\u0131z yap\u0131s\u0131 ve geni\u015f ekosistemi sayesinde \u00f6ne \u00e7\u0131kmaktad\u0131r. Terraform, altyap\u0131y\u0131 bildirimsel bir s\u00f6zdizimi kullanarak tan\u0131mlaman\u0131za, sa\u011flaman\u0131za ve y\u00f6netmenize olanak tan\u0131r.<\/p>\n<p>Terraform&#8217;un temel ta\u015flar\u0131ndan biri de mod\u00fcllerdir. Mod\u00fcller, bir veya daha fazla kaynak i\u00e7in yap\u0131land\u0131rmalar\u0131 kaps\u00fclleyen ve yeniden kullan\u0131labilir birimler halinde paketleyen self-contained Terraform yap\u0131land\u0131rmalar\u0131d\u0131r. Bu makale, kendi \u00f6zel Terraform mod\u00fcllerinizi nas\u0131l olu\u015fturaca\u011f\u0131n\u0131z\u0131, bunlar\u0131n faydalar\u0131n\u0131, temel bile\u015fenlerini ve en iyi uygulamalar\u0131n\u0131 detayl\u0131 bir \u015fekilde ele alacakt\u0131r. Kendi mod\u00fcllerinizi olu\u015fturmak, organizasyonunuzun \u00f6zel ihtiya\u00e7lar\u0131na uygun, standartla\u015ft\u0131r\u0131lm\u0131\u015f ve bak\u0131m\u0131 kolay altyap\u0131 bile\u015fenleri geli\u015ftirmenizi sa\u011flar.<\/p>\n<h3>Terraform Mod\u00fclleri Neden \u00d6nemlidir?<\/h3>\n<p>Mod\u00fcller, Terraform&#8217;un g\u00fcc\u00fcn\u00fc ve esnekli\u011fini art\u0131ran kritik bir \u00f6zelliktir. \u0130\u015fte mod\u00fcllerin sa\u011flad\u0131\u011f\u0131 ba\u015fl\u0131ca faydalar:<\/p>\n<ul>\n<li><strong>Yeniden Kullan\u0131labilirlik (Reusability):<\/strong> Ayn\u0131 altyap\u0131 bile\u015fenlerini (\u00f6rne\u011fin, bir VPC, bir veritaban\u0131, bir depolama kovas\u0131) farkl\u0131 projelerde veya ortamlarda tekrar tekrar kullanman\u0131z\u0131 sa\u011flar. Bu, kod tekrar\u0131n\u0131 azalt\u0131r ve geli\u015ftirme h\u0131z\u0131n\u0131 art\u0131r\u0131r.<\/li>\n<li><strong>Standartla\u015ft\u0131rma (Standardization):<\/strong> Mod\u00fcller, organizasyonunuzun en iyi uygulamalar\u0131n\u0131, g\u00fcvenlik politikalar\u0131n\u0131 ve adland\u0131rma kurallar\u0131n\u0131 kod i\u00e7inde zorunlu k\u0131larak altyap\u0131 bile\u015fenlerinizde tutarl\u0131l\u0131k sa\u011flar.<\/li>\n<li><strong>Kaps\u00fclleme (Encapsulation):<\/strong> Karma\u015f\u0131k altyap\u0131 yap\u0131land\u0131rmalar\u0131n\u0131 soyutlayarak, mod\u00fcl kullan\u0131c\u0131lar\u0131n\u0131n i\u00e7 detaylarla u\u011fra\u015fmas\u0131na gerek kalmadan y\u00fcksek seviyeli bir aray\u00fcz sunar. Bu, mod\u00fcl\u00fcn kullan\u0131m\u0131n\u0131 basitle\u015ftirir.<\/li>\n<li><strong>\u0130\u015fbirli\u011fi (Collaboration):<\/strong> Ekip \u00fcyeleri, farkl\u0131 mod\u00fcller \u00fczerinde ba\u011f\u0131ms\u0131z olarak \u00e7al\u0131\u015fabilir ve bu mod\u00fclleri bir araya getirerek daha b\u00fcy\u00fck altyap\u0131 y\u0131\u011f\u0131nlar\u0131 olu\u015fturabilirler.<\/li>\n<li><strong>Karma\u015f\u0131kl\u0131k Y\u00f6netimi (Complexity Management):<\/strong> B\u00fcy\u00fck ve karma\u015f\u0131k altyap\u0131lar\u0131 daha k\u00fc\u00e7\u00fck, y\u00f6netilebilir par\u00e7alara ay\u0131rarak genel karma\u015f\u0131kl\u0131\u011f\u0131 azalt\u0131r.<\/li>\n<\/ul>\n<p>Haz\u0131r mod\u00fcller (Terraform Registry&#8217;deki gibi) harika olsa da, bazen organizasyonunuzun \u00f6zel ihtiya\u00e7lar\u0131na veya dahili standartlar\u0131na tam olarak uymayabilirler. Bu durumlarda, \u00f6zel mod\u00fcller geli\u015ftirmek, size tam kontrol ve esneklik sa\u011flar.<\/p>\n<h3>Mod\u00fcl Temelleri<\/h3>\n<p>Her Terraform yap\u0131land\u0131rmas\u0131, en az\u0131ndan bir &#8220;root mod\u00fcl&#8221; olarak adland\u0131r\u0131lan bir mod\u00fcle sahiptir. Bu, <code>terraform apply<\/code> komutunu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131z dizindir. Bir mod\u00fcl, a\u015fa\u011f\u0131daki temel dosyalar\u0131 ve dizinleri i\u00e7erir:<\/p>\n<h4>Mod\u00fcl Yap\u0131s\u0131<\/h4>\n<p>Tipik bir mod\u00fcl dizini a\u015fa\u011f\u0131daki gibi g\u00f6r\u00fcn\u00fcr:<\/p>\n<pre><code>\nmy-module\/\n\u251c\u2500\u2500 main.tf\n\u251c\u2500\u2500 variables.tf\n\u251c\u2500\u2500 outputs.tf\n\u251c\u2500\u2500 versions.tf\n\u251c\u2500\u2500 locals.tf (iste\u011fe ba\u011fl\u0131)\n\u251c\u2500\u2500 README.md\n\u2514\u2500\u2500 examples\/ (iste\u011fe ba\u011fl\u0131)\n    \u2514\u2500\u2500 basic-usage\/\n        \u2514\u2500\u2500 main.tf\n<\/code><\/pre>\n<ul>\n<li><strong><code>main.tf<\/code>:<\/strong> Mod\u00fcl\u00fcn ana kaynaklar\u0131n\u0131 ve veri kaynaklar\u0131n\u0131 tan\u0131mlayan dosyad\u0131r. Buras\u0131, mod\u00fcl\u00fcn sa\u011flad\u0131\u011f\u0131 as\u0131l altyap\u0131 bile\u015fenlerinin bulundu\u011fu yerdir.<\/li>\n<li><strong><code>variables.tf<\/code>:<\/strong> Mod\u00fcl\u00fcn d\u0131\u015far\u0131dan alaca\u011f\u0131 giri\u015f de\u011fi\u015fkenlerini tan\u0131mlar. Bu de\u011fi\u015fkenler, mod\u00fcl\u00fcn davran\u0131\u015f\u0131n\u0131 ve olu\u015fturdu\u011fu kaynaklar\u0131n \u00f6zelliklerini \u00f6zelle\u015ftirmek i\u00e7in kullan\u0131l\u0131r.<\/li>\n<li><strong><code>outputs.tf<\/code>:<\/strong> Mod\u00fcl\u00fcn d\u0131\u015far\u0131ya a\u00e7t\u0131\u011f\u0131 \u00e7\u0131k\u0131\u015f de\u011ferlerini tan\u0131mlar. Bu de\u011ferler, mod\u00fcl\u00fc \u00e7a\u011f\u0131ran di\u011fer yap\u0131land\u0131rmalar veya mod\u00fcller taraf\u0131ndan kullan\u0131labilir.<\/li>\n<li><strong><code>versions.tf<\/code>:<\/strong> Mod\u00fcl\u00fcn gerektirdi\u011fi Terraform s\u00fcr\u00fcm\u00fcn\u00fc ve sa\u011flay\u0131c\u0131 (provider) s\u00fcr\u00fcmlerini belirtir. Bu, uyumluluk sorunlar\u0131n\u0131 \u00f6nlemek i\u00e7in \u00f6nemlidir.<\/li>\n<li><strong><code>locals.tf<\/code>:<\/strong> (\u0130ste\u011fe ba\u011fl\u0131) Yerel de\u011ferleri tan\u0131mlar. Yerel de\u011ferler, mod\u00fcl i\u00e7inde tekrarlayan ifadeleri veya karma\u015f\u0131k hesaplamalar\u0131 basitle\u015ftirmek i\u00e7in kullan\u0131l\u0131r. DRY (Don&#8217;t Repeat Yourself) prensibini uygulamaya yard\u0131mc\u0131 olur.<\/li>\n<li><strong><code>README.md<\/code>:<\/strong> Mod\u00fcl\u00fcn amac\u0131n\u0131, kullan\u0131m\u0131n\u0131, giri\u015f de\u011fi\u015fkenlerini, \u00e7\u0131k\u0131\u015f de\u011ferlerini ve \u00f6rneklerini a\u00e7\u0131klayan bir belgedir. \u0130yi bir <code>README.md<\/code> mod\u00fcl\u00fcn anla\u015f\u0131labilirli\u011fini ve kullan\u0131labilirli\u011fini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/li>\n<li><strong><code>examples\/<\/code>:<\/strong> (\u0130ste\u011fe ba\u011fl\u0131) Mod\u00fcl\u00fcn nas\u0131l kullan\u0131laca\u011f\u0131na dair \u00f6rnek yap\u0131land\u0131rmalar\u0131 i\u00e7erir. Bu, mod\u00fcl kullan\u0131c\u0131lar\u0131 i\u00e7in h\u0131zl\u0131 ba\u015flang\u0131\u00e7 k\u0131lavuzu g\u00f6revi g\u00f6r\u00fcr.<\/li>\n<\/ul>\n<h4>Giri\u015f De\u011fi\u015fkenleri (<code>variables.tf<\/code>)<\/h4>\n<p>Giri\u015f de\u011fi\u015fkenleri, mod\u00fcl\u00fcn\u00fcz\u00fcn esnekli\u011fini sa\u011flar. Bir de\u011fi\u015fken tan\u0131mlarken, a\u015fa\u011f\u0131daki \u00f6zellikleri kullanabilirsiniz:<\/p>\n<ul>\n<li><strong><code>description<\/code>:<\/strong> De\u011fi\u015fkenin amac\u0131n\u0131 a\u00e7\u0131klayan bir metin.<\/li>\n<li><strong><code>type<\/code>:<\/strong> De\u011fi\u015fkenin veri tipini belirtir (string, number, bool, list, map, object).<\/li>\n<li><strong><code>default<\/code>:<\/strong> De\u011fi\u015fken i\u00e7in varsay\u0131lan bir de\u011fer. Bu, de\u011fi\u015fkenin iste\u011fe ba\u011fl\u0131 olmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><strong><code>validation<\/code>:<\/strong> (Terraform 0.13+ ile geldi) De\u011fi\u015fkenin de\u011ferini do\u011frulamak i\u00e7in \u00f6zel kurallar tan\u0131mlar.<\/li>\n<li><strong><code>sensitive<\/code>:<\/strong> (Terraform 0.14+ ile geldi) Bu de\u011fi\u015fkenin de\u011ferinin Terraform \u00e7\u0131kt\u0131lar\u0131nda (plan, apply) gizlenmesini sa\u011flar. \u015eifreler veya API anahtarlar\u0131 gibi hassas bilgiler i\u00e7in kullan\u0131l\u0131r.<\/li>\n<\/ul>\n<p>\u00d6rnek bir de\u011fi\u015fken tan\u0131m\u0131:<\/p>\n<pre><code>\nvariable \"bucket_name\" {\n  description = \"S3 kovas\u0131n\u0131n benzersiz ad\u0131.\"\n  type        = string\n  default     = null # Varsay\u0131lan olarak bo\u015f b\u0131rak\u0131l\u0131r, kullan\u0131c\u0131 taraf\u0131ndan sa\u011flanmas\u0131 beklenir.\n\n  validation {\n    condition     = length(var.bucket_name) > 0 && can(regex(\"^[a-z0-9.-]+$\", var.bucket_name))\n    error_message = \"Kova ad\u0131 bo\u015f olamaz ve sadece k\u00fc\u00e7\u00fck harf, rakam, nokta ve tire i\u00e7ermelidir.\"\n  }\n}\n\nvariable \"tags\" {\n  description = \"Kovaya uygulanacak etiketler.\"\n  type        = map(string)\n  default     = {}\n}\n<\/code><\/pre>\n<h4>\u00c7\u0131k\u0131\u015f De\u011ferleri (<code>outputs.tf<\/code>)<\/h4>\n<p>\u00c7\u0131k\u0131\u015f de\u011ferleri, mod\u00fcl\u00fcn olu\u015fturdu\u011fu veya hesaplad\u0131\u011f\u0131 bilgileri d\u0131\u015f d\u00fcnyaya a\u00e7ar. Bu bilgiler, di\u011fer mod\u00fcller veya root yap\u0131land\u0131rmas\u0131 taraf\u0131ndan kullan\u0131labilir.<\/p>\n<ul>\n<li><strong><code>value<\/code>:<\/strong> \u00c7\u0131kar\u0131lacak de\u011fer. Bu genellikle bir kayna\u011f\u0131n niteli\u011fi veya bir yerel de\u011ferdir.<\/li>\n<li><strong><code>description<\/code>:<\/strong> \u00c7\u0131k\u0131\u015f de\u011ferinin amac\u0131n\u0131 a\u00e7\u0131klayan bir metin.<\/li>\n<li><strong><code>sensitive<\/code>:<\/strong> (Terraform 0.14+ ile geldi) Bu \u00e7\u0131k\u0131\u015f de\u011ferinin Terraform \u00e7\u0131kt\u0131lar\u0131nda gizlenmesini sa\u011flar.<\/li>\n<\/ul>\n<p>\u00d6rnek bir \u00e7\u0131k\u0131\u015f tan\u0131m\u0131:<\/p>\n<pre><code>\noutput \"bucket_arn\" {\n  description = \"Olu\u015fturulan S3 kovas\u0131n\u0131n ARN'si.\"\n  value       = aws_s3_bucket.this.arn\n}\n\noutput \"bucket_id\" {\n  description = \"Olu\u015fturulan S3 kovas\u0131n\u0131n ID'si.\"\n  value       = aws_s3_bucket.this.id\n}\n<\/code><\/pre>\n<h4>Yerel De\u011ferler (<code>locals.tf<\/code>)<\/h4>\n<p>Yerel de\u011ferler, mod\u00fcl i\u00e7indeki karma\u015f\u0131k ifadeleri veya tekrarlayan de\u011ferleri basitle\u015ftirmek i\u00e7in kullan\u0131l\u0131r. Bunlar, de\u011fi\u015fkenler gibi d\u0131\u015far\u0131dan beslenmez, yaln\u0131zca mod\u00fcl i\u00e7inde tan\u0131mlan\u0131r ve kullan\u0131l\u0131r.<\/p>\n<p>\u00d6rnek bir yerel de\u011fer tan\u0131m\u0131:<\/p>\n<pre><code>\nlocals {\n  full_bucket_name = var.environment == \"prod\" ? var.bucket_name : \"${var.environment}-${var.bucket_name}\"\n  common_tags = merge(var.tags, {\n    Environment = var.environment\n    ManagedBy   = \"Terraform\"\n  })\n}\n<\/code><\/pre>\n<p>Bu <code>full_bucket_name<\/code> ve <code>common_tags<\/code> de\u011ferleri, <code>main.tf<\/code> i\u00e7indeki kaynaklarda <code>local.full_bucket_name<\/code> ve <code>local.common_tags<\/code> olarak kullan\u0131labilir.<\/p>\n<h3>\u00d6rnek Bir Mod\u00fcl Olu\u015fturma: AWS S3 Kovas\u0131<\/h3>\n<p>\u015eimdi, standartla\u015ft\u0131r\u0131lm\u0131\u015f bir AWS S3 kovas\u0131 olu\u015fturan basit bir mod\u00fcl geli\u015ftirelim. Bu mod\u00fcl, kova ad\u0131, etiketler, eri\u015fim ayarlar\u0131 ve \u015fifreleme gibi temel \u00f6zellikleri yap\u0131land\u0131rmam\u0131za olanak tan\u0131yacak.<\/p>\n<h4>Senaryo<\/h4>\n<p>Amac\u0131m\u0131z, a\u015fa\u011f\u0131daki \u00f6zelliklere sahip bir S3 kovas\u0131 olu\u015fturmak i\u00e7in bir mod\u00fcl geli\u015ftirmektir:<\/p>\n<ul>\n<li>Benzersiz bir kova ad\u0131 alabilmeli.<\/li>\n<li>Ortam ve di\u011fer \u00f6zel etiketleri desteklemeli.<\/li>\n<li>Varsay\u0131lan olarak genel eri\u015fimi engellemeli.<\/li>\n<li>S\u00fcr\u00fcmleme (versioning) iste\u011fe ba\u011fl\u0131 olarak etkinle\u015ftirilebilmeli.<\/li>\n<li>Varsay\u0131lan sunucu taraf\u0131 \u015fifrelemesi (SSE-S3) olmal\u0131.<\/li>\n<\/ul>\n<h4>Ad\u0131m 1: Mod\u00fcl Dizini Olu\u015fturma<\/h4>\n<p>Mod\u00fcl i\u00e7in bir dizin olu\u015fturun:<\/p>\n<pre><code>\nmkdir s3-bucket\ncd s3-bucket\n<\/code><\/pre>\n<h4>Ad\u0131m 2: <code>versions.tf<\/code> \u0130\u00e7eri\u011fi<\/h4>\n<p>Gerekli Terraform ve AWS sa\u011flay\u0131c\u0131 s\u00fcr\u00fcmlerini belirtin:<\/p>\n<pre><code>\n<h2>s3-bucket\/versions.tf<\/h2>\nterraform {\n  required_version = \">= 1.0\"\n  required_providers {\n    aws = {\n      source  = \"hashicorp\/aws\"\n      version = \"~> 5.0\"\n    }\n  }\n}\n<\/code><\/pre>\n<h4>Ad\u0131m 3: <code>variables.tf<\/code> \u0130\u00e7eri\u011fi<\/h4>\n<p>Mod\u00fcl\u00fcn alaca\u011f\u0131 giri\u015f de\u011fi\u015fkenlerini tan\u0131mlay\u0131n:<\/p>\n<pre><code>\n<h2>s3-bucket\/variables.tf<\/h2>\n\nvariable \"bucket_name\" {\n  description = \"S3 kovas\u0131n\u0131n benzersiz ad\u0131. Bo\u015f b\u0131rak\u0131l\u0131rsa otomatik olu\u015fturulur.\"\n  type        = string\n  default     = null # E\u011fer null ise, Terraform otomatik bir isim olu\u015fturur.\n}\n\nvariable \"environment\" {\n  description = \"Mod\u00fcl\u00fcn da\u011f\u0131t\u0131ld\u0131\u011f\u0131 ortam (\u00f6rne\u011fin, dev, staging, prod).\"\n  type        = string\n  default     = \"dev\"\n}\n\nvariable \"tags\" {\n  description = \"Kovaya uygulanacak ek etiketler.\"\n  type        = map(string)\n  default     = {}\n}\n\nvariable \"block_public_acls\" {\n  description = \"S3 kovas\u0131 i\u00e7in genel ACL'leri engelle.\"\n  type        = bool\n  default     = true\n}\n\nvariable \"ignore_public_acls\" {\n  description = \"S3 kovas\u0131 i\u00e7in genel ACL'leri yoksay.\"\n  type        = bool\n  default     = true\n}\n\nvariable \"restrict_public_buckets\" {\n  description = \"S3 kovas\u0131 i\u00e7in genel kova politikalar\u0131n\u0131 k\u0131s\u0131tla.\"\n  type        = bool\n  default     = true\n}\n\nvariable \"block_public_policy\" {\n  description = \"S3 kovas\u0131 i\u00e7in genel kova politikalar\u0131n\u0131 engelle.\"\n  type        = bool\n  default     = true\n}\n\nvariable \"versioning_enabled\" {\n  description = \"S3 kova s\u00fcr\u00fcmlemeyi etkinle\u015ftir.\"\n  type        = bool\n  default     = true\n}\n\nvariable \"acl\" {\n  description = \"S3 kovas\u0131n\u0131n eri\u015fim kontrol listesi (ACL).\"\n  type        = string\n  default     = \"private\"\n  validation {\n    condition     = contains([\"private\", \"public-read\", \"public-read-write\", \"aws-exec-read\", \"authenticated-read\", \"bucket-owner-read\", \"bucket-owner-full-control\", \"log-delivery-write\"], var.acl)\n    error_message = \"Ge\u00e7ersiz ACL de\u011feri. Desteklenen de\u011ferler: private, public-read, public-read-write, aws-exec-read, authenticated-read, bucket-owner-read, bucket-owner-full-control, log-delivery-write.\"\n  }\n}\n<\/code><\/pre>\n<h4>Ad\u0131m 4: <code>locals.tf<\/code> \u0130\u00e7eri\u011fi (\u0130ste\u011fe Ba\u011fl\u0131 ama Faydal\u0131)<\/h4>\n<p>Ortak etiketleri ve kova ad\u0131n\u0131 y\u00f6netmek i\u00e7in yerel de\u011ferler kullan\u0131n:<\/p>\n<pre><code>\n<h2>s3-bucket\/locals.tf<\/h2>\n\nlocals {\n  # E\u011fer bucket_name sa\u011flanmad\u0131ysa, otomatik bir isim olu\u015fturulur.\n  # E\u011fer sa\u011fland\u0131ysa, ortam \u00f6neki eklenir (prod hari\u00e7).\n  final_bucket_name = var.bucket_name != null ? (\n    var.environment == \"prod\" ? var.bucket_name : \"${var.environment}-${var.bucket_name}\"\n  ) : null # E\u011fer null ise, aws_s3_bucket kayna\u011f\u0131 otomatik bir isim olu\u015fturur.\n\n  # Ortak etiketleri birle\u015ftir\n  common_tags = merge(var.tags, {\n    Environment = var.environment\n    ManagedBy   = \"Terraform\"\n    Module      = \"s3-bucket\"\n  })\n}\n<\/code><\/pre>\n<h4>Ad\u0131m 5: <code>main.tf<\/code> \u0130\u00e7eri\u011fi<\/h4>\n<p>S3 kovas\u0131n\u0131 ve ilgili ayarlar\u0131 tan\u0131mlay\u0131n:<\/p>\n<pre><code>\n<h2>s3-bucket\/main.tf<\/h2>\n\nresource \"aws_s3_bucket\" \"this\" {\n  # E\u011fer locals.final_bucket_name null ise, bucket \u00f6zelli\u011fi kullan\u0131lmaz ve AWS otomatik bir isim atar.\n  # Aksi takdirde, locals.final_bucket_name kullan\u0131l\u0131r.\n  bucket = local.final_bucket_name\n\n  acl    = var.acl\n  tags   = local.common_tags\n}\n\nresource \"aws_s3_bucket_public_access_block\" \"this\" {\n  bucket = aws_s3_bucket.this.id\n\n  block_public_acls       = var.block_public_acls\n  ignore_public_acls      = var.ignore_public_acls\n  restrict_public_buckets = var.restrict_public_buckets\n  block_public_policy     = var.block_public_policy\n}\n\nresource \"aws_s3_bucket_versioning\" \"this\" {\n  bucket = aws_s3_bucket.this.id\n  versioning_configuration {\n    status = var.versioning_enabled ? \"Enabled\" : \"Suspended\"\n  }\n}\n\nresource \"aws_s3_bucket_server_side_encryption_configuration\" \"this\" {\n  bucket = aws_s3_bucket.this.id\n\n  rule {\n    apply_server_side_encryption_by_default {\n      sse_algorithm = \"AES256\"\n    }\n  }\n}\n<\/code><\/pre>\n<h4>Ad\u0131m 6: <code>outputs.tf<\/code> \u0130\u00e7eri\u011fi<\/h4>\n<p>Mod\u00fcl\u00fcn d\u0131\u015far\u0131ya a\u00e7aca\u011f\u0131 de\u011ferleri tan\u0131mlay\u0131n:<\/p>\n<pre><code>\n<h2>s3-bucket\/outputs.tf<\/h2>\n\noutput \"bucket_id\" {\n  description = \"Olu\u015fturulan S3 kovas\u0131n\u0131n ID'si (ad\u0131).\"\n  value       = aws_s3_bucket.this.id\n}\n\noutput \"bucket_arn\" {\n  description = \"Olu\u015fturulan S3 kovas\u0131n\u0131n ARN'si.\"\n  value       = aws_s3_bucket.this.arn\n}\n\noutput \"bucket_domain_name\" {\n  description = \"Olu\u015fturulan S3 kovas\u0131n\u0131n domain ad\u0131.\"\n  value       = aws_s3_bucket.this.bucket_domain_name\n}\n<\/code><\/pre>\n<h4>Ad\u0131m 7: <code>README.md<\/code> Olu\u015fturma<\/h4>\n<p>Mod\u00fcl\u00fcn kullan\u0131m\u0131n\u0131 a\u00e7\u0131klayan bir <code>README.md<\/code> dosyas\u0131 ekleyin:<\/p>\n<pre><code>\n<h2>s3-bucket Terraform Mod\u00fcl\u00fc<\/h2>\n\nBu mod\u00fcl, standartla\u015ft\u0131r\u0131lm\u0131\u015f bir AWS S3 kovas\u0131 olu\u015fturur. Varsay\u0131lan olarak genel eri\u015fimi engeller, sunucu taraf\u0131 \u015fifrelemeyi (SSE-S3) etkinle\u015ftirir ve s\u00fcr\u00fcmlemeyi destekler.\n\n<h3>Kullan\u0131m<\/h3>\n\n<pre><code class=\"language-terraform\">module \"my_s3_bucket\" {\n  source = \".\/s3-bucket\" # Yerel bir dizin veya Git deposu olabilir.\n\n  bucket_name        = \"my-unique-application-bucket\"\n  environment        = \"prod\"\n  versioning_enabled = true\n  tags = {\n    Application = \"MyApp\"\n    Owner       = \"DevOpsTeam\"\n  }\n}\n\noutput \"s3_bucket_id\" {\n  value = module.my_s3_bucket.bucket_id\n}<\/code><\/pre>\n<h3>Giri\u015fler<\/h3>\n<p>| \u0130sim                      | A\u00e7\u0131klama                                       | Tip         | Varsay\u0131lan | Gerekli |<br \/>\n|---------------------------|------------------------------------------------|-------------|------------|---------|<br \/>\n| <code>acl<\/code>                     | S3 kovas\u0131n\u0131n eri\u015fim kontrol listesi (ACL).     | <code>string<\/code>    | <code>\"private\"<\/code>| no      |<br \/>\n| <code>block_public_acls<\/code>       | S3 kovas\u0131 i\u00e7in genel ACL'leri engelle.         | <code>bool<\/code>      | <code>true<\/code>     | no      |<br \/>\n| <code>block_public_policy<\/code>     | S3 kovas\u0131 i\u00e7in genel kova politikalar\u0131n\u0131 engelle.| <code>bool<\/code>      | <code>true<\/code>     | no      |<br \/>\n| <code>bucket_name<\/code>             | S3 kovas\u0131n\u0131n benzersiz ad\u0131. Bo\u015f b\u0131rak\u0131l\u0131rsa otomatik olu\u015fturulur. | <code>string<\/code> | <code>null<\/code>     | no      |<br \/>\n| <code>environment<\/code>             | Mod\u00fcl\u00fcn da\u011f\u0131t\u0131ld\u0131\u011f\u0131 ortam.                     | <code>string<\/code>    | <code>\"dev\"<\/code>    | no      |<br \/>\n| <code>ignore_public_acls<\/code>      | S3 kovas\u0131 i\u00e7in genel ACL'leri yoksay.          | <code>bool<\/code>      | <code>true<\/code>     | no      |<br \/>\n| <code>restrict_public_buckets<\/code> | S3 kovas\u0131 i\u00e7in genel kova politikalar\u0131n\u0131 k\u0131s\u0131tla.| <code>bool<\/code>      | <code>true<\/code>     | no      |<br \/>\n| <code>tags<\/code>                    | Kovaya uygulanacak ek etiketler.               | <code>map(string)<\/code>| <code>{}<\/code>       | no      |<br \/>\n| <code>versioning_enabled<\/code>      | S3 kova s\u00fcr\u00fcmlemeyi etkinle\u015ftir.               | <code>bool<\/code>      | <code>true<\/code>     | no      |<\/p>\n<h3>\u00c7\u0131k\u0131\u015flar<\/h3>\n<p>| \u0130sim               | A\u00e7\u0131klama                                 |<br \/>\n|--------------------|------------------------------------------|<br \/>\n| <code>bucket_arn<\/code>       | Olu\u015fturulan S3 kovas\u0131n\u0131n ARN'si.         |<br \/>\n| <code>bucket_id<\/code>        | Olu\u015fturulan S3 kovas\u0131n\u0131n ID'si (ad\u0131).    |<br \/>\n| <code>bucket_domain_name<\/code> | Olu\u015fturulan S3 kovas\u0131n\u0131n domain ad\u0131.     |<br \/>\n<\/code><\/p>\n<h4>Ad\u0131m 8: <code>examples\/<\/code> Dizini Olu\u015fturma<\/h4>\n<p>Mod\u00fcl\u00fcn nas\u0131l kullan\u0131laca\u011f\u0131na dair \u00f6rnek bir yap\u0131land\u0131rma olu\u015fturun.<br \/>\nAna dizine geri d\u00f6n\u00fcp bir <code>examples<\/code> dizini olu\u015fturun:<\/p>\n<pre><code>\ncd ..\nmkdir examples\nmkdir examples\/basic-s3-usage\n<\/code><\/pre>\n<p>\u015eimdi <code>examples\/basic-s3-usage\/main.tf<\/code> dosyas\u0131n\u0131 olu\u015fturun:<\/p>\n<pre><code>\n<h2>examples\/basic-s3-usage\/main.tf<\/h2>\n\nprovider \"aws\" {\n  region = \"us-east-1\" # Mod\u00fcl\u00fc test etmek i\u00e7in bir b\u00f6lge belirtin\n}\n\nmodule \"my_app_s3_bucket\" {\n  source = \"..\/..\/s3-bucket\" # Mod\u00fcl\u00fcn g\u00f6receli yolu\n\n  bucket_name        = \"my-awesome-app-data\"\n  environment        = \"staging\"\n  versioning_enabled = true\n  tags = {\n    Project = \"AwesomeApp\"\n    Owner   = \"PlatformTeam\"\n  }\n}\n\noutput \"staging_bucket_id\" {\n  description = \"Staging ortam\u0131 i\u00e7in S3 kovas\u0131n\u0131n ID'si.\"\n  value       = module.my_app_s3_bucket.bucket_id\n}\n\noutput \"staging_bucket_arn\" {\n  description = \"Staging ortam\u0131 i\u00e7in S3 kovas\u0131n\u0131n ARN'si.\"\n  value       = module.my_app_s3_bucket.bucket_arn\n}\n<\/code><\/pre>\n<h3>Mod\u00fcl\u00fc Kullanma ve Test Etme<\/h3>\n<p>Mod\u00fcl\u00fcn\u00fcz\u00fc olu\u015fturduktan sonra, onu \u00e7a\u011f\u0131ran bir yap\u0131land\u0131rma ile test etmeniz gerekir. <code>examples\/basic-s3-usage<\/code> dizinindeki \u00f6rne\u011fi kullanarak test edelim.<\/p>\n<h4>Mod\u00fcl\u00fc \u00c7a\u011f\u0131rma<\/h4>\n<p>Mod\u00fcller, <code>module<\/code> blo\u011fu kullan\u0131larak \u00e7a\u011fr\u0131l\u0131r. <code>source<\/code> ba\u011f\u0131ms\u0131z de\u011fi\u015fkeni, mod\u00fcl\u00fcn nerede bulundu\u011funu belirtir. Bu, yerel bir dosya sistemi yolu, bir Git deposu URL&#8217;si veya Terraform Registry&#8217;deki bir mod\u00fcl olabilir.<\/p>\n<pre><code>\nmodule \"module_ad\u0131\" {\n  source = \".\/mod\u00fcl_dizini\" # Yerel mod\u00fcl\n  # source = \"git::https:\/\/example.com\/repo.git?ref=v1.0.0\" # Git deposu\n  # source = \"hashicorp\/s3-bucket\/aws\" # Terraform Registry\n\n  giri\u015f_de\u011fi\u015fkeni_1 = \"de\u011fer_1\"\n  giri\u015f_de\u011fi\u015fkeni_2 = \"de\u011fer_2\"\n}\n<\/code><\/pre>\n<h4>Terraform Komutlar\u0131<\/h4>\n<p>\u00d6rnek dizinine gidin ve a\u015fa\u011f\u0131daki Terraform komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code>\ncd examples\/basic-s3-usage\n\nterraform init\n<\/code><\/pre>\n<p>Bu komut, mod\u00fcl\u00fc indirir ve gerekli sa\u011flay\u0131c\u0131lar\u0131 kurar.<\/p>\n<pre><code>\nterraform plan\n<\/code><\/pre>\n<p>Bu komut, Terraform&#8217;un uygulayaca\u011f\u0131 de\u011fi\u015fiklikleri g\u00f6sterir. Mod\u00fcl\u00fcn\u00fcz\u00fcn beklenen kaynaklar\u0131 olu\u015fturup olu\u015fturmad\u0131\u011f\u0131n\u0131 ve de\u011fi\u015fkenlerin do\u011fru \u015fekilde i\u015flendi\u011fini kontrol edin.<\/p>\n<pre><code>\nterraform apply\n<\/code><\/pre>\n<p>Bu komut, planlanan de\u011fi\u015fiklikleri uygular ve S3 kovas\u0131n\u0131 AWS hesab\u0131n\u0131zda olu\u015fturur.<\/p>\n<pre><code>\nterraform destroy\n<\/code><\/pre>\n<p>Testleriniz bitti\u011finde kaynaklar\u0131 temizlemek i\u00e7in bu komutu kullan\u0131n.<\/p>\n<h4>Test Stratejileri<\/h4>\n<ul>\n<li><strong>Manuel Test:<\/strong> Geli\u015ftirmenin ilk a\u015famalar\u0131nda <code>terraform plan<\/code> ve <code>terraform apply<\/code> ile manuel olarak kontrol etmek faydal\u0131d\u0131r.<\/li>\n<li><strong>Otomatik Testler:<\/strong> Daha olgun mod\u00fcller i\u00e7in otomatik test ara\u00e7lar\u0131 kullanmak \u00f6nemlidir.\n<ul>\n<li><strong>Terratest:<\/strong> Go dilinde yaz\u0131lm\u0131\u015f bir k\u00fct\u00fcphanedir ve ger\u00e7ek altyap\u0131 \u00fczerinde entegrasyon testleri yapman\u0131z\u0131 sa\u011flar.<\/li>\n<li><strong>Kitchen-Terraform:<\/strong> Test Kitchen \u00e7er\u00e7evesini kullanarak Terraform mod\u00fcllerini test etmenizi sa\u011flar.<\/li>\n<li><strong>InSpec\/Serverspec:<\/strong> Sa\u011flanan altyap\u0131n\u0131n beklenen durumu kar\u015f\u0131lay\u0131p kar\u015f\u0131lamad\u0131\u011f\u0131n\u0131 do\u011frulayan denetim ara\u00e7lar\u0131d\u0131r.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Statik Analiz:<\/strong> Kod kalitesini ve g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 kontrol etmek i\u00e7in ara\u00e7lar:\n<ul>\n<li><strong>Terraform Validate:<\/strong> Terraform yap\u0131land\u0131rmas\u0131n\u0131n s\u00f6zdizimsel olarak ge\u00e7erli olup olmad\u0131\u011f\u0131n\u0131 kontrol eder.<\/li>\n<li><strong>TFLint:<\/strong> Terraform kodunuzda hatalar\u0131, tutars\u0131zl\u0131klar\u0131 ve en iyi uygulama ihlallerini bulan bir linter.<\/li>\n<li><strong>Checkov:<\/strong> Bulut yap\u0131land\u0131rmalar\u0131ndaki g\u00fcvenlik ve uyumluluk sorunlar\u0131n\u0131 bulan bir statik analiz arac\u0131.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>\u0130yi Uygulama \u00d6rnekleri ve \u0130pu\u00e7lar\u0131<\/h3>\n<h4>Mod\u00fclerlik ve Tek Sorumluluk Prensibi (SRP)<\/h4>\n<p>Her mod\u00fcl\u00fcn tek bir \u015feyi iyi yapmas\u0131n\u0131 sa\u011flay\u0131n. \u00d6rne\u011fin, bir S3 kovas\u0131 mod\u00fcl\u00fc yaln\u0131zca S3 kovas\u0131yla ilgili kaynaklar\u0131 ve yap\u0131land\u0131rmalar\u0131 i\u00e7ermelidir, bir EC2 \u00f6rne\u011fi veya bir veritaban\u0131 ile ilgili kaynaklar\u0131 de\u011fil. Bu, mod\u00fcllerinizi daha anla\u015f\u0131l\u0131r, bak\u0131m\u0131 kolay ve yeniden kullan\u0131labilir hale getirir.<\/p>\n<h4>Versiyonlama<\/h4>\n<p>Mod\u00fcllerinizi anlamsal versiyonlama (Semantic Versioning &#8211; SemVer) kurallar\u0131na g\u00f6re versiyonlay\u0131n (\u00f6rne\u011fin, <code>v1.0.0<\/code>, <code>v1.1.0<\/code>, <code>v2.0.0<\/code>). Bu, mod\u00fcl kullan\u0131c\u0131lar\u0131n\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00f6netmelerine ve k\u0131r\u0131c\u0131 de\u011fi\u015fikliklerden ka\u00e7\u0131nmalar\u0131na yard\u0131mc\u0131 olur. Bir mod\u00fcl\u00fcn <code>versions.tf<\/code> dosyas\u0131nda <code>required_version<\/code> ve <code>required_providers<\/code> bloklar\u0131n\u0131 kullanarak ba\u011f\u0131ml\u0131l\u0131klar\u0131 a\u00e7\u0131k\u00e7a belirtin.<\/p>\n<h4>Kapsaml\u0131 Dok\u00fcmantasyon (<code>README.md<\/code>)<\/h4>\n<p>Mod\u00fcl\u00fcn\u00fcz\u00fcn <code>README.md<\/code> dosyas\u0131, mod\u00fcl\u00fcn amac\u0131, nas\u0131l kullan\u0131laca\u011f\u0131, t\u00fcm giri\u015f de\u011fi\u015fkenleri (a\u00e7\u0131klamalar\u0131, tipleri, varsay\u0131lan de\u011ferleri) ve \u00e7\u0131k\u0131\u015f de\u011ferleri hakk\u0131nda net ve eksiksiz bilgi i\u00e7ermelidir. \u0130yi dok\u00fcmantasyon, mod\u00fcl\u00fcn\u00fcz\u00fcn benimsenmesini ve do\u011fru kullan\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>Giri\u015f De\u011fi\u015fkenleri Tasar\u0131m\u0131<\/h4>\n<ul>\n<li><strong>Minimum Gerekli De\u011fi\u015fkenler:<\/strong> Yaln\u0131zca mod\u00fcl\u00fcn esnekli\u011fi i\u00e7in kesinlikle gerekli olan de\u011fi\u015fkenleri tan\u0131mlay\u0131n. \u00c7ok fazla de\u011fi\u015fken, mod\u00fcl\u00fc karma\u015f\u0131k hale getirebilir.<\/li>\n<li><strong>Mant\u0131kl\u0131 Varsay\u0131lan De\u011ferler:<\/strong> M\u00fcmk\u00fcn oldu\u011funca varsay\u0131lan de\u011ferler sa\u011flay\u0131n. Bu, mod\u00fcl\u00fcn kullan\u0131m\u0131n\u0131 basitle\u015ftirir ve kullan\u0131c\u0131lar\u0131n yaln\u0131zca \u00f6zel gereksinimleri oldu\u011funda de\u011fi\u015fkenleri ge\u00e7irmesini sa\u011flar.<\/li>\n<li><strong><code>validation<\/code> Bloklar\u0131:<\/strong> Giri\u015f de\u011fi\u015fkenlerinin beklenen formatta veya aral\u0131kta oldu\u011funu do\u011frulamak i\u00e7in <code>validation<\/code> bloklar\u0131n\u0131 kullan\u0131n. Bu, hatalar\u0131 erken a\u015famada yakalaman\u0131za yard\u0131mc\u0131 olur.<\/li>\n<li><strong>Karma\u015f\u0131k Tipler (list, map, object):<\/strong> Benzer yap\u0131daki birden \u00e7ok kayna\u011f\u0131 veya karma\u015f\u0131k yap\u0131land\u0131rmalar\u0131 y\u00f6netmek i\u00e7in <code>list<\/code>, <code>map<\/code> veya <code>object<\/code> tiplerini kullanmaktan \u00e7ekinmeyin.<\/li>\n<\/ul>\n<h4>\u00c7\u0131k\u0131\u015f De\u011ferleri<\/h4>\n<p>Yaln\u0131zca mod\u00fcl\u00fcn d\u0131\u015f\u0131na a\u00e7\u0131lmas\u0131 gereken de\u011ferleri \u00e7\u0131k\u0131\u015f olarak tan\u0131mlay\u0131n. Mod\u00fcl\u00fcn i\u00e7 detaylar\u0131n\u0131 gereksiz yere d\u0131\u015far\u0131ya s\u0131zd\u0131rmay\u0131n. Hassas bilgileri (\u00f6rne\u011fin, veritaban\u0131 \u015fifreleri) <code>sensitive = true<\/code> ile i\u015faretleyin.<\/p>\n<h4>Yerel De\u011ferler<\/h4>\n<p>Tekrarlayan ifadeleri, karma\u015f\u0131k hesaplamalar\u0131 veya t\u00fcretilmi\u015f de\u011ferleri basitle\u015ftirmek i\u00e7in <code>locals<\/code> bloklar\u0131n\u0131 kullan\u0131n. Bu, kodunuzu daha okunabilir ve bak\u0131m\u0131 kolay hale getirir.<\/p>\n<h4>Sa\u011flay\u0131c\u0131 Bloklar\u0131<\/h4>\n<p>Mod\u00fcl i\u00e7inde sa\u011flay\u0131c\u0131 (provider) bloklar\u0131 tan\u0131mlamaktan ka\u00e7\u0131n\u0131n (\u00f6rne\u011fin, <code>provider \"aws\" { ... }<\/code>). Sa\u011flay\u0131c\u0131 yap\u0131land\u0131rmas\u0131 genellikle root mod\u00fclde yap\u0131lmal\u0131 ve mod\u00fcl, root mod\u00fcl\u00fcn sa\u011flay\u0131c\u0131 yap\u0131land\u0131rmas\u0131n\u0131 devralmal\u0131d\u0131r. Bu, mod\u00fcl\u00fcn farkl\u0131 AWS hesaplar\u0131nda veya b\u00f6lgelerinde kolayca kullan\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>Terraform Registry<\/h4>\n<p>E\u011fer mod\u00fcl\u00fcn\u00fcz\u00fc geni\u015f bir kitleyle payla\u015fmay\u0131 planl\u0131yorsan\u0131z, Terraform Registry&#8217;yi kullanmay\u0131 d\u00fc\u015f\u00fcn\u00fcn. Registry, mod\u00fcl\u00fcn\u00fcz\u00fc da\u011f\u0131tmak, ke\u015ffedilebilirli\u011fini art\u0131rmak ve versiyonlamay\u0131 y\u00f6netmek i\u00e7in bir platform sa\u011flar.<\/p>\n<h4>Kullan\u0131m \u00d6rnekleri (<code>examples\/<\/code>)<\/h4>\n<p>Mod\u00fcl\u00fcn\u00fcz\u00fcn nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 g\u00f6steren basit ve anla\u015f\u0131l\u0131r \u00f6rnekler i\u00e7eren bir <code>examples\/<\/code> dizini ekleyin. Bu, kullan\u0131c\u0131lar\u0131n mod\u00fcl\u00fc h\u0131zl\u0131 bir \u015fekilde anlamalar\u0131na ve entegre etmelerine yard\u0131mc\u0131 olur.<\/p>\n<h3>Geli\u015fmi\u015f Konulara K\u0131sa Bir Bak\u0131\u015f<\/h3>\n<h4>Ko\u015fullu Kaynaklar (<code>count<\/code> ve <code>for_each<\/code>)<\/h4>\n<p>Bazen bir mod\u00fcl\u00fcn belirli bir kayna\u011f\u0131 olu\u015fturup olu\u015fturmayaca\u011f\u0131na karar vermesi gerekebilir. Bunu <code>count<\/code> veya <code>for_each<\/code> meta-arg\u00fcmanlar\u0131 ile yapabilirsiniz:<\/p>\n<ul>\n<li><strong><code>count<\/code>:<\/strong> Bir kaynak \u00f6rne\u011finin olu\u015fturulup olu\u015fturulmayaca\u011f\u0131n\u0131 veya ka\u00e7 tane olu\u015fturulaca\u011f\u0131n\u0131 kontrol eder. <code>count = var.enable_resource ? 1 : 0<\/code> gibi ifadelerle ko\u015fullu olarak kaynak olu\u015fturabilirsiniz.<\/li>\n<li><strong><code>for_each<\/code>:<\/strong> Bir map veya set&#8217;teki her \u00f6\u011fe i\u00e7in bir kaynak \u00f6rne\u011fi olu\u015fturur. Bu, daha dinamik ve esnek kaynak olu\u015fturma senaryolar\u0131 i\u00e7in idealdir.<\/li>\n<\/ul>\n<h4>Dinamik Bloklar<\/h4>\n<p>Dinamik bloklar, bir kaynak i\u00e7indeki tekrarlayan bloklar\u0131 (\u00f6rne\u011fin, bir g\u00fcvenlik grubundaki ingress kurallar\u0131) programatik olarak olu\u015fturman\u0131za olanak tan\u0131r. Bu, mod\u00fcl\u00fcn\u00fcz\u00fcn daha esnek ve yap\u0131land\u0131r\u0131labilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>Mod\u00fcl Kaynaklar\u0131<\/h4>\n<p>Mod\u00fcller, farkl\u0131 kaynaklardan y\u00fcklenebilir:<\/p>\n<ul>\n<li><strong>Yerel Dosya Sistemi:<\/strong> Ayn\u0131 depoda veya yerel bir yolda bulunan mod\u00fcller (<code>source = \".\/modules\/my-module\"<\/code>).<\/li>\n<li><strong>Uzak Git Depolar\u0131:<\/strong> GitHub, GitLab, Bitbucket gibi Git depolar\u0131nda bar\u0131nd\u0131r\u0131lan mod\u00fcller (<code>source = \"git::https:\/\/github.com\/org\/repo.git?ref=v1.0.0\"<\/code>).<\/li>\n<li><strong>Terraform Registry:<\/strong> HashiCorp&#8217;un resmi mod\u00fcl kay\u0131t defteri (<code>source = \"hashicorp\/vpc\/aws\"<\/code>).<\/li>\n<li><strong>HTTP\/S3\/GCS:<\/strong> Tarball olarak depolanan mod\u00fcller.<\/li>\n<\/ul>\n<h4>Meta-Arguments (<code>depends_on<\/code>, <code>lifecycle<\/code>)<\/h4>\n<p>Geli\u015fmi\u015f senaryolarda <code>depends_on<\/code> ile kaynaklar aras\u0131ndaki \u00f6rt\u00fck ba\u011f\u0131ml\u0131l\u0131klar\u0131n yeterli olmad\u0131\u011f\u0131 durumlarda a\u00e7\u0131k ba\u011f\u0131ml\u0131l\u0131klar tan\u0131mlayabilir veya <code>lifecycle<\/code> bloklar\u0131 ile kaynaklar\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc davran\u0131\u015flar\u0131n\u0131 (\u00f6rne\u011fin, <code>prevent_destroy<\/code>, <code>ignore_changes<\/code>) \u00f6zelle\u015ftirebilirsiniz.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Terraform mod\u00fclleri, altyap\u0131y\u0131 kod olarak y\u00f6netmenin temel bir par\u00e7as\u0131d\u0131r. Kendi \u00f6zel mod\u00fcllerinizi olu\u015fturmak, organizasyonunuzun altyap\u0131 da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini standartla\u015ft\u0131rman\u0131n, otomatikle\u015ftirmeyi art\u0131rman\u0131n ve karma\u015f\u0131kl\u0131\u011f\u0131 y\u00f6netmenin g\u00fc\u00e7l\u00fc bir yoludur. Bu makalede ele al\u0131nan ad\u0131mlar\u0131 ve en iyi uygulamalar\u0131 takip ederek, yeniden kullan\u0131labilir, bak\u0131m\u0131 kolay ve sa\u011flam Terraform mod\u00fclleri geli\u015ftirebilirsiniz.<\/p>\n<p>Mod\u00fcl geli\u015ftirme, s\u00fcrekli bir \u00f6\u011frenme ve iyile\u015ftirme s\u00fcrecidir. Topluluktan ilham al\u0131n, a\u00e7\u0131k kaynak mod\u00fclleri inceleyin ve kendi mod\u00fcllerinizi geli\u015ftirirken esnekli\u011fi, g\u00fcvenli\u011fi ve performans\u0131n\u0131 her zaman g\u00f6z \u00f6n\u00fcnde bulundurun. \u0130yi tasarlanm\u0131\u015f mod\u00fcller, DevOps ekiplerinin verimlili\u011fini art\u0131r\u0131rken, altyap\u0131 tutarl\u0131l\u0131\u011f\u0131n\u0131 ve g\u00fcvenli\u011fini sa\u011flamaya yard\u0131mc\u0131 olur. \u00d6zel mod\u00fcllerinizle, altyap\u0131 y\u00f6netiminde bir sonraki seviyeye ge\u00e7meye haz\u0131rs\u0131n\u0131z.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"\u00d6zel Bir Terraform Mod\u00fcl\u00fc Nas\u0131l Olu\u015fturulur?\nGiri\u015f\nModern bulut altyap\u0131s\u0131 y\u00f6netimi, karma\u015f\u0131kl\u0131\u011f\u0131 azaltmak, tekrarlanabilirli\u011fi sa\u011fla","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-36299","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>\u00d6zel Bir Terraform Mod\u00fcl\u00fc Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/ozel-bir-terraform-modulu-nasil-olusturulur\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u00d6zel Bir Terraform Mod\u00fcl\u00fc Nas\u0131l Olu\u015fturulur?\" \/>\n<meta property=\"og:description\" content=\"\u00d6zel Bir Terraform Mod\u00fcl\u00fc Nas\u0131l Olu\u015fturulur? Giri\u015f Modern bulut altyap\u0131s\u0131 y\u00f6netimi, karma\u015f\u0131kl\u0131\u011f\u0131 azaltmak, tekrarlanabilirli\u011fi sa\u011fla\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/ozel-bir-terraform-modulu-nasil-olusturulur\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-12T23:40:49+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"19 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ozel-bir-terraform-modulu-nasil-olusturulur\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ozel-bir-terraform-modulu-nasil-olusturulur\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"\u00d6zel Bir Terraform Mod\u00fcl\u00fc Nas\u0131l Olu\u015fturulur?\",\"datePublished\":\"2025-12-12T23:40:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ozel-bir-terraform-modulu-nasil-olusturulur\/\"},\"wordCount\":2670,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ozel-bir-terraform-modulu-nasil-olusturulur\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ozel-bir-terraform-modulu-nasil-olusturulur\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/ozel-bir-terraform-modulu-nasil-olusturulur\/\",\"name\":\"\u00d6zel Bir Terraform Mod\u00fcl\u00fc Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-12T23:40:49+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ozel-bir-terraform-modulu-nasil-olusturulur\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ozel-bir-terraform-modulu-nasil-olusturulur\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ozel-bir-terraform-modulu-nasil-olusturulur\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u00d6zel Bir Terraform Mod\u00fcl\u00fc Nas\u0131l Olu\u015fturulur?\"}]},{\"@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":"\u00d6zel Bir Terraform Mod\u00fcl\u00fc Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/ozel-bir-terraform-modulu-nasil-olusturulur\/","og_locale":"tr_TR","og_type":"article","og_title":"\u00d6zel Bir Terraform Mod\u00fcl\u00fc Nas\u0131l Olu\u015fturulur?","og_description":"\u00d6zel Bir Terraform Mod\u00fcl\u00fc Nas\u0131l Olu\u015fturulur? Giri\u015f Modern bulut altyap\u0131s\u0131 y\u00f6netimi, karma\u015f\u0131kl\u0131\u011f\u0131 azaltmak, tekrarlanabilirli\u011fi sa\u011fla","og_url":"https:\/\/fatihsoysal.com\/blog\/ozel-bir-terraform-modulu-nasil-olusturulur\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-12T23:40:49+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"19 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/ozel-bir-terraform-modulu-nasil-olusturulur\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/ozel-bir-terraform-modulu-nasil-olusturulur\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"\u00d6zel Bir Terraform Mod\u00fcl\u00fc Nas\u0131l Olu\u015fturulur?","datePublished":"2025-12-12T23:40:49+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/ozel-bir-terraform-modulu-nasil-olusturulur\/"},"wordCount":2670,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/ozel-bir-terraform-modulu-nasil-olusturulur\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/ozel-bir-terraform-modulu-nasil-olusturulur\/","url":"https:\/\/fatihsoysal.com\/blog\/ozel-bir-terraform-modulu-nasil-olusturulur\/","name":"\u00d6zel Bir Terraform Mod\u00fcl\u00fc Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-12T23:40:49+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/ozel-bir-terraform-modulu-nasil-olusturulur\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/ozel-bir-terraform-modulu-nasil-olusturulur\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/ozel-bir-terraform-modulu-nasil-olusturulur\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"\u00d6zel Bir Terraform Mod\u00fcl\u00fc Nas\u0131l Olu\u015fturulur?"}]},{"@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\/36299","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=36299"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36299\/revisions"}],"predecessor-version":[{"id":36300,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36299\/revisions\/36300"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36299"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36299"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36299"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}