Terraform ile Azure Üzerinde Bulut Altyapısı Oluşturma

Başlangıç Kılavuzu ve Örnek Proje

Selin Çelik
SabancıDx
7 min readJun 10, 2024

--

Terraform’un gücünü Cloud üzerinde keşfetmeye hazır mısınız? Bu makalede, altyapıyı kod ile tanımlama (Infrastructure as Code — IaC) ve otomasyon amacıyla kullanılan Terraform’un Microsoft Azure Cloud üzerinde nasıl etkili bir şekilde altyapı oluşturduğunu adım adım inceleyeceğiz.

Hızla gelişen bulut bilişim ortamında, Terraform kullanarak Altyapı olarak Kodlama (Infrastructure as Code — IaC) tekniklerinde ustalaşmak kaçınılmaz hale gelmiştir. Terraform, geliştiricilere ve BT profesyonellerine bulut altyapısının dağıtımını, ölçeklendirmesini ve yönetimini otomatikleştirme imkanı sunar. Yüksek seviyeli bir yapılandırma dili kullanarak altyapıyı tanımlamanıza olanak tanır, bu sayede organizasyonların bulut altyapılarına yaklaşımını devrim niteliğinde değiştirir, tutarlılık, verimlilik ve ölçeklenebilirlik sağlar.

Neden Terraform?

HashiCorp tarafından geliştirilen Terraform, açık kaynaklı bir Altyapı olarak Kodlama (IaC) aracıdır. Bu araç, istenen altyapı durumunu tanımlayan yapılandırma dosyalarını kullanarak altyapıyı oluşturur. Böylece, altyapınızda yapılacak değişiklikleri güvenli, öngörülebilir, tekrarlanabilir ve izlenebilir bir şekilde yönetebilirsiniz.

Terraform’un “plan” ve “apply” komutları, yapılacak değişikliklerin önceden görülmesine ve onaylanmasına olanak tanır. Bu da potansiyel hataları en aza indirir ve daha tutarlı bir yapı yönetimi sunar.

Terraform’un Avantajları

  • Açık Kaynak ve Esneklik: Terraform, açık kaynaklı olması sayesinde geniş bir topluluk tarafından sürekli geliştirilmekte ve desteklenmektedir.
  • Platform Bağımsızlığı: Terraform, birçok bulut sağlayıcısı ve hizmeti ile uyumlu çalışır.
  • Yeniden Kullanılabilir Kodlar: Modüler yapısı sayesinde kodlar yeniden kullanılabilir ve bakım maliyeti düşer.
  • Versiyon Kontrolü: Altyapı değişiklikleri versiyon kontrol sistemleri ile takip edilebilir, bu sayede değişikliklerin izi sürülebilir.

Terraform ve Azure CLI Kurulumu

Ön Koşullar

Terraform ve Azure CLI’yi kurmaya başlamadan önce, aşağıdaki ön koşulların sağlandığından emin olun:

Azure Kimlik Doğrulaması

Terraform dosyalarınızı kendi Azure hesabınıza uygun hale getirmek için izlemeniz gereken adımları detaylandıracağım. İlk olarak, Terraform’un Azure hesabınıza erişebilmesi için kimlik doğrulaması yapmanız gerekmektedir. Bu genellikle bir hizmet anahtarı (service principal) kullanılarak yapılır.

Azure’da bir hizmet anahtarı oluşturmak için kullanılabilecek komut:

az ad sp create-for-rbac --name terraform-sp --role Contributor --scopes /subscriptions/<your-subscription-id>

Bu komut client_id, client_secret, tenant_id, ve subscription_id gibi kimlik bilgilerini sağlayacaktır.

Terraform Yapılandırması

  1. Yeni Bir Terraform Projesi Başlatın
mkdir terraform-azure
cd terraform-azure

2. Sağlayıcıları Tanımlayın

Terraform, bulut sağlayıcıları ve diğer hizmetleri yönetmek için “sağlayıcı” (provider) adı verilen eklentiler kullanır. Bu projede, Azure Resource Manager (azurerm) ve Azure Active Directory (azuread) sağlayıcılarını kullanacağız.

providers.tf adında bir dosya oluşturun ve aşağıdaki kodu ekleyin:

terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm" # Terraform Registry'den azurerm sağlayıcısını kullan
version = "~>3.0.2"
}
azuread = {
source = "hashicorp/azuread" # Terraform Registry'den azuread sağlayıcısını kullan
}
}
}

provider "azurerm" {
features {}

client_id = var.client_id # appId değerine karşılık gelir
client_secret = var.client_secret # password değerine karşılık gelir
subscription_id = var.subscription_id # subscriptionId değerine karşılık gelir
tenant_id = var.tenant_id # tenant değerine karşılık gelir
}
provider "azuread" {
tenant_id = var.tenant_id
client_id = var.client_id
client_secret = var.client_secret
}
  • terraform { required_providers { ... } } bloğu, proje için gerekli sağlayıcıları ve sürümlerini tanımlar.
  • provider "azurerm" { features {} } bloğu, azurerm sağlayıcısının özelliklerini yapılandırır.

