Terraform Portföyünüzü Nasıl Oluşturursunuz? Projeler ve Dersler
Terraform ile kariyerinizi şekillendirmek mi istiyorsunuz? Günümüzün hızlı değişen teknoloji dünyasında, Infrastructure as Code (IaC) kavramı, modern IT altyapılarının yönetilmesinde vazgeçilmez bir hale geldi. Özellikle Terraform, altyapıyı kod olarak tanımlama ve yönetme yeteneği sayesinde DevOps mühendisleri, bulut mimarları ve sistem yöneticileri için kritik bir araç haline gelmiştir. Peki, bu dinamik alanda yetkinliğinizi nasıl kanıtlayacaksınız? İşverenlere sadece teorik bilginizi değil, aynı zamanda pratik uygulama becerilerinizi göstermenin en etkili yolu, sağlam ve kapsamlı bir Terraform portföyü oluşturmaktan geçiyor. Bu rehberde, etkili bir Terraform portföyü oluşturmanın adımlarını, gerçek dünya projelerini, değerli dersleri ve dikkat etmeniz gereken püf noktalarını keşfedeceksiniz. Kapsamlı projelerle dolu bir portföy sayesinde, yeni iş fırsatlarına kapı aralayabilir ve kariyerinizi bir üst seviyeye taşıyabilirsiniz.
Günümüzün rekabetçi teknoloji pazarında, sadece teorik bilgiye sahip olmak genellikle yeterli değildir. İşverenler, adayların gerçek dünya problemleri çözme ve pratik uygulamalar geliştirme becerilerini görmek isterler. İşte tam da bu noktada bir Terraform portföyü devreye girer ve sizi diğer adaylardan ayırır. Bir portföy, sizin sadece Terraform komutlarını bildiğinizi değil, aynı zamanda bulut altyapılarını tasarlama, dağıtma, yönetme ve sorun giderme yeteneğine sahip olduğunuzu gösterir. Bu, somut ve ölçülebilir bir kanıttır.
Infrastructure as Code (IaC) prensipleri, altyapı yönetimini yazılım geliştirme disiplinleriyle birleştirerek tekrarlanabilirliği, otomasyonu ve sürüm kontrolünü sağlar. Terraform ise bu prensiplerin en güçlü temsilcilerinden biridir. Bir Terraform portföyü oluşturmak, sadece teknik becerilerinizi sergilemekle kalmaz, aynı zamanda sürekli öğrenme ve kendinizi geliştirme arzunuzu da ortaya koyar. GitHub veya GitLab gibi platformlarda barındırdığınız projeler, potansiyel işverenlerin kod kalitenizi, modüler tasarım anlayışınızı, güvenlik yaklaşımlarınızı ve dokümantasyon becerilerinizi doğrudan değerlendirmelerine olanak tanır. Ayrıca, farklı bulut sağlayıcıları (AWS, Azure, GCP) ve çeşitli servisler (EC2, Lambda, Kubernetes, S3, Azure App Service, Google Cloud Run) üzerinde çalıştığınız projelerle çok yönlülüğünüzü gösterebilirsiniz. Bu da sizi, farklı teknoloji yığınlarına hızla adapte olabilecek değerli bir profesyonel yapar.
Bir portföy, mülakatlarda konuşacak somut örnekler sunmanızı sağlar. “Şu projeyi yaparken X sorunla karşılaştım ve Y çözümünü uyguladım” demek, soyut cevaplardan çok daha etkilidir. Bu durum, hem teknik bilginizi hem de problem çözme yeteneğinizi kanıtlar. Ayrıca, projeler üzerinde çalışırken kendinizi sürekli geliştirirsiniz. Yeni modüller keşfeder, en iyi uygulamaları öğrenir ve farklı senaryoları deneme fırsatı bulursunuz. Bu süreç, teorik bilginizi pekiştirirken aynı zamanda pratik deneyiminizi artırır. Kısacası, bir Terraform portföyü, kariyeriniz için bir yatırım olup, kapıları açan bir anahtar görevi görür. Özellikle DevOps, Cloud Engineer veya Site Reliability Engineer (SRE) gibi rollerde, pratik Terraform deneyimi artık bir ön şart haline gelmiştir. Bu nedenle, kendi portföyünüzü oluşturmak sadece bir tavsiye değil, aynı zamanda bir zorunluluktur.
Terraform Temellerini Anlamak: Nereden Başlamalıyım?
Terraform dünyasına adım atmadan önce, temel kavramları sağlam bir şekilde anlamak kritik öneme sahiptir. Terraform, HashiCorp tarafından geliştirilen açık kaynaklı bir Infrastructure as Code (IaC) aracıdır. Amacı, bulut ve şirket içi altyapıyı güvenli ve verimli bir şekilde kurmak, değiştirmek ve sürümünü yönetmektir. Temelde, istediğiniz altyapı durumunu bildirimsel (declarative) bir dille (HashiCorp Configuration Language – HCL) tanımlarsınız ve Terraform, bu durumu gerçekleştirmek için gerekli adımları atar.
Başlangıç noktası olarak, Terraform’un nasıl çalıştığını, temel komutlarını ve ana bileşenlerini öğrenmelisiniz. İşte bilmeniz gereken temel kavramlar:
- Sağlayıcılar (Providers): Terraform, AWS, Azure, GCP, Kubernetes gibi çeşitli altyapı platformlarıyla etkileşim kurmak için sağlayıcıları kullanır. Her sağlayıcı, belirli API’lerle entegre olur ve bu platformlardaki kaynakları yönetmek için araçlar sunar. Örneğin, AWS sağlayıcısı, EC2实例 (örnekler), S3 kovaları ve VPC’ler gibi AWS kaynaklarını oluşturmanıza olanak tanır.
- Kaynaklar (Resources): Kaynaklar, altyapınızın temel yapı taşlarıdır. Bir EC2 örneği, bir S3 kovası, bir Azure sanal ağı veya bir GCP Compute Engine örneği, hepsi birer kaynaktır. Kaynaklar, sağlayıcılar aracılığıyla tanımlanır ve konfigürasyon dosyalarınızda
resourcebloğu ile belirtilir. - Veri Kaynakları (Data Sources): Veri kaynakları, Terraform’un halihazırda mevcut olan altyapı bilgilerini okumasını sağlar. Örneğin, mevcut bir AMI’nin ID’sini dinamik olarak almak veya belirli bir VPC’nin ID’sini bulmak için veri kaynaklarını kullanabilirsiniz. Bu, Terraform’u mevcut ortamlarla entegre etmek için çok önemlidir.
- Durum Dosyası (State File): Terraform, yönettiği altyapının durumunu
.tfstateadlı bir dosyada saklar. Bu dosya, Terraform’un gerçek dünya altyapınız ile konfigürasyonunuz arasında bir köprü görevi görmesini sağlar. Hangi kaynakların ne durumda olduğunu takip eder. Durum dosyasının güvenliği ve doğru yönetimi hayati öneme sahiptir; genellikle S3 veya Azure Blob Storage gibi uzak arka uçlar (remote backends) kullanılarak merkezi ve kilitli bir şekilde saklanır. - Modüller (Modules): Modüller, yeniden kullanılabilir Terraform konfigürasyonlarıdır. Kendi modüllerinizi yazabilir veya Terraform Registry’deki halka açık modülleri kullanabilirsiniz. Modüller, kod tekrarını azaltır, karmaşıklığı yönetilebilir hale getirir ve konfigürasyonunuzu daha düzenli hale getirir.
- Çalışma Alanları (Workspaces): Çalışma alanları, aynı konfigürasyon üzerinde farklı ortamları (örneğin, geliştirme, test, üretim) yönetmenize olanak tanır. Her çalışma alanı kendi durum dosyasına sahiptir, bu da farklı ortamların birbirinden bağımsız olarak yönetilebilmesini sağlar.
Terraform’un temel komutları ise şunlardır:
terraform init: Çalışma dizinini başlatır, sağlayıcı eklentilerini ve modülleri indirir.terraform plan: Konfigürasyonunuzun mevcut altyapı ile karşılaştırılması sonucunda yapılacak değişiklikleri gösterir. Bu, altyapınızda ne gibi değişiklikler olacağını önceden görmenizi sağlar.terraform apply: Planlanan değişiklikleri uygular ve altyapınızı konfigürasyon dosyanızda tanımladığınız duruma getirir.terraform destroy: Terraform tarafından yönetilen tüm kaynakları yok eder. Bu komutu kullanırken çok dikkatli olunmalıdır.
Bu temel kavramları ve komutları kavradıktan sonra, basit projelerle pratik yapmaya başlayabilirsiniz. İlk adım olarak, favori bulut sağlayıcınızda (AWS, Azure, GCP) küçük bir sanal makine oluşturma veya bir depolama kovası kurma gibi basit senaryolarla başlayın. İşte AWS için basit bir EC2 örneği oluşturan bir Terraform kodu:
provider "aws" {
region = "us-east-1"
}
resource "aws_instance" "example" {
ami = "ami-0abcdef1234567890" # Lütfen güncel ve geçerli bir AMI ID kullanın
instance_type = "t2.micro"
tags = {
Name = "Terraform-Portfolio-Instance"
}
}
Yukarıdaki kodu çalıştırdığınızda, us-east-1 bölgesinde t2.micro tipinde bir EC2 instance'ı oluşturulacaktır. Unutmayın, AMI ID'sini kendi bölgenize uygun güncel bir ID ile değiştirmeniz gerekmektedir. Bu başlangıç projeleri, Terraform'un gücünü anlamanız ve kendinize güven kazanmanız için harika bir yoldur.
Terraform Portföy Projeleri Fikirleri: Hangi Senaryoları Uygulamalıyım?
Terraform portföyünüzü oluştururken, farklı karmaşıklık seviyelerine sahip projeleri dahil etmek, çok yönlülüğünüzü ve derinlemesine bilginizi göstermenin anahtarıdır. İşte size ilham verecek ve becerilerinizi sergilemenize yardımcı olacak çeşitli proje fikirleri:
Basit Düzey Projeler: Terraform ile İlk Adımlarınız
Bu projeler, Terraform'a yeni başlayanlar için idealdir ve temel bulut kaynaklarının dağıtımını kapsar. Amaç, temel komutları ve kaynak tanımlamalarını pekiştirmektir.
- Basit Web Sunucusu Dağıtımı:
- Senaryo: AWS, Azure veya GCP üzerinde tek bir sanal makine (EC2, Azure VM, GCP Compute Engine) ve ona erişimi sağlayan bir güvenlik grubu (Security Group, Network Security Group) dağıtımı.
- Kullanılan Terraform Konseptleri:
provider,resource,variable,output. - Ekstralar: Bir VPC ve alt ağ oluşturma, SSH erişimi için anahtar çifti oluşturma,
user_datakullanarak basit bir web sunucusu (Nginx/Apache) kurma.
- S3 Statik Web Sitesi Barındırma:
- Senaryo: AWS S3 veya Azure Blob Storage üzerinde statik bir web sitesi barındırma, bucket politikalarını yapılandırma ve herkese açık erişim sağlama.
- Kullanılan Terraform Konseptleri:
resource,aws_s3_bucket_policy,aws_s3_bucket_website_configuration. - Ekstralar: CloudFront dağıtımı ile CDN entegrasyonu, özel alan adı yapılandırması.
Orta Düzey Projeler: Karmaşıklığı Artırma
Bu projeler, daha fazla bulut hizmetini bir araya getirerek gerçek dünya uygulama mimarilerine yakınlaşır ve modülerlik, durum yönetimi gibi konulara odaklanır.
- Üç Katmanlı Web Uygulaması Mimarisi:
- Senaryo: Bir VPC içinde web, uygulama ve veritabanı katmanlarını içeren üç katmanlı bir mimari dağıtımı. Her katman için ayrı alt ağlar, güvenlik grupları ve gerekli kaynaklar (EC2, Auto Scaling Group, Application Load Balancer, RDS veritabanı).
- Kullanılan Terraform Konseptleri: Modüller,
data sourcekullanımı, bağımlılık yönetimi,remote stateiçin S3/Blob Storage backend. - Ekstralar: Route 53 ile DNS kaydı, SSM Parameter Store ile hassas veri yönetimi.
- Sunucusuz (Serverless) Uygulama Dağıtımı:
- Senaryo: AWS Lambda, API Gateway ve DynamoDB (veya Azure Functions, API Management, Cosmos DB) kullanarak basit bir sunucusuz API oluşturma.
- Kullanılan Terraform Konseptleri: Lambda fonksiyonları, IAM rolleri ve politikaları, API Gateway entegrasyonu, DynamoDB tabloları.
- Ekstralar: CloudWatch loglama, CI/CD pipeline entegrasyonu (GitHub Actions/GitLab CI).
İleri Düzey Projeler: Kompleks Senaryolar ve Entegrasyonlar
Bu projeler, Terraform bilginizin derinliğini ve farklı teknolojileri entegre etme yeteneğinizi gösterir. Genellikle daha fazla planlama ve problem çözme gerektirir.
- Kubernetes Kümesi Dağıtımı ve Uygulama Yönetimi:
- Senaryo: EKS (AWS), AKS (Azure) veya GKE (GCP) kullanarak bir Kubernetes kümesi oluşturma ve ardından Helm veya Terraform Kubernetes sağlayıcısı ile bu kümeye örnek bir uygulama dağıtma.
- Kullanılan Terraform Konseptleri: Farklı sağlayıcıların entegrasyonu (örn:
awsvekubernetessağlayıcıları),local-execprovisioning, Kubernetes kaynaklarının yönetimi. - Ekstralar: Prometheus/Grafana ile izleme çözümü, Ingress Controller kurulumu.
- Çoklu Ortam (Multi-Environment) ve Çoklu Bölge (Multi-Region) Dağıtımları:
- Senaryo: Aynı Terraform kod tabanını kullanarak geliştirme, test ve üretim ortamlarını farklı AWS bölgelerinde veya aynı bölgedeki farklı VPC'lerde dağıtma.
- Kullanılan Terraform Konseptleri: Terraform çalışma alanları (
terraform workspace), modüller, koşullu ifadeler,for_eachvecountmeta argümanları. - Ekstralar: Ortamlar arası parametre yönetimi (Terraform Cloud, SSM Parameter Store), maliyet optimizasyonu.
- CI/CD Pipeline Entegrasyonu:
- Senaryo: GitHub Actions, GitLab CI/CD veya Azure DevOps Pipeline kullanarak Terraform konfigürasyonlarınız için otomatik bir dağıtım pipeline'ı oluşturma.
- Kullanılan Terraform Konseptleri:
terraform fmt,terraform validate,terraform plan,terraform applykomutlarının otomasyonu,remote backendkullanımı, kimlik doğrulama mekanizmaları (IAM rolleri, servis prensipleri). - Ekstralar: Plan sonuçlarını yorum olarak PR'a ekleme, otomatik onay mekanizmaları.
Her proje için iyi bir README dosyası hazırlamak, kod kalitenizi artırmak ve modüler bir yapı kurmak, portföyünüzün değerini katlayacaktır. Her proje, öğrenilen yeni bir kavramı veya çözülen yeni bir problemi temsil etmelidir. Unutmayın, önemli olan sadece altyapıyı dağıtmak değil, aynı zamanda kodunuzun temiz, anlaşılır ve bakımı kolay olmasını sağlamaktır.
GitHub ile Terraform Kodunuzu Nasıl Yönetirsiniz?
Terraform portföyünüzü oluştururken, projelerinizin kod tabanını etkili bir şekilde yönetmek ve sergilemek, tıpkı kodun kendisi kadar önemlidir. GitHub gibi bir versiyon kontrol platformu, bu konuda vazgeçilmez bir araçtır. GitHub, sadece kodunuzu depolamakla kalmaz, aynı zamanda işbirliği yapmanızı, sürüm kontrolü uygulamanızı ve projelerinizi potansiyel işverenlere veya topluluğa kolayca sunmanızı sağlar. Bu bölümde, GitHub'ı Terraform projeleriniz için en verimli şekilde nasıl kullanabileceğinize değineceğiz.
Neden Git ve GitHub Kullanmalıyız?
Git, dağıtık bir versiyon kontrol sistemidir. Yani, kodunuzdaki değişiklikleri takip etmenizi, farklı sürümler arasında geçiş yapmanızı, birden fazla kişinin aynı anda aynı kod üzerinde güvenli bir şekilde çalışmasını sağlar. GitHub ise bu Git depolarını barındıran popüler bir web tabanlı platformdur. Terraform kodunuzu Git ile yönetmek, size aşağıdaki avantajları sunar:
- Sürüm Kontrolü: Altyapı kodunuzdaki her değişikliği takip edebilir, hatalı dağıtımlarda kolayca önceki sürüme dönebilirsiniz. Bu, altyapınızın "tek doğru kaynak" (single source of truth) olmasını sağlar.
- İşbirliği: Birden fazla kişi bir Terraform projesi üzerinde çalışabilir, kod incelemeleri (pull request review) aracılığıyla kaliteyi artırabilir ve bilgi paylaşımını sağlayabilir.
- Görünürlük ve Portföy: Açık kaynaklı GitHub depoları, projelerinizi herkesin erişimine açarak teknik yeteneklerinizi sergilemenize olanak tanır. İşverenler, kodunuzu, taahhüt geçmişinizi ve dokümantasyon kalitenizi doğrudan inceleyebilir.
- Yedekleme ve Felaket Kurtarma: Kodunuzu bulutta güvenli bir şekilde yedeklemiş olursunuz. Yerel bir sorun yaşasanız bile kodunuz GitHub'da güvende kalır.
Depo Yapısı ve En İyi Uygulamalar:
Terraform projeleriniz için mantıklı ve düzenli bir depo yapısı oluşturmak, projenin büyüklüğüne ve karmaşıklığına bağlı olarak değişir. Ancak genel olarak aşağıdaki yapılar önerilir:
my-terraform-portfolio/
├── project-aws-web-app/
│ ├── main.tf
│ ├── variables.tf
│ ├── outputs.tf
│ ├── versions.tf
│ ├── .terraformignore
│ └── README.md
├── project-azure-serverless/
│ ├── main.tf
│ ├── variables.tf
│ └── ...
├── modules/
│ ├── network/
│ │ ├── main.tf
│ │ └── ...
│ ├── ec2-instance/
│ │ ├── main.tf
│ │ └── ...
├── .gitignore
└── README.md
- Her Proje Ayrı Bir Dizin: Her bir Terraform projesini ana deponuz içinde ayrı bir dizinde tutun. Bu, her projenin kendi bağımsız state'ini ve konfigürasyonunu yönetmesini sağlar.
- Modüller Dizini: Eğer birden fazla projede ortak kullanılabilecek bileşenleriniz varsa (örneğin, bir VPC yapısı veya bir EC2 instance'ı oluşturan modüller), bunları ayrı bir
modulesdizininde saklayın. Bu, kod tekrarını önler ve modülerliği teşvik eder. .terraformignoreDosyası: Aynı.gitignoregibi,.terraformignoredosyası da Terraform'un bazı dosyaları (örneğin,.terraform/dizini,terraform.tfstateyerel dosyası) yoksaymasını sağlar. Özellikleterraform.tfstatedosyasının asla Git'e commit edilmemesi gerektiğini unutmayın. Bu dosya,remote backend(uzak arka uç) ile yönetilmelidir.README.mdDosyası: Her proje dizini içinde kapsamlı birREADME.mddosyası bulundurmak kritik öneme sahiptir. Bu dosya şunları içermelidir:- Projenin Amacı ve Özellikleri.
- Kullanılan Bulut Sağlayıcıları ve Servisleri.
- Kurulum Adımları (önkoşullar, değişken değerleri).
- Terraform Komutları (init, plan, apply, destroy).
- Önemli Çıktılar (output).
- Ek Bilgiler (mimari şeması, dikkat edilmesi gerekenler).
Branching Stratejileri ve CI/CD Entegrasyonu:
Küçük portföy projeleri için basit bir main (veya master) branch'i yeterli olabilir. Ancak daha karmaşık projelerde veya işbirliği yaparken, GitFlow veya Trunk-Based Development gibi branching stratejilerini kullanmak faydalıdır. Her yeni özellik veya değişiklik için ayrı bir branch açmak, main branch'inin her zaman stabil kalmasını sağlar.
Terraform projelerinizi CI/CD (Sürekli Entegrasyon/Sürekli Dağıtım) pipeline'larına entegre etmek, profesyonelliğinizi gösterir. GitHub Actions, GitLab CI/CD veya Jenkins gibi araçlar kullanarak kodunuzu otomatik olarak test edebilir (terraform fmt, terraform validate), bir plan oluşturabilir ve hatta onaydan sonra otomatik olarak apply edebilirsiniz. Bu, altyapı dağıtımlarınızı otomatikleştirmek, insan hatasını azaltmak ve dağıtım süreçlerini hızlandırmak için harika bir yoldur.
GitHub, Terraform portföyünüz için bir sahnedir. Kodunuzu düzenli tutarak, iyi dokümante ederek ve en iyi uygulamaları takip ederek, yeteneklerinizi en iyi şekilde sergileyebilir ve kariyerinizde önemli adımlar atabilirsiniz.
Portföy Projeleriniz İçin Detaylı Bir Vaka Analizi: AWS Üzerinde Basit Bir Web Uygulaması
Şimdi gelin, öğrendiklerimizi gerçek bir senaryo üzerinde uygulayalım. Bu vaka analizinde, AWS üzerinde basit, statik bir web sitesi veya küçük bir dinamik web uygulamasının altyapısını Terraform kullanarak nasıl oluşturacağımızı adım adım inceleyeceğiz. Bu proje, temel ağ kurulumundan sanal makine dağıtımına ve statik içerik barındırmaya kadar birçok Terraform kavramını kapsayacak. Amaç, hem kod kalitenizi hem de farklı AWS servislerini entegre etme yeteneğinizi göstermektir.
Proje Amacı ve Mimari
Amaç: AWS üzerinde yüksek düzeyde erişilebilir, güvenli ve ölçeklenebilir bir temel web uygulaması altyapısı oluşturmak. Bu altyapı, basit bir web sunucusunu barındıracak ve aynı zamanda statik içerikler için S3 kovası sağlayacaktır.
Mimari Bileşenleri:
- VPC (Virtual Private Cloud): Uygulamanın çalışacağı izole ağ ortamı.
- Public Subnet: Genel internet erişimine açık alt ağ.
- Internet Gateway: VPC'nin internet ile iletişimini sağlayan ağ geçidi.
- Route Table: Ağ trafiği yönlendirmelerini tanımlar.
- Security Groups: Sanal makineler için güvenlik duvarı kuralları.
- EC2 Instance: Web sunucusu görevi görecek sanal makine.
- S3 Bucket: Statik içerik (CSS, JS, resimler) barındırmak için depolama alanı.
- IAM Role: EC2 instance'ının S3'e erişimini sağlayacak yetkilendirme.
Adım Adım Terraform Uygulaması
1. Sağlayıcı ve Temel Konfigürasyon
İlk olarak, AWS sağlayıcısını tanımlıyoruz ve Terraform'un kullanacağı AWS bölgesini belirtiyoruz. Ayrıca Terraform'un durum dosyasını (state file) yerel olarak değil, S3'te güvenli bir şekilde saklamasını sağlayacak bir backend konfigürasyonu ekliyoruz. Bu, ekip çalışması ve state dosyasının kaybolma riskine karşı kritik bir adımdır.
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
backend "s3" {
bucket = "my-terraform-portfolio-state-bucket-12345" # Kendi benzersiz bucket adınızı girin
key = "web-app/terraform.tfstate"
region = "us-east-1"
dynamodb_table = "my-terraform-portfolio-state-lock-table" # Kendi benzersiz DynamoDB tablo adınızı girin
encrypt = true
}
}
provider "aws" {
region = "us-east-1"
}
Uzman İpucu: Durum dosyasını S3 gibi uzak bir depoda tutarken, mutlaka bir DynamoDB tablosu ile kilitleme mekanizması (state locking) kullanın. Bu, aynı anda birden fazla kullanıcının terraform apply yapmasını engelleyerek durum dosyasının bozulmasını önler.
2. VPC ve Ağ Yapısı Oluşturma
Uygulamamızın çalışacağı izole ağı (VPC), bir alt ağı (public subnet), internete erişim için bir Internet Gateway ve trafik yönlendirme için bir Route Table tanımlıyoruz.
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "portfolio-vpc"
}
}
resource "aws_internet_gateway" "gw" {
vpc_id = aws_vpc.main.id
tags = {
Name = "portfolio-igw"
}
}
resource "aws_subnet" "public_subnet" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
map_public_ip_on_launch = true # Bu alt ağdaki EC2'lere otomatik genel IP atar
availability_zone = "us-east-1a" # Kendi bölgenizin uygun bir AZ'sini kullanın
tags = {
Name = "portfolio-public-subnet"
}
}
resource "aws_route_table" "public_rt" {
vpc_id = aws_vpc.main.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.gw.id
}
tags = {
Name = "portfolio-public-rt"
}
}
resource "aws_route_table_association" "public_rta" {
subnet_id = aws_subnet.public_subnet.id
route_table_id = aws_route_table.public_rt.id
}
3. Güvenlik Grupları
Web sunucumuza gelen ve giden trafiği kontrol eden bir güvenlik grubu (Security Group) oluşturuyoruz. HTTP (80) ve SSH (22) portlarına erişime izin veriyoruz.
resource "aws_security_group" "web_sg" {
name = "web-server-sg"
description = "Allow HTTP and SSH inbound traffic"
vpc_id = aws_vpc.main.id
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"] # Daha güvenli bir yaklaşım için kendi IP adresinizi kullanın
}
egress {
from_port = 0
to_port = 0
protocol = "-1" # Tüm protokollere izin ver
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "portfolio-web-sg"
}
}
4. EC2 Instance ve Web Sunucusu Kurulumu
Web sunucusu olarak görev yapacak bir EC2 instance'ı tanımlıyoruz. user_data script'i ile instance başladığında Apache web sunucusunu kurup, basit bir HTML sayfası oluşturuyoruz.
data "aws_ami" "amazon_linux" {
most_recent = true
owners = ["amazon"]
filter {
name = "name"
values = ["amzn2-ami-hvm-*-x86_64-gp2"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
}
resource "aws_instance" "web_server" {
ami = data.aws_ami.amazon_linux.id
instance_type = "t2.micro"
vpc_security_group_ids = [aws_security_group.web_sg.id]
subnet_id = aws_subnet.public_subnet.id
key_name = "your-ssh-key-name" # Kendi SSH anahtar adınızı buraya girin
user_data = <
#!/bin/bash
sudo yum update -y
sudo yum install -y httpd
sudo systemctl start httpd
sudo systemctl enable httpd
echo "Merhaba Terraform Portföy Dünyası!
Bu altyapı Terraform ile oluşturuldu.
" | sudo tee /var/www/html/index.html
EOT
tags = {
Name = "Web-Server-Portfolio"
}
}
Uzman İpucu: AMI ID'lerini dinamik olarak aws_ami veri kaynağı ile almak, portföy projelerinizin daha güncel ve taşınabilir olmasını sağlar. Ayrıca, SSH erişimi için kendi key pair'inizi önceden AWS'e yükleyip key_name değerini doğru şekilde belirtmeniz gerekmektedir.
5. S3 Statik Web Sitesi İçin IAM Rolü ve S3 Kovası
EC2 instance'ımızın S3'e erişim sağlayabilmesi için bir IAM rolü oluşturuyoruz. Ancak bu senaryoda, EC2'den S3'e dosya yüklemek yerine, genellikle S3'ü statik web sitesi olarak kullanırız. Bu örnekte S3 kovasını statik web sitesi olarak yapılandıracağız.
resource "aws_s3_bucket" "static_website" {
bucket = "my-portfolio-static-website-12345" # Kendi benzersiz bucket adınızı girin
acl = "public-read" # Statik web sitesi için herkese açık okuma erişimi
website {
index_document = "index.html"
error_document = "error.html"
}
tags = {
Name = "Portfolio-Static-Website"
}
}
resource "aws_s3_bucket_policy" "static_website_policy" {
bucket = aws_s3_bucket.static_website.id
policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Sid = "PublicReadGetObject",
Effect = "Allow",
Principal = "*",
Action = [
"s3:GetObject"
],
Resource = [
"${aws_s3_bucket.static_website.arn}/*"
]
}
]
})
}
6. Çıktılar (Outputs)
Dağıtım sonrası kolayca erişilebilmesi için EC2'nin genel IP adresini ve S3 statik web sitesi URL'sini çıktı olarak tanımlıyoruz.
output "web_server_public_ip" {
description = "The public IP address of the web server"
value = aws_instance.web_server.public_ip
}
output "s3_static_website_url" {
description = "The URL of the static website hosted on S3"
value = aws_s3_bucket.static_website.website_endpoint
}
Uygulama Adımları
- Tüm
.tfdosyalarını aynı dizine kaydedin. - Terraform CLI'yi yükleyin ve AWS kimlik bilgilerinizi yapılandırın.
terraform initkomutunu çalıştırın. (Backend S3 kovasının ve DynamoDB tablosunun önceden var olması veya Terraform tarafından oluşturulması için gerekli izinlerin olması gerekir.)terraform plankomutunu çalıştırarak oluşturulacak kaynakları gözden geçirin.terraform apply --auto-approvekomutuyla altyapıyı dağıtın.- İşlem tamamlandığında,
terraform outputkomutuyla web sunucusunun IP adresini ve S3 web sitesi URL'sini alabilirsiniz. Tarayıcınızda bu IP adresine giderek web uygulamanızın çalıştığını görebilirsiniz. - İşiniz bittiğinde kaynakları temizlemek için
terraform destroy --auto-approvekomutunu kullanın.
Bu proje, temel bulut altyapısı dağıtımı için sağlam bir temel oluşturur ve Terraform portföyünüze ekleyebileceğiniz değerli bir örnektir. Kendi projelerinizi geliştirirken bu yapıyı bir başlangıç noktası olarak kullanabilir ve üzerine daha karmaşık özellikler inşa edebilirsiniz.
Terraform Portföyünüzden Öğrendiğim Dersler ve İpuçları: Nelerden Kaçınmalıyım?
Bir Terraform portföyü oluşturmak, sadece kod yazmakla ilgili değildir; aynı zamanda hatalardan ders çıkarmak, en iyi uygulamaları benimsemek ve sürekli iyileştirme zihniyetini geliştirmekle de ilgilidir. Kendi projelerimde edindiğim tecrübelerden yola çıkarak, başarılı bir Terraform portföyü oluştururken dikkat etmeniz gereken bazı önemli dersleri ve kaçınmanız gereken yaygın hataları paylaşmak istiyorum.
1. State Yönetiminin Kritik Önemi
Terraform'un durum dosyası (terraform.tfstate), yönettiği altyapının gerçek dünya durumunu tutan yegane kaynaktır. Bu dosyanın yanlış yönetimi, altyapınızda ciddi sorunlara yol açabilir. Başlangıçta yerel state dosyaları kullanmak cazip gelse de, portföy projelerinizde bile her zaman uzak (remote) backend kullanmalısınız.
- Ders: Asla yerel state dosyasını (
terraform.tfstate) Git'e göndermeyin! Bu, hassas bilgileri açığa çıkarabilir ve durum dosyasının bozulmasına neden olabilir. - İpucu: AWS S3, Azure Blob Storage veya GCP Cloud Storage gibi servisleri remote backend olarak yapılandırın. Ayrıca, birden fazla kişinin aynı anda
terraform applyyapmasını engellemek için S3 ile DynamoDB veya Azure Blob Storage ile Blob Storage Lease mekanizması gibi kilitleme (state locking) mekanizmalarını da mutlaka kullanın. Bu, tutarsızlıkları ve çakışmaları önler.
2. Güvenlik Her Zaman Önceliklidir
Altyapı kodunuzda güvenlik açıkları bırakmak, gelecekteki olası saldırılara davetiye çıkarır. Portföy projelerinizde bile güvenlik pratiklerini ihmal etmeyin.
- Ders: Hassas verileri (API anahtarları, veritabanı şifreleri) doğrudan kod içine yazmayın veya GitHub'a yüklemeyin.
- İpucu: AWS Secrets Manager, Azure Key Vault, GCP Secret Manager veya HashiCorp Vault gibi gizli bilgi yönetim servislerini kullanın. Terraform kodunuzda bu servislerden dinamik olarak hassas verileri çekin. Ayrıca, IAM rolleri ve politikalarını en az ayrıcalık (least privilege) prensibiyle yapılandırın. Örneğin, bir EC2 instance'ına sadece ihtiyacı olan S3 bucket'ına erişim izni verin, tüm S3'e değil.
3. Modüler Yaklaşım ve Yeniden Kullanılabilirlik
Kod tekrarından kaçınmak ve okunabilirliği artırmak için modüler yapı çok önemlidir.
- Ders: Her yeni proje için aynı ağ yapılandırmasını veya güvenlik grubu tanımını baştan yazmaktan kaçının.
- İpucu: Sıkça kullandığınız altyapı bileşenlerini (VPC, EC2, RDS gibi) yeniden kullanılabilir Terraform modüllerine dönüştürün. Bu modülleri ayrı bir dizinde veya depoda saklayarak farklı projelerde kolayca çağırabilirsiniz. Modüller, kodunuzu daha düzenli, bakımı daha kolay ve hatalara karşı daha dirençli hale getirir.
4. Detaylı Dokümantasyon ve README.md
Bir projenin değeri, sadece kod kalitesiyle değil, aynı zamanda dokümantasyonunun kalitesiyle de ölçülür.
- Ders: Bir proje dağıttıktan sonra "iş bitti" demeyin ve dokümantasyonu atlamayın.
- İpucu: Her Terraform projesi veya modülü için kapsamlı bir
README.mddosyası oluşturun. Bu dosya, projenin ne yaptığını, nasıl dağıtılacağını, hangi değişkenlerin gerekli olduğunu ve hangi çıktıların beklendiğini açıkça belirtmelidir. Mimarinin görsel bir şeması veya önemli notlar eklemek, projenizin anlaşılırlığını büyük ölçüde artırır. Bu, portföyünüzü inceleyen işverenler için kritik bir göstergedir.
5. Hata Ayıklama ve Planlama Pratikleri
Terraform'da hatalar kaçınılmazdır. Önemli olan, bu hataları etkili bir şekilde ayıklayabilmek ve beklenmedik değişiklikleri önceden tahmin edebilmektir.
- Ders:
terraform applykomutunu körü körüne çalıştırmayın. - İpucu: Her zaman
terraform plankomutunu kullanarak yapılacak değişiklikleri dikkatlice inceleyin.terraform plançıktısı, altyapınızda nelerin oluşturulacağını, değiştirileceğini veya yok edileceğini açıkça gösterir. Hata ayıklama içinTF_LOG=TRACE terraform applygibi ortam değişkenlerini kullanarak daha detaylı loglar alabilir ve sorunların kök nedenlerini bulmada bu logları kullanabilirsiniz.
6. Versiyon Kontrolü ve Branching Stratejileri
Git'i sadece kodu saklamak için değil, bir altyapı kodunun gelişim sürecini yönetmek için de kullanın.
- Ders: Tüm değişiklikleri doğrudan
mainbranch'ine commit etmeyin. - İpucu: Her yeni özellik veya hata düzeltmesi için ayrı bir Git branch'i oluşturun. Değişiklikler tamamlandığında, bir pull request (çekme isteği) açarak kod incelemesi yapılmasını sağlayın. Bu, kod kalitesini artırır, hataları erkenden yakalar ve
mainbranch'inin her zaman stabil kalmasını garanti eder.
Bu dersler ve ipuçları, benim Terraform yolculuğumda karşılaştığım zorluklardan ve öğrendiğim en iyi uygulamalardan süzülmüştür. Portföy projelerinizi bu prensiplerle inşa etmek, sadece teknik bilginizi değil, aynı zamanda profesyonel yaklaşımınızı da sergilemenizi sağlayacaktır.
Geleceğe Yönelik Adımlar: Terraform Yetkinliğinizi Nasıl İleri Taşırsınız?
Terraform ile temel projeler oluşturup portföyünüzü şekillendirdikten sonra, durmak yerine sürekli öğrenmeye ve kendinizi geliştirmeye devam etmek kritik öneme sahiptir. Teknoloji dünyası sürekli evrim geçirdiğinden, Terraform yetkinliğinizi ileri taşıyacak ve sizi sektörde daha değerli kılacak birçok yol bulunmaktadır. İşte geleceğe yönelik adımlarınızda size rehberlik edecek bazı önemli başlıklar:
1. Terraform Cloud ve Terraform Enterprise ile Profesyonelleşme
Terraform Cloud, HashiCorp tarafından sunulan, uzaktan state yönetimi, takım işbirliği, politika denetimleri ve CI/CD entegrasyonu sağlayan yönetilen bir hizmettir. Terraform Enterprise ise büyük kuruluşlar için ek güvenlik, denetim ve ölçeklenebilirlik özellikleriyle birlikte gelir.
- Neden Önemli? Bu platformlar, özellikle büyük ekiplerde ve karmaşık altyapılarda Terraform'u daha verimli ve güvenli bir şekilde kullanmanızı sağlar.
remote stateyönetimini kolaylaştırır,run'ları merkezi bir arayüzden yönetmenize olanak tanır ve maliyet kontrolü, güvenlik politikaları gibi kurumsal ihtiyaçları karşılar. - İleri Adım: Portföy projelerinizden bazılarını Terraform Cloud'a taşıyarak
remote run'ları,variable set'leri veworkspaceyönetimini deneyimleyin.Sentinel(Terraform Enterprise'daki Policy-as-Code aracı) ile politika tanımlamayı araştırın.
2. Terragrunt ve Atlantis Gibi Araçlara Hakim Olmak
Terraform, güçlü bir araç olsa da, büyük ölçekli ve karmaşık projelerde bazı zorlukları olabilir. Terragrunt ve Atlantis gibi araçlar, bu zorlukların üstesinden gelmek için tasarlanmıştır.
- Terragrunt: Terraform'un dry (Don't Repeat Yourself) prensibini uygulayarak kod tekrarını azaltmaya yardımcı olan bir "thin wrapper"dır. Modüllerinizi farklı ortamlarda (dev, staging, prod) daha verimli bir şekilde kullanmanızı sağlar.
- Atlantis: GitHub, GitLab ve Bitbucket gibi platformlarla entegre olan açık kaynaklı bir uygulama olup, pull request'ler aracılığıyla Terraform planlarını ve uygulamalarını otomatikleştiren bir "GitOps" aracıdır.
- İleri Adım: Mevcut bir Terraform projenizi Terragrunt ile yeniden yapılandırmayı deneyin veya GitHub Actions/GitLab CI ile Atlantis'i entegre ederek otomatik plan ve uygulama süreçlerini deneyimleyin.
3. Policy-as-Code (PaC) ve Güvenlik Otomasyonu
Altyapı güvenliği sadece doğru kaynakları dağıtmakla kalmaz, aynı zamanda bu kaynakların kuruluşun güvenlik politikalarına uygun olmasını da gerektirir. Policy-as-Code araçları, bu politikaları kod olarak tanımlamanızı ve altyapı dağıtılmadan önce veya sonra denetlemenizi sağlar.
- Neden Önemli? Güvenlik ve uyumluluk (compliance) giderek daha kritik hale geliyor. PaC, yanlış yapılandırmaları ve güvenlik açıklarını otomatik olarak tespit ederek riski azaltır.
- İleri Adım: Open Policy Agent (OPA) veya HashiCorp Sentinel gibi araçları araştırın. Terraform kodunuzun belirli güvenlik standartlarına (örneğin, S3 kovalarının herkese açık olmaması) uygun olup olmadığını denetleyen basit kurallar yazın ve CI/CD pipeline'ınıza entegre edin.
4. Farklı Sağlayıcılar ve Teknoloji Yığınları ile Çalışmak
Terraform, sadece AWS ile sınırlı değildir. Çoklu bulut (multi-cloud) ortamlarında veya karma (hybrid) altyapılarda çalışmak, pazar değerinizi artıracaktır.
- Neden Önemli? Farklı bulut sağlayıcıları (Azure, GCP) veya yerel ortamlar (VMware vSphere, OpenStack) üzerinde deneyim kazanmak, esnekliğinizi ve adaptasyon yeteneğinizi gösterir. Kubernetes sağlayıcısı ile Kubernetes kaynaklarını yönetmek de çok değerli bir beceridir.
- İleri Adım: Mevcut bir projenizi farklı bir bulut sağlayıcısında (örneğin, AWS'ten Azure'a) yeniden oluşturun veya mevcut Kubernetes kümenize Terraform ile bir uygulama dağıtın.
5. Topluluk Katılımı ve Açık Kaynak Katkıları
Terraform topluluğu oldukça aktiftir. Bu topluluğa katılmak, hem öğrenmenizi hızlandırır hem de itibarınızı artırır.
- Neden Önemli? Başkalarının projelerini incelemek, soru sormak, cevaplamak veya kendi kodunuzu açık kaynak projelerine katkıda bulunmak (Terraform Registry modülü geliştirmek gibi), networkünüzü genişletir ve sürekli öğrenme motivasyonunuzu canlı tutar.
- İleri Adım: Terraform Registry'de popüler bir modülü inceleyin, hata raporlayın veya bir özellik önerin. Kendi modülünüzü geliştirip yayınlamayı düşünebilirsiniz.
6. Sertifikasyonlar
Terraform yetkinliğinizi resmi bir şekilde kanıtlamak için sertifikasyonlara yönelebilirsiniz.
- Neden Önemli? HashiCorp Certified: Terraform Associate sertifikası, Terraform temel kavramları ve pratik uygulama becerileri hakkında yetkinliğinizi gösterir.
- İleri Adım: Sertifikasyon sınavına hazırlanmak için resmi kaynakları kullanın ve pratik projelerle bilginizi pekiştirin.
Terraform yetkinliğinizi ileri taşımak, sürekli öğrenme ve pratik uygulama gerektiren bir yolculuktur. Bu adımları takip ederek, kendinizi sadece güncel tutmakla kalmayacak, aynı zamanda kariyerinizde önemli fırsatların kapısını aralayacaksınız.
Sonuç
Bu makale boyunca, Terraform portföyünüzü sıfırdan oluşturmanın ve kariyerinizde bir fark yaratmanın yollarını detaylı bir şekilde inceledik. Modern bulut altyapılarının yönetimi ve otomasyonunda Terraform'un vazgeçilmez bir araç olduğunu, ve bu alandaki yetkinliğinizi somut projelerle kanıtlamanın ne kadar önemli olduğunu vurguladık. Temel kavramlardan başlayarak, gerçek dünya senaryolarına dayalı proje fikirlerine, GitHub ile kod yönetimine ve AWS üzerinde adım adım bir web uygulaması dağıtımı vaka analizine kadar geniş bir yelpazeyi ele aldık. Ayrıca, edindiğim tecrübelerden yola çıkarak state yönetimi, güvenlik, modüler tasarım ve dokümantasyon gibi konularda değerli dersler ve ipuçları paylaştık.
Terraform yolculuğunuz, bir portföy oluşturmakla bitmiyor; aksine, sürekli öğrenme ve kendinizi geliştirme ile devam ediyor. Terraform Cloud, Terragrunt, Policy-as-Code gibi ileri düzey araçları ve farklı bulut sağlayıcılarını keşfetmek, yetkinliğinizi bir üst seviyeye taşıyacaktır. Unutmayın, her yeni proje, yeni bir öğrenme fırsatı, yeni bir problem çözme deneyimi ve portföyünüze ekleyeceğiniz yeni bir başarı demektir. Kodunuzu düzenli tutun, iyi dokümante edin ve en önemlisi, pratik yapmaya devam edin. Bu sayede, kendinizi kanıtlamış, yetenekli bir DevOps veya bulut mühendisi olarak konumlandırabilir ve kariyer hedeflerinize emin adımlarla ilerleyebilirsiniz. Şimdi sıra sizde: Terraform CLI'yı açın ve kendi harika projelerinizi inşa etmeye başlayın!
Sıkça Sorulan Sorular
Terraform portföyü ne kadar sürer?
Bir Terraform portföyü oluşturma süresi, projelerinizin karmaşıklığına, öğrenme hızınıza ve günlük ayırabildiğiniz zamana bağlı olarak değişir. Basit projelerle birkaç haftada başlayabilir, orta ve ileri düzey projelerle 2-4 ay içinde sağlam bir temel oluşturabilirsiniz. Önemli olan süreklilik ve her projeden maksimum ders çıkarmaktır.
Hangi platformu (AWS/Azure/GCP) tercih etmeliyim?
Kariyer hedeflerinize veya mevcut piyasa taleplerine göre bir bulut platformu seçebilirsiniz. AWS, en geniş hizmet yelpazesine ve pazar payına sahipken, Azure ve GCP de hızla büyümektedir. Mümkünse, birden fazla platformda deneyim kazanmak, çok yönlülüğünüzü artıracaktır. Eğer sıfırdan başlıyorsanız, size en rahat gelen veya iş aradığınız bölgede en popüler olan platformla başlamanız mantıklı olacaktır.
Portföyüm için en iyi proje türü nedir?
En iyi proje, sizi heyecanlandıran, temelden ileriye doğru karmaşıklığı artıran ve farklı Terraform kavramlarını (modüller, state yönetimi, remote backend, CI/CD) kapsayan projelerdir. Üç katmanlı web uygulaması, sunucusuz mimari veya Kubernetes kümesi dağıtımı gibi gerçek dünya senaryolarına dayalı projeler, portföyünüzü daha etkili hale getirecektir.
Sıfırdan başlayanlar için en iyi kaynaklar nelerdir?
HashiCorp'un resmi Terraform dokümantasyonu ve eğitimleri, Udemy, Coursera gibi platformlardaki kurslar, YouTube'daki ücretsiz rehberler ve Stack Overflow gibi topluluk forumları harika başlangıç noktalarıdır. Ayrıca, GitHub'daki diğer açık kaynaklı Terraform projelerini incelemek de çok faydalı olacaktır.
Terraform'da iş bulmak için portföy yeterli mi?
Portföyünüz, teknik yeteneklerinizi sergilemenin en güçlü yollarından biridir ve iş başvurularında size önemli bir avantaj sağlar. Ancak tek başına yeterli değildir. Portföyünüzü, mülakat becerileri, iyi bir özgeçmiş, problem çözme yeteneği ve iletişim becerileri ile desteklemeniz gerekmektedir. Portföyünüz, mülakatlarda konuşacak somut örnekler sunarak sizi öne çıkaracaktır.
