Bicep 및 Azure Policy: 사용자 지정 Azure 정책 생성 및 관리

Azure Policy에 대한 두 번째 게시물입니다. 정책 정의와 Azure Bicep 및 PowerShell을 사용하여 사용자 지정 정책을 관리하는 방법에 중점을 둡니다.

Azure는 광범위한 상황 및 거버넌스 전략을 다루는 여러 정책 정의를 제공합니다.
그러나 때로는 특정 요구 사항과 요구 사항을 충족하는 정책이 필요합니다. 고유한 사용자 지정 Azure Policy를 작성해야 합니다.

Azure Policy는 여러 속성이 있는 JSON 파일입니다.
  • 이름(64자로 제한)
  • 표시 이름(128자로 제한)
  • 설명
  • 정책 모드, 모두(모든 리소스에 대해) 또는 인덱싱됨(태그 및 위치를 지원하는 리소스만)
  • 메타데이터(버전, 범주, ...)
  • 매개변수 블록
  • 대상 리소스를 필터링하는 평가 및 효과를 포함하는 정책 규칙 블록
  • 사용자 지정 정책을 생성하는 유형이므로 사용자 지정이 됩니다
  • .

    Bicep에서 이러한 정책 요소와 정책 이름(배포 범위가 있는 정책 ID를 형성함)을 검색할 수 있습니다.

    resource symbolicname 'Microsoft.Authorization/policyDefinitions@2021-06-01' = {
      name: 'string'
      properties: {
        description: 'string'
        displayName: 'string'
        metadata: any()
        mode: 'string'
        parameters: {}
        policyRule: any()
        policyType: 'string'
      }
    }
    


    정책 이니셔티브와 마찬가지로 정책 정의는 지정된 범위, 관리 그룹 또는 구독에 배포됩니다.

    이제 작업이 여러 정책 정의를 배포하고 일부 기존 정책을 업데이트하는 것이라고 상상해 보십시오. PowerShell 및 Bicep을 사용하여 이 작업을 어떻게 자동화할 수 있습니까?
    하나의 정책만 관리하는 것이 아니라 여러 정책을 관리해야 할 수도 있습니다.

    정책 정의는 JSON 파일이며 PowerShell 스크립트로 쉽게 읽을 수 있습니다. 모든 정책 정의 JSON 파일을 단일 폴더에 넣으면 PowerShell이 ​​파일을 구문 분석하고 정책 정의를 배포하는 데 필요한 모든 정보를 추출할 수 있습니다.

    정책 정의를 배포하려면 bicep 파일이 필요합니다.

    targetScope = 'managementGroup' 
    
    @maxLength(64)
    @description('PolicySet name')
    param defintionName string 
    
    @maxLength(128)
    @description('PolicySet display Name')
    param definitionDisplayName string
    
    @description('PolicySet description')
    param definitionDescription string
    
    @allowed([
      'All'
      'Indexed'
    ])
    @description('Policy Definition Mode')
    param policyMode string
    
    @description('JSON string')
    param policyParameters string
    
    @description('JSON string')
    param policyMetadata string
    
    @description('JSON string')
    param policyRule string
    
    resource policyInitiative 'Microsoft.Authorization/policyDefinitions@2021-06-01' = {
      name: defintionName
      properties: {
        displayName: definitionDisplayName
        description: definitionDescription
        policyType: 'Custom'
        mode: policyMode
        metadata: json(policyMetadata)
    
        parameters: json(policyParameters) 
    
        policyRule: json(policyRule)
      }
    }
    


    정책 이니셔티브와 마찬가지로 대상 범위는 관리 그룹이지만 구독으로 변경될 수 있습니다.
    definitionName 및 defintionDisplayName 매개변수는 길이가 제한되어 있으므로 배포 오류를 방지하려면 제어가 필요합니다.
    정책 모드는 인덱싱된 값(태그를 지원하는 리소스의 경우) 또는 모두(모든 리소스 유형)의 두 값만 가질 수 있습니다. policyMode 매개변수는 이 두 값의 선택을 제한합니다.

    메타데이터, 매개 변수 및 policyRule의 경우 bicep는 JSON 개체만 허용하지만 PowerShell은 JSON 개체의 문자열 표현만 제공할 수 있습니다. bicep 함수 json()은 문자열을 해당 JSON 개체로 변환하기 위해 여기에 있습니다.

    PowerShell 스크립트는 지정된 폴더의 모든 JSON 파일을 구문 분석하고 displayName, Description 및 모드를 문자열로, 매개 변수, 메타데이터 및 policyRule을 JSON 개체로 추출해야 합니다. 그런 다음 bicep 배포를 실행할 수 있습니다.
    정책 정의의 이름은 JSON 파일의 이름에서 추출됩니다.

    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [string]
        $managementGroupID,
    
        [string]
        $location = "westeurope"
    )
    
    $jsonFilesList = Get-ChildItem -Path ./definition/* -include *.json 
    
    foreach ($jsonFile in $jsonFilesList) {
        $jsonData = Get-Content -Path $jsonFile.FullName | ConvertFrom-Json  
        $displayName = $jsonData.properties.DisplayName 
        $name = $jsonFile.name.replace(".json","")
        $parameters = $jsonData.properties.parameters | convertTo-Json  -Depth 5
        $policyRules = $jsonData.properties.policyRule | convertTo-Json  -Depth 5
        $policyMetadata = $jsonData.properties.metadata | convertTo-Json  -Depth 5
        $mode = $jsonData.properties.mode 
        $description = $jsonData.properties.description 
    
        $randomNumber = Get-Random
        $deployName = "$($name)-$($randomNumber)"
        New-AzManagementGroupDeployment -Name $deployName  -ManagementGroupId $managementGroupID -Location $location -TemplateFile ./deployDefinition.bicep -defintionName $name -definitionDisplayName $displayName -definitionDescription $description -policyMode $mode -policyParameters $parameters -policyMetadata $policyMetadata -policyRule $policyRules
    }
    


    다음 포스팅에서는 과제에 대해 알아보겠습니다.

    좋은 웹페이지 즐겨찾기