3. Ana Konfigürasyon Dosyasını Oluşturun

Ana Terraform yapılandırma dosyası (main.tf), kaynakları tanımlar ve Terraform'un bu kaynakları nasıl oluşturacağını belirtir.

main.tf dosyasını oluşturun ve aşağıdaki kodu ekleyin:

## Create a Resource Group for Storage
resource "azurerm_resource_group" "rg_storage" {
location = var.deploy_location # Kaynak grubunun oluşturulacağı Azure bölgesi
name = var.rg_stor # Kaynak grubunun adı
}

# Generate a random string (consisting of four characters)
resource "random_string" "random" {
length = 4 # Rastgele dize uzunluğu
upper = false # Büyük harf kullanma
special = false # Özel karakter kullanma
}

## Azure Storage Accounts requires a globally unique names
## Create a File Storage Account
resource "azurerm_storage_account" "storage" {
name = "stor${random_string.random.id}" # benzersiz ad
resource_group_name = azurerm_resource_group.rg_storage.name # ait olduğu kaynak grubu
location = azurerm_resource_group.rg_storage.location # oluşturulacağı bölge
account_tier = "Standard" # hizmet katmanı
account_replication_type = "GRS" # çoğaltma türü
}

resource "azurerm_storage_share" "FSShare" {
name = "fslogix" # Dosya paylaşımının adı
storage_account_name = azurerm_storage_account.storage.name # Depolama hesabı adı
depends_on = [azurerm_storage_account.storage] # Depolama hesabına bağımlılık
}

## Azure built-in roles
## Retrieve the role definition for "Storage File Data SMB Share Contributor"
data "azurerm_role_definition" "storage_role" {
name = "Storage File Data SMB Share Contributor" # Azure'da yerleşik rol adı
}

## Define the Azure AD Group
resource "azuread_group" "aad_group" {
display_name = var.aad_group_name
}

resource "azurerm_role_assignment" "af_role" {
scope = azurerm_storage_account.storage.id # Rol atamasının uygulanacağı kaynak
role_definition_id = data.azurerm_role_definition.storage_role.id # Rol tanımı ID'si
principal_id = azuread_group.aad_group.id # Rol atanacak AAD grubunun kimlik ID'si
}

main.tf dosyasının oluşturulmasının amacı, proje için gerekli olan tüm kaynakları bir araya toplamak ve yapılandırmaları bir merkezi dosyada tanımlamaktır. Bu dosyada tanımladığınız her şey Terraform tarafından uygulanacak ve yönetilecektir.

3. Değişkenleri Tanımlayın

Terraform, yapılandırılmayı daha esnek hale getirmek için değişkenler kullanır.

Bu projede kullanılacak değişkenleri tanımlamak için variables.tf dosyasını oluşturun ve aşağıdaki kodu ekleyin:

variable "deploy_location" {
type = string
default = "eastus" # Sizin tercihinize göre değiştirin
description = "Bu örnekteki tüm kaynakların oluşturulması gereken Azure Bölgesi."
}

variable "rg_stor" {
type = string
default = "rg-terraform-storage" # Sizin tercihinize göre değiştirin
description = "Depolamanın dağıtılacağı Kaynak grubunun adı."
}

variable "avd_users" {
description = "AVD users"
default = ["contoso@microsoft.com"] # Kendi kullanıcı e-posta adreslerinizle değiştirin
}

variable "aad_group_name" {
type = string
default = "AVDUsers" # Kendi AAD grup adınızla değiştirin
description = "AVD kullanıcıları için Azure Active Directory Grubu."
}

variable "client_id" {
type = string
description = "Azure Client ID"
}

variable "client_secret" {
type = string
description = "Azure Client Secret"
}

variable "subscription_id" {
type = string
description = "Azure Subscription ID"
}

variable "tenant_id" {
type = string
description = "Azure Tenant ID"
}

variables.tf dosyası, Terraform projesinde kullanılacak değişkenleri tanımlamak için oluşturulur.

1. deploy_location:

  • Bu değişken, kaynaklarınızın hangi Azure bölgesinde oluşturulacağını belirler. Kendi hesabınızdaki kaynakların farklı bir bölgede oluşturulmasını istiyorsanız, bu değeri uygun bölge adıyla değiştirebilirsiniz.

2. rg_stor:

  • Bu değişken, oluşturulacak kaynak grubunun adını belirler. Eğer mevcut kaynak grubunuz farklı bir ad taşıyorsa veya yeni bir kaynak grubu oluşturmak istiyorsanız, bu değeri değiştirin.

3. avd_users:

  • Bu değişken, AVD (Azure Virtual Desktop) kullanıcılarının e-posta adreslerini listeler. Bu adresleri kendi AVD kullanıcılarınızın e-posta adresleriyle değiştirin.
  • Eğer projenizde AVD kullanıcılarını tanımlamanız gerekmiyorsa ve bu değişken başka bir konfigürasyon veya kaynak tarafından kullanılmıyorsa, bu değişkeni kaldırmak sorun oluşturmaz.

