Terraform: Tek Projede Birden Fazla Azure Aboneliğine Dağıtım Yapma
Çoğu Terraform projesinde, muhtemelen Azure kaynaklarını tek bir Azure Aboneliği içinde dağıtimı ve yönetimi yapılmaktadır. Ancak, belirli durumlarda birden fazla Azure Aboneliği genelinde yapılandırmak da gerekmektedir. Bir Hub ve Spoke ağ modeli dağıtırken ve DEV ile PROD ortamlarını ayrı Azure Aboneliklerine ayırırken bu dağıtım durumları karşımıza çıkabilir.
Bu tarz dağıtım gereken zamanlarda, her biri farklı bir Azure Aboneliğini hedefleyen birden çok azurerm Terraform Provider örneğini desteklemeniz gerekir. Bunu yapmak için, farklı Azure Aboneliği ve/veya farklı Azure Hizmet Sorumlusu kimlik bilgileri (istemci kimliği/gizli) için yapılandırılmış birden çok azurerm sağlayıcısına sahip olmak üzere Terraform’daki provider bloğundaki alias özniteliğini kullanabilirsiniz.
Aynı kimlik bilgilerini kullanırken ve birden çok Azure Aboneliğine dağıtırken, azurerm sağlayıcısını, subscription_id bağımsız değişkenini kullanarak Azure Abonelik Kimliğini belirterek Terraform kodunda tanımlayabilirsiniz. Bu, aynı Terraform projesinde her biri farklı Azure Aboneliğini hedefleyen birden fazla Azure provider örneği ayarlamak için yapılabilir. Bu ayrıca, Terraform projesinde birden fazla sağlayıcı tarafından kullanılan aynı kimlik bilgilerinin (Kullanım veya Hizmet Sorumlusu), gerektiğinde her Azure Aboneliğindeki kaynakları yönetme izinlerine sahip olmasını gerektirir.
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "=3.0.0"
}
}
}
provider "azurerm" {
alias = "dev"
subscription_id = var.dev_sub_id
features {}
}
provider "azurerm" {
alias = "prod"
subscription_id = var.prod_sub_id
features {}
}
NOT: Var sayılan Azure aboneliği için bir alias ve subscription_id kullanmak zorunda değilsiniz.
Birden çok Azure Aboneliği genelinde Azure kaynaklarını yönetmek için tek bir Terraform projesi kullanıyorsanız ancak kullanılacak her azurerm sağlayıcısı için farklı kimlik bilgileri ayarlamanız gerekiyorsa bu kimlik bilgilerini uygun şekilde yapılandırmanız gerekir. Her Azure providerın farklı kimlik bilgileri kullanması gerektiğinde, her providerın kullanması için ayrı bir Azure Hizmet Sorumlusuna (istemci kimliği / secret) ihtiyacınız olacak ve her biri yalnızca tek bir Azure Aboneliğinde Azure kaynaklarını yönetme izinlerine sahip olacaktır. Bu, Kod Olarak Altyapı (IaC) dağıtımlarınızı kurmak için kullandığınız Hizmet Sorumlularının (Service Principal) güvenliğini artırmanıza yardımcı olur.
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "=3.0.0"
}
}
}
provider "azurerm" {
alias = "dev"
subscription_id = var.dev_sub_id
tenant_id = var.dev_tenant_id
client_id = var.dev_client_id
client_secret = var.dev_client_secret
features {}
}
provider "azurerm" {
alias = "prod"
subscription_id = var.prod_sub_id
tenant_id = var.prod_tenant_id
client_id = var.prod_client_id
client_secret = var.prod_client_secret
features {}
}
Terraform projenizde her biri için alias özniteliği ayarlanarak yapılandırılmış birden çok azurerm Terraform Sağlayıcınız olduğunda, o kaynak bloğa belirtilen diğer adla belirli bir azurerm Terraform sağlayıcısını açıkça kullanmasını söylemek için kaynak bloklarında provider özniteliğini kullanabilirsiniz.
resource azurerm_resource_group "prod_rg" {
provider = azurerm.prod
name = "MSAZURERTURKEY-PROD-RG"
location = "northeurope"
}
resource azurerm_virtual_network "prod_vnet" {
provider = azurerm.prod
name = "MSAZURERTURKEY-PROD-VNET"
location = azurerm_resource_group.prod_rg.location
location = azurerm_resource_group.prod_rg.name
}
resource azurerm_resource_group "dev_rg" {
provider = azurerm.dev
name = "MSAZURERTURKEY-DEV-RG"
location = "northeurope"
}
resource azurerm_virtual_network "dev_vnet" {
provider = azurerm.dev
name = "MSAZURERTURKEY-DEV-VNET"
location = azurerm_resource_group.prod_rg.location
location = azurerm_resource_group.prod_rg.name
}
Resource.provider özniteliğiyle, Terraform kodunuza söz konusu kaynak için hangi belirli Terraform Sağlayıcının kullanılacağını söylüyorsunuz. Alias özniteliğiyle birden çok azurerm sağlayıcısı tanımlayarak, tek bir Terraform projesinde kullanılmak üzere azurerm sağlayıcısının birden çok örneğini ayarlayabilirsiniz. Bu, azurerm sağlayıcısı veya başka herhangi bir Terraform sağlayıcısı ile de yapılabilir.
Bu makaledeki tüm Terraform örnekleri, Azure kimlik bilgilerini birden fazla yapılandırılmış Azure sağlayıcısına iletmek için değişkenleri (var kullanımı aracılığıyla) kullanır. Güvenlik söz konusu olduğunda Terraform dağıtımlarını kurarken en iyi uygulama budur. Azure Hizmet Sorumluları için client_id ve client_secret’in Terraform kodunda sabit olarak kodlanması, bu kimlik bilgilerinin kaynak denetimine tabi olacağı ve kötü niyetli kötüye kullanıma karşı savunmasız hale geleceği anlamına gelir.