AZURE ÜZERİNDE TERRAFORM İLE ALT YAPI GELİŞTİRME – BÖLÜM 7: STATE (DURUM)
Azure üzerinde Terraform ile Altyapı Geliştirme makale serisine hoş geldiniz. Yazı dizisinin yedinci bölümünde Azure’da Terraform kullanırken State’e kavramına bakacağız. Terraform, altyapınız ve yapılandırmanızla ilgili durumu depolamalıdır. Bu nedenle, yönetilen ve dağıtılan kaynakları izlemek için Terraform State adlı bir sistem kullanır. Gerçek dünya kaynaklarını yapılandırmanızla eşleştirmek, meta verileri izlemek ve büyük altyapılar için performansı artırmak için Terraform tarafından kullanılır.
Varsayılan olarak “terraform.tfstate” adlı yerel bir dosyada saklanır, ancak uzaktan da saklanabilir. Durum dosyası, Azure’daki kaynakları Terraform yapılandırma dosyasına eşlemek için bir veritabanı görevi görür. Altyapı söz konusu olduğunda Terraform’un bildirimsel bir yaklaşıma sahip olmasını sağlar ve büyük ölçekli altyapı otomasyonu ile performansı artırır.
- Şimdi örneğimizde Terraform durum dosyasını inceleyelim. Main.tf dosyasını varsayılan dizininizde oluşturun ve örneğimiz için 2 VNET ve 2 Alt Ağ içeren aşağıdaki Terraform kodlarını kullanın.
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "2.40.0"
}
}
}
provider "azurerm" {
features {}
}
resource "azurerm_virtual_network" "vnet1" {
name = "vnet1-ne-001"
address_space = ["20.0.0.0/16"]
location = "northeurope"
resource_group_name = "demo05"
}
resource "azurerm_subnet" "subnet1" {
name = "snet1-ne-001"
resource_group_name = "demo05"
virtual_network_name = azurerm_virtual_network.vnet1.name
address_prefixes = ["20.0.0.0/24"]
}
resource "azurerm_virtual_network" "vnet2" {
name = "vnet2-ne-001"
address_space = ["20.1.0.0/16"]
location = "westus"
resource_group_name = "demo05"
}
resource "azurerm_subnet" "subnet2" {
name = "snet2-ne-001"
resource_group_name = "demo05"
virtual_network_name = azurerm_virtual_network.vnet2.name
address_prefixes = ["20.1.0.0/24"]
}
- main.tf dosyasını kaydettikten sonra önce Azure aboneliğinizde oturum açın. Ardından “terraform init” komutunu çalıştırın.
- “terraform apply” komutunu çalıştırın ve dağıtımı başlatın. Dağıtımı başlatırken terraform.tfstate dosyasının oluşturulduğunu görebilirsiniz.
- State dosyasını açtığınızda, Azure’a dağıtılan kaynakları içerdiğini görebilirsiniz.
- Şimdi main.tf dosyasındaki subnet1’in address_prefix’lerini değiştirelim. 20.0.3.0/24. Subnet1 şöyle görünmelidir.
resource "azurerm_subnet" "subnet1" {
name = "snet1-ne-001"
resource_group_name = "demo05"
virtual_network_name = azurerm_virtual_network.vnet1.name
address_prefixes = ["20.0.3.0/24"]
}
- main.tf dosyanızı kaydedin ve “terraform apply” komutunu yeniden çalıştırın. Terraform’un aşağıdaki gibi değişiklikler yapacağını görebilirsiniz.
- terraform.tfstate dosyası da güncellenecektir.
- Gördüğünüz gibi yapılan her değişiklik terraform.tfstate dosyasına ekleniyor. terraform.tfstate dosyasını siler ve “terraform apply” komutunu yeniden çalıştırırsanız, Terraform değişiklik yapmak yerine kaynakları yeniden dağıtmaya çalışacaktır. Bu nedenle, hatalar alırsınız. State dosyası, parolalar ve anahtarlar gibi hassas bilgiler içerebilir, bu nedenle kısıtlı bir yerde saklanması önerilir. Uzak state dosyasını nasıl kullanabileceğimizi görelim.
- Öncelikle state dosyasını tutmak için bir Azure Depolama Hesabı ve blob kapsayıcı oluşturalım.
az storage account create --name devcloudops22032021 --resource-group <span data-component="LabStep.resource_group">demo06</span> --location northeurope --sku Standard_LRS --encryption-services blob
az storage container create --name demo06 --account-name devcloudops22032021 --auth-mode login
- Şimdi aşağıdaki kodları main.tf dosyasına ekleyin.
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "2.40.0"
}
}
backend "azurerm" {
resource_group_name = "demo06"
storage_account_name = "devcloudops22032021"
container_name = "demo06"
key = "dev.terraform.tfstate"
}
}
provider "azurerm" {
features {}
}
resource "azurerm_virtual_network" "vnet" {
name = "vnet3-ne-001"
address_space = ["30.0.0.0/16"]
location = "northeurope"
resource_group_name = "demo06"
}
resource "azurerm_subnet" "subnet" {
name = "snet1-ne-001"
resource_group_name = "demo06"
virtual_network_name = azurerm_virtual_network.vnet.name
address_prefixes = ["30.0.0.0/24"]
}
- Backend bloğu, Terraform’un state dosyasıyla nasıl çalıştığını ifade eder. Varsayılan olarak, yerel backend kullanılır, ancak Terraform yapılandırma bloğu içinde bir backend bloğu oluşturmak, Terraform’a state dosyasını depolamak için bir Depolama Hesabı kullanmasını söyler.
- Şimdi “Terraform Apply” komutunu çalıştırın. ***Uygulama sırasında durum dosyası kilitlenir. Azure Blob Storage, dosyanın kilit durumunu tutuyor. Başka bir kullanıcı şu anda aynı uzak durum dosyasını kullanarak terraform apply çalıştıracak olsaydı, bir kilit hatası alırlardı.
Dizine bakıldığında yerel state dosyası yoktur, ancak .terraform klasörünün altında geçici bir dosya vardır.
Depolama hesabınızdaki containera bakarsanız, .tfstate dosyanızın burada olduğunu görebilirsiniz.