Türkçe

Altyapı kodunun gücünü açığa çıkarın: Terraform'un temel en iyi uygulamalarıyla küresel altyapı dağıtımlarınızı verimli bir şekilde yönetin, otomatikleştirin ve ölçeklendirin.

Altyapı Kod Olarak: Küresel Ekipler İçin Terraform En İyi Uygulamaları

Bugünün bulut odaklı dünyasında, Kod Olarak Altyapı (IaC), altyapı dağıtımlarını yönetmek ve otomatikleştirmek için vazgeçilmez bir pratik haline gelmiştir. HashiCorp'un popüler bir IaC aracı olan Terraform, ekiplerin altyapıyı bildirimsel bir yapılandırma dili kullanarak tanımlamasına ve sağlamasına olanak tanır. Bu blog yazısı, küresel ekiplerin altyapılarını etkin bir şekilde yönetmelerine, işbirliğini geliştirmelerine ve çeşitli ortamlarda tutarlılığı sağlamalarına yardımcı olacak temel Terraform en iyi uygulamalarını özetlemektedir.

Neden Terraform ve Kod Olarak Altyapı?

En iyi uygulamalara dalmadan önce, Terraform ve IaC kullanmanın faydalarını anlayalım:

Terraform'un bildirimsel yaklaşımı, sağlayıcı ekosistemi ve güçlü topluluk desteği, onu çeşitli bulut sağlayıcıları ve şirket içi ortamlarda altyapıyı yönetmek için güçlü bir seçenek haline getirir. Örneğin, küresel bir e-ticaret şirketi, Kuzey Amerika, Avrupa ve Asya-Pasifik'teki AWS bölgelerindeki altyapısını yönetmek, tutarlı dağıtımlar ve verimli kaynak kullanımı sağlamak için Terraform'u kullanabilir.

Terraform En İyi Uygulamaları

1. Altyapınızı Modülerleştirin

Terraform modülleri, yeniden kullanılabilir, kendi kendine yeten altyapı kodu paketleridir. Altyapınızı modülerleştirmek kod yeniden kullanımını teşvik eder, bakımı basitleştirir ve işbirliğini geliştirir. İyi tasarlanmış bir modül, belirli altyapı bileşenlerini kapsüller, bu da anlaşılmasını, test edilmesini ve dağıtılmasını kolaylaştırır.

Modülerleştirmenin Faydaları:

Örnek:

AWS üzerinde bir Sanal Özel Bulut (VPC) oluşturmak için bir modül düşünün. Modül, VPC, alt ağlar, yönlendirme tabloları ve güvenlik gruplarının oluşturulmasını kapsayacaktır. Diğer ekipler daha sonra farklı AWS hesaplarında veya bölgelerde VPC oluşturmak için bu modülü yeniden kullanabilir.

# vpc_module/main.tf
resource "aws_vpc" "main" {
 cidr_block = var.cidr_block
 enable_dns_hostnames = true
 enable_dns_support = true

 tags = {
 Name = var.vpc_name
 }
}

resource "aws_subnet" "private" {
 count = length(var.private_subnet_cidrs)
 vpc_id = aws_vpc.main.id
 cidr_block = var.private_subnet_cidrs[count.index]
 availability_zone = data.aws_availability_zones.available.names[count.index]

 tags = {
 Name = format("%s-private-%02d", var.vpc_name, count.index + 1)
 }
}

output "vpc_id" {
 value = aws_vpc.main.id
}
# main.tf (VPC modülünü kullanarak)
module "vpc" {
 source = "./vpc_module"
 vpc_name = "my-global-vpc"
 cidr_block = "10.0.0.0/16"
 private_subnet_cidrs = ["10.0.1.0/24", "10.0.2.0/24"]
}

output "vpc_id" {
 value = module.vpc.vpc_id
}

2. Terraform Durumunu Etkin Bir Şekilde Yönetin

Terraform durumu, gerçek dünya kaynaklarını yapılandırmanızla eşleyen kritik bir bileşendir. Altyapınızın bütünlüğünü ve tutarlılığını sağlamak için Terraform durumunu etkin bir şekilde yönetmek önemlidir. Özellikle işbirliği yapan ekipler için uzak durum depolamayı kullanmak bir en iyi uygulamadır.

Uzak Durum Depolamanın Faydaları:

Örnek:

Uzak durum depolama ve kilitleme için AWS S3 ve DynamoDB kullanma:

terraform {
 backend "s3" {
 bucket = "my-terraform-state-bucket"
 key = "global/terraform.tfstate"
 region = "us-east-1"
 dynamodb_table = "terraform-locks"
 encrypt = true
 }
}

Önemli Hususlar:

3. Değişkenler ve Giriş Doğrulama Kullanın

