IaC/Terraform

[Terraform] 다중 Provider 구성

pepe_ 2023. 12. 29. 16:51

1. 동일한 자격 증명을 사용하여 여러 Azure 구독에 배포

  • 여러 provider 블록을 생성하고 각각에 대한 alias를 지정한다.
  • provider 블록에 사용하고자 하는 Azure 구독 id를 입력한다.
# provider.tf

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 {}
}

 

1) module block에서 provider 지정

  • module에 하기와 같은 형식으로 Provider를 지정한다.
  • providers = {
      azurerm = <provider_name>.<alias_name>
     }
# main.tf

module "sample-dev" {
  source = "./sample-module"
  providers = {
    azurerm = azurerm.dev
  }
}

module "sample-prod" {
  source = "./sample-module"
  providers = {
    azurerm = azurerm.prod
  }
}

 

2) resource block에서 provider 지정

  • resource에 하기와 같은 형식으로 Provider를 지정한다.
  • provider = <provider_name>.<alias_name>
# main.tf

resource azurerm_resource_group "prod_rg" {
  provider = azurerm.prod
  name     = "PROD-RG"
  location = "koreacentral"
}

resource azurerm_virtual_network "prod_vnet" {
  provider = azurerm.prod
  name     = "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     = "DEV-RG"
  location = "koreacentral"
}

resource azurerm_virtual_network "dev_vnet" {
  provider = azurerm.dev
  name     = "DEV-VNET"
  location = azurerm_resource_group.prod_rg.location
  location = azurerm_resource_group.prod_rg.name
}

 

2. 서로 다른 자격 증명을 사용하여 여러 Azure 구독에 배포

  • 각 provider가 사용할 별도의 Azure Service Principal과 Azure 리소스를 관리할 수 있는 권한이 필요하다.
  • 각 provider 블록에 alias를 지정한다.
1. Service Principal 생성
az ad sp create-for-rbac --name {Service Principal Name}

# 출력의 값의 appId와 password를 복사
# provider.tf에서 client_id에 appId를, client_secret에 password를 입력
{
"appId": "559513bd-0c19-4c1a-87cd-851a26afd5fc",
"displayName": "myAKSClusterServicePrincipal",
"name": "http://myAKSClusterServicePrincipal",
"password": "e763725a-5eee-40e8-a466-dc88d980f415",
"tenant": "72f988bf-86f1-41af-91ab-2d7cd011db48"
}

2. Service Principal 권한 부여
# 예시로 사용한 권한이며 세부적인 권한 부여 가능

# Service Principal에 기여자 권한 부여
az role assignment create --assignee "{Service Principald appId}" \
--role "Contributor" \
--subscription "{subscriptionNameOrId}"

# Service Principal에 사용자 액세스 관리자 권한 부여
az role assignment create --assignee "{Service Principald appId}" \
--role "User Access Administrator" \
--subscription "{subscriptionNameOrId}"
# provider.tf

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 {}
}

 

3. 기본적으로 사용할 provider가 있고, 특정 상황에서 사용할 provider 정의

  • 기본적으로 사용할 provider에는 alias를 지정하지 않는다. 
  • 추가로 사용하는 provider에 alias를 지정한다.
# provider.tf

terraform {
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "=3.0.0"
    }
  }
}

# "Default" provider
provider "azurerm" {
  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 {}
}

# "prod" alias로 정의한 provider
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 {}
}

 

1) module block에서 provider 지정

  • 기본으로 사용하는 provider는 module에 따로 지정할 필요없다.
  • 추가로 사용할 provider만 module에 따로 지정한다.
# main.tf

# "Default" provider 사용
module "sample-dev" {
  source = "./sample-module"
}

# "prod" alias로 정의된 provider 사용
module "sample-prod" {
  source = "./sample-module"
  providers = {
    azurerm = azurerm.prod
  }
}

 

2) resource block에서 provider 지정

  • 기본으로 사용하는 provider는 resource에 따로 지정할 필요없다.
  • 추가로 사용할 provider만 resource에 따로 지정한다.
# main.tf

# "Default" provider 사용
resource azurerm_resource_group "dev_rg" {
  name     = "DEV-RG"
  location = "koreacentral"
}

# "prod" alias로 정의된 provider 사용
resource azurerm_resource_group "prod_rg" {
  provider = azurerm.prod
  name     = "PROD-RG"
  location = "koreacentral"
}

 


 

참고

 

Terraform: Deploy To Multiple Azure Subscriptions In Single Project | Build5Nines

In most Terraform projects you'll probably be deploying and managing Azure resources within a single Azure Subscription. However, it's common to structure

build5nines.com