Azure Bicep: targetScope = ‘tenant’ 배포 권한 문제

tagetScope = ‘tenant’

배포 범위를 테넌트(Azure Entra ID, 이전 Azure AD)로 지정한 이유는, 각 리소스들이 동일한 구독, 리소스 그룹이 아닌 다른 구독 및 리소스 그룹에 배포할 필요가 있어서이다.

현재 참여하는 프로젝트의 Azure 환경은 하나의 Hub subscription 과 여러 Spoke subscription 으로 구성되어 있다. Azure PaaS 서비스는 대체로 Private Endpoint를 사용하며, Hub subsription의 Private DNS Zone에 DNS 통합(DNS Integration) 의 필요성이 있다.

추가적으로, 네트워크 리소스(ex: virtual network, network security group, private endpoint etc)는 Network 전용 리소스 그룹에 배포할 필요가 있다. ※몇 가지 부분에서 굉장히 비효율적으로 관리하고 있다는 생각이 든다.

// 구독(Subscription)으로 범위 지정

targetScope = 'tenant'

param subscriptionID string

@description('create resources at subscription level')
module  'module.bicep' = {
  name: 'deployToSub'
  scope: subscription(subscriptionID)
}

// 리소스 그룹(Resource group)으로 범위 지정

targetScope = 'tenant'

param resourceGroupName string
param subscriptionID string

@description('create resources at resource group level')
module  'module.bicep' = {
  name: 'deployToRG'
  scope: resourceGroup(subscriptionID, resourceGroupName)
}

그래서 targetScope를 손봐야 하는데, 기본적으로 범위를 지정하지 않는 경우에는 리소스 그룹 범위가 자동적으로 적용된다.

az deployment group create --template-file ./main.bicep --parameters ./main.bicepparm --resource-group myResourceGroup

Tip. 위와 같이, 기본적으로 Bicep 코드에 기재된 리소스는 단일 리소스 그룹에 배포하도록 짜여져 있다.

Error: 권한 부여 실패

Bicep 파일을 사용하여 테넌트 배포

배포에 필요한 명령어 및 권한을 Microsoft Azure 의 문서를 통해 확인할 수 있었는데, 문제는 에러가 발생 했다.

 C:\Users\xxxx\OneDrive\Vscode\azure-bicep> az role assignment create --assignee "xxxxxx-xxxxxx-xxxxxx-xxxxxx" --scope "/" --role "Owner"                                                             

(AuthorizationFailed) The client 'live.com#xxx@xxx.xxx' with object id 'xxxxxx-xxxxxx-xxxxxx-xxxxxx' does not have authorization to perform action 'Microsoft.Authorization/roleAssignments/write' over scope '/providers/Microsoft.Authorization/roleAssignments/xxxxxx-xxxxxx-xxxxxx-xxxxxx' or the scope is invalid. If access was recently granted, please refresh your credentials.

Code: AuthorizationFailed

Message: The client 'live.com#xxx@xxx.xxx' with object id 'xxxxxx-xxxxxx-xxxxxx-xxxxxx' does not have authorization to perform action 'Microsoft.Authorization/roleAssignments/write' over scope '/providers/Microsoft.Authorization/roleAssignments/xxxxxx-xxxxxx-xxxxxx-xxxxxx' or the scope is invalid. If access was recently granted, please refresh your credentials.

문제점 확인 및 해결 방법

관리자 계정 Global Administrator

Microsoft Learn 참고

Bicep을 사용하여 테넌트에 리소스 배포: 필요한 액세스

  • 템플릿을 배포하는 주체는 테넌트 범위에서 리소스를 만들 수 있는 권한이 있어야 합니다. 보안 주체는 배포 작업(Microsoft.Resources/deployments/*)을 실행하고 템플릿에 정의된 리소스를 만들 수 있는 권한이 있어야 합니다. 예를 들어 관리 그룹을 만들려면 보안 주체에 테넌트 범위의 기여자 권한이 있어야 합니다. 역할 할당을 만들려면 보안 주체에 소유자 권한이 있어야 합니다.
  • Microsoft Entra ID의 Global Administrator에는 역할을 할당할 수 있는 권한이 자동으로 없습니다. 테넌트 범위에서 템플릿 배포를 사용하도록 설정하려면 Global Administrator가 다음 단계를 수행해야 합니다.
  • 계정 액세스 권한을 승격하여 전역 관리자가 역할을 할당할 수 있도록 합니다. 자세한 내용은 모든 Azure 구독 및 관리 그룹을 관리할 수 있도록 액세스 권한 상승을 참조하세요.
  • 템플릿을 배포해야 하는 보안 주체에 소유자 또는 기여자를 할당합니다.

아래와 같이, Global Aministrator 계정의 권한 상승이 필요하다.

테넌트 접근 권한 허용

Microsoft Entra ID – Properties 접근 권한을 활성화

보안 주체(Principal)에 소유자(Owner) 권한 부여

az role assignment create --assignee "[userId]" --scope "/" --role "Owner"
User Object ID 확인