Değişkenler, Terraform yapılandırmalarınızı daha esnek ve yeniden kullanılabilir hale getirmenizi sağlar. Örnek boyutları, bölge adları ve kaynak etiketleri gibi yapılandırılabilir değerleri tanımlamak için değişkenleri kullanın. Değişkenlerin doğru türlere sahip olmasını ve belirli kısıtlamaları karşılamasını sağlamak için giriş doğrulamayı uygulayın.

Değişkenler ve Giriş Doğrulamanın Faydaları:

Örnek:

# variables.tf
variable "instance_type" {
 type = string
 description = "Başlatılacak EC2 örneğinin türü."
 default = "t2.micro"
 validation {
 condition = contains(["t2.micro", "t3.small", "m5.large"], var.instance_type)
 error_message = "Geçersiz örnek türü. Lütfen t2.micro, t3.small veya m5.large arasından seçim yapın."
 }
}

variable "region" {
 type = string
 description = "Kaynakların dağıtılacağı AWS bölgesi."
 default = "us-east-1"
}
# main.tf
resource "aws_instance" "example" {
 ami = data.aws_ami.amazon_linux.id
 instance_type = var.instance_type
 tags = {
 Name = "Example Instance"
 }
}

4. Sürüm Kontrolü ve CI/CD Uygulayın

Terraform yapılandırmalarınızı sürüm kontrol sisteminde (örneğin, Git) saklayarak değişiklikleri izleyin, ekip üyeleriyle işbirliği yapın ve gerektiğinde önceki sürümlere geri dönün. Altyapınızın test ve dağıtımını otomatikleştirmek için Terraform'u Sürekli Entegrasyon/Sürekli Dağıtım (CI/CD) işlem hattına entegre edin.

Sürüm Kontrolü ve CI/CD'nin Faydaları:

Örnek CI/CD İş Akışı:

  1. Geliştiriciler, Terraform yapılandırmasındaki değişiklikleri bir Git deposuna kaydeder.
  2. Bir CI/CD aracı (örneğin, Jenkins, GitLab CI, GitHub Actions) bir işlem hattını tetikler.
  3. İşlem hattı, yapılandırmanın sözdizimini kontrol etmek için Terraform validate çalıştırır.
  4. İşlem hattı, uygulanacak değişiklikleri önizlemek için Terraform plan çalıştırır.
  5. İşlem hattı, dağıtıma devam etmek için bir ekip üyesinden onay gerektirir.
  6. Onay üzerine, işlem hattı altyapıya yapılan değişiklikleri uygulamak için Terraform apply çalıştırır.
# .gitlab-ci.yml
stages:
 - validate
 - plan
 - apply

validate:
 stage: validate
 image: hashicorp/terraform:latest
 script:
 - terraform init
 - terraform validate

plan:
 stage: plan
 image: hashicorp/terraform:latest
 script:
 - terraform init
 - terraform plan -out=tfplan
artifacts:
 paths:
 - tfplan

apply:
 stage: apply
 image: hashicorp/terraform:latest
 script:
 - terraform init
 - terraform apply tfplan
only:
 - master
when: manual

5. Tutarlı Adlandırma Kurallarına Uyun

Okunabilirliği, bakımı ve aranabilirliği artırmak için altyapı kaynaklarınız için tutarlı bir adlandırma kuralı oluşturun. Kaynağın amacını ve ortamını açıkça belirten anlamlı ve açıklayıcı adlar kullanın. Örneğin, yalnızca "ec2_instance" yerine "web-server-prod-ec2" kullanın.

Tutarlı Adlandırma Kurallarının Faydaları:

Örnek:

Bir adlandırma kuralı, kaynak türünü, ortamı ve benzersiz bir tanımlayıcıyı içerebilir:

Adlandırma kuralınıza göre kaynak adlarını dinamik olarak oluşturmak için değişkenleri kullanın:

variable "environment" {
 type = string
 description = "Ortam (örneğin, prod, staging, dev)."
}

resource "aws_instance" "example" {
 ami = data.aws_ami.amazon_linux.id
 instance_type = "t2.micro"
 tags = {
 Name = format("web-server-%s", var.environment)
 }
}

6. Hassas Verileri Güvenceye Alın

Hassas verileri (örneğin, parolalar, API anahtarları, sertifikalar) doğrudan Terraform yapılandırmalarınıza gömmekten kaçının. Bunun yerine, hassas verileri yönetmek ve altyapınıza enjekte etmek için güvenli yöntemler kullanın.

Hassas Verileri Güvenceye Alma Yöntemleri:

AWS Secrets Manager Kullanarak Örnek:

# data.tf
data "aws_secretsmanager_secret" "db_password" {
 name = "db_password"
}

data "aws_secretsmanager_secret_version" "db_password" {
 secret_id = data.aws_secretsmanager_secret.db_password.id
}

output "database_password" {
 value = data.aws_secretsmanager_secret_version.db_password.secret_string
 sensitive = true
}