4. aad_group_name:

  • Bu değişken, AVD kullanıcıları için Azure Active Directory grubunun adını belirler. Varsayılan olarak “AVDUsers” kullanılmış. Eğer farklı bir AAD grubu kullanıyorsanız, bu değeri değiştirin.
  • Eğer projenizde AAD grubunu tanımlamanız gerekmiyorsa ve bu değişken başka bir konfigürasyon veya kaynak tarafından kullanılmıyorsa, bu değişkeni kaldırmak sorun oluşturmaz.

5. Değişkenlerin Değerlerini Tanımlayın

Azure hizmet anahtarından aldığınız kimlik bilgilerini terraform.tfvars dosyasına ekleyin. Bu dosya, Terraform yapılandırmanız için gerekli olan değişken değerlerini içerir.

client_id       = "your-client-id"        # Azure uygulamanızın kimlik ID'si (appId)
client_secret = "your-client-secret" # Azure uygulamanızın şifresi (password)
subscription_id = "your-subscription-id" # Azure abonelik ID'si
tenant_id = "your-tenant-id" # Azure kiracı ID'si (tenant)
deploy_location = "eastus"
rg_stor = "rg-avd-storage"
aad_group_name = "AVDUsers"

6. Çıktıları Tanımlayın

Oluşturulan kaynakların çıktılarını almak için output.tf adında bir dosya oluşturun ve aşağıdaki kodu ekleyin:

output "location" {
description = "Azure bölgesi"
value = azurerm_resource_group.rg_storage.location
}

output "storage_account" {
description = "Profiller için depolama hesabı"
value = azurerm_storage_account.storage.name
}

output "storage_account_share" {
description = "FSLogix için oluşturulan Azure Dosya Paylaşımının adı"
value = azurerm_storage_share.FSShare.name
}

output "AVD_user_groupname" {
description = "AVD kullanıcıları için Azure Active Directory Grubu"
value = azuread_group.aad_group.display_name
}

output.tf dosyası, Terraform çalıştırıldıktan sonra kullanıcıya gösterilecek çıktıları tanımlamak için oluşturulur. Bu dosya, yapılandırma işlemi sonucunda oluşturulan kaynakların önemli bilgilerini görüntülemeye yardımcı olur.

Terraform Temel Komutları

Azure CLI ile Azure hesabınıza giriş yapmak için az login komutunu kullanın.

Az login komutunu çalıştırdıktan sonra, Terraform komutlarını çalıştırmak için aşağıdaki adımları izleyebilirsiniz:

  1. Terraform’u Başlatma

Terraform projesini başlatmak için aşağıdaki komutu kullanın. Bu komut, yeni bir Terraform yapılandırması oluşturduktan veya birini sürüm kontrolünden kopyaladıktan sonra çalıştırılmalıdır.

terraform init -upgrade

Bu kod çalışma dizinindeki Terraform yapılandırma dosyalarınızı ve kullanılan sağlayıcıları (provider) yükler, ayrıca Terraform durum dosyasını (state file) oluşturur veya günceller.

2. Yapılandırma Dosyalarını Biçimlendirme

Terraform yapılandırma dosyalarınızı standart bir formatta ve stile getirmek için terraform fmt komutunu kullanabilirsiniz. Bu komut, dosyalarınızı daha okunabilir hale getirir ve bakımını kolaylaştırır.

terraform fmt

Bu komut, yapılandırma dosyalarını otomatik olarak biçimlendirir ve Terraform’un standartlarına uygun hale getirir. Dosyalarınızın düzenli ve tutarlı olması, özellikle büyük projelerde bakım ve işbirliğini kolaylaştırır.

3. Yürütme Planı Oluşturma

Yapılandırmanın bir özetini oluşturmak için terraform plan komutunu kullanabilirsiniz. Bu adım, gerçek kaynaklarda herhangi bir değişiklik yapmaz, ancak yapılandırmada ne tür değişiklikler gerektiğini belirler.

terraform plan -out main.tfplan

4. Değişiklikleri Uygulama

Değişiklikleri uygulamak için terraform apply komutunu kullanabilirsiniz. Bu komut, yapılandırmanızın istenen durumuna ulaşmak için gereken değişiklikleri gerçekleştirir.

terraform apply main.tfplan

Bu adımları takip ederek, Azure üzerinde Terraform kullanarak yapılandırma yönetimini başarılı bir şekilde gerçekleştirebilirsiniz.

Bu makalede, Azure üzerinde Terraform kullanarak altyapı oluşturma sürecini adım adım inceledik. Terraform’un Azure’deki gücünü keşfettik ve Azure AD grubu oluşturma, depolama hesabı oluşturma gibi temel adımları uyguladık. Terraform’un altyapı yönetimini kolaylaştırarak geliştirme süreçlerini hızlandırdığını ve standartlaştırdığını gördük. Sizde Azure ve Terraform’u kullanarak altyapı yönetimini otomatikleştirme konusunda daha fazla deneyim kazanmak için projenizi genişletebiliriz.

--

--