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
'IaC > Terraform' 카테고리의 다른 글
[Terraform] Azure에 Terraform을 인증하는 방법 (0) | 2023.12.28 |
---|---|
[Terraform] 기본 명령어 및 파일/디렉터리 (1) | 2023.12.28 |
[Terraform] Sensitive variable (0) | 2023.12.28 |
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
'IaC > Terraform' 카테고리의 다른 글
[Terraform] Azure에 Terraform을 인증하는 방법 (0) | 2023.12.28 |
---|---|
[Terraform] 기본 명령어 및 파일/디렉터리 (1) | 2023.12.28 |
[Terraform] Sensitive variable (0) | 2023.12.28 |