Önemli Güvenlik Hususları:

7. Altyapı Kodunuzu Test Edin

Terraform yapılandırmalarınızın doğruluğunu ve güvenilirliğini sağlamak için test stratejileri uygulayın. Testler, geliştirme sürecinin erken aşamalarında hataları yakalamanıza, altyapı hataları riskini azaltmanıza ve kodunuzun genel kalitesini iyileştirmenize yardımcı olabilir.

Test Stratejileri:

Terraform Test Araçları:

Terratest Kullanarak Örnek:

// test/vpc_test.go
package test

import (
 "testing"

 "github.com/gruntwork-io/terratest/modules/terraform"
 "github.com/stretchr/testify/assert"
)

func TestVPC(t *testing.T) {
 t.Parallel()

 terraformOptions := &terraform.Options{
 TerraformDir: "../vpc_module",
 Variables: map[string]interface{}{
 "vpc_name": "test-vpc",
 "cidr_block": "10.0.0.0/16",
 "private_subnet_cidrs": []string{"10.0.1.0/24", "10.0.2.0/24"},
 },
 }

 defer terraform.Destroy(t, terraformOptions)

 terraform.InitAndApply(t, terraformOptions)

 vpcID := terraform.Output(t, terraformOptions, "vpc_id")

 assert.NotEmpty(t, vpcID)
}

8. DRY (Kendini Tekrar Etme) İlkesine Uyun

DRY (Kendini Tekrar Etme) ilkesi, kodun çoğaltılmasından kaçınılmasını savunur. Terraform'da bu, yaygın yapılandırmaları soyutlamak ve aynı kodu birden fazla yerde tekrarlamaktan kaçınmak için modülleri, değişkenleri ve veri kaynaklarını kullanmak anlamına gelir. DRY ilkesine uymak, bakımı iyileştirir, hata riskini azaltır ve kodunuzu daha özlü ve okunabilir hale getirir.

Örnek:

Aynı güvenlik grubu kurallarını birden fazla kaynak bloğunda tanımlamak yerine, güvenlik grubunu ve kurallarını kapsülleyen bir modül oluşturun. Ardından, kuralları gerektiği gibi özelleştirmek için değişkenler geçirerek modülü farklı yerlerde yeniden kullanın.

9. Terraform ve Sağlayıcı Sürümlerini Düzenli Olarak Güncelleyin

Yeni özelliklerden, hata düzeltmelerinden ve güvenlik yamalarından yararlanmak için Terraform ve sağlayıcı sürümlerinizi güncel tutun. Değişiklikleri ve altyapınız üzerindeki potansiyel etkileri anlamak için Terraform ve sağlayıcınızın sürüm notlarını düzenli olarak gözden geçirin. Terraform ve sağlayıcıların kabul edilebilir sürümlerini yapılandırmanızda belirtmek için Terraform'un sürüm kısıtlamalarını kullanın.

Örnek:

terraform {
 required_version = ">= 1.0.0"

 required_providers {
 aws = {
 source = "hashicorp/aws"
 version = "~> 3.0"
 }
 }
}

10. Altyapınızı Belgeleyin

Farklı bileşenlerin amacını, işlevselliğini ve kullanımını açıklamak için altyapı kodunuzu belgeleyin. İyi belgeler, özellikle karmaşık ortamlarda ekip üyelerinin altyapıyı anlamasını ve sürdürmesini kolaylaştırır. Karmaşık mantığı ve kararları açıklamak için kodunuzdaki yorumları kullanın. İşlevselliği ve kullanımı hakkında genel bir bakış sunmak için her modül için bir README dosyası oluşturun.

İyi Belgelerin Unsurları:

Sonuç

Bu Terraform en iyi uygulamalarını uygulamak, altyapı dağıtımlarınızın verimliliğini, güvenilirliğini ve güvenliğini önemli ölçüde artırabilir. Kodunuzu modülerleştirerek, durumu etkin bir şekilde yöneterek, değişkenler ve giriş doğrulaması kullanarak, sürüm kontrolü ve CI/CD uygulayarak, tutarlı bir adlandırma kuralına uyarak, hassas verileri güvenceye alarak, kodunuzu test ederek, DRY ilkesine uyarak, sürümlerinizi güncel tutarak ve altyapınızı belgeleyerek, küresel ekibinizin ihtiyaçlarını karşılayan sağlam ve ölçeklenebilir bir altyapı oluşturabilirsiniz. IaC'nin devam eden bir süreç olduğunu unutmayın, bu nedenle deneyimlerinize ve gelişen gereksinimlerinize göre uygulamalarınızı sürekli olarak iyileştirin. Altyapı yönetiminizi otomatikleştirmek ve düzene sokmak için Terraform'un gücünden yararlanın, ekibinizin işinize değer katmaya odaklanmasını sağlayın.