자습서: Azure Policy를 사용하여 태그 거버넌스 관리

태그는 Azure 리소스를 분류로 구성하는 데 중요한 부분입니다. 태그 관리에 대한 모범 사례를 따르는 경우 태그는 Azure Policy를 사용하여 비즈니스 정책을 적용하거나 Cost Management를 사용하여 비용을 추적하기 위한 기초가 될 수 있습니다. 태그를 사용하는 방법이나 이유에 관계없이 Azure 리소스에서 해당 태그를 신속하게 추가, 변경 및 제거할 수 있는 것이 중요합니다. Azure 리소스에서 태그 지정을 지원하는지 확인하려면 태그 지원을 참조하세요.

Azure Policy의 수정 효과는 리소스 거버넌스의 단계에 관계없이 태그의 거버넌스를 지원하도록 설계되었습니다. 수정 은 다음 경우에 도움이 됩니다.

  • 클라우드를 익숙하지 않으며 태그 거버넌스가 없습니다.
  • 태그 거버넌스가 없는 수천 개의 리소스가 이미 있습니다.
  • 변경해야 하는 기존 분류가 이미 있습니다.

이 자습서에서는 다음 작업을 완료합니다.

  • 비즈니스 요구 사항 식별
  • 각 요구 사항을 정책 정의에 매핑
  • 태그 정책을 이니셔티브로 그룹화

필수 조건

이 자습서를 완료하려면 Azure 구독이 필요합니다. 구독이 없으면 시작하기 전에 계정을 만드세요.

ID 요구 사항

거버넌스 제어를 구현하는 경우와 마찬가지로, 비즈니스 요구에 맞는 요구 사항을 준비하여 기술 제어를 만들기 전에 잘 이해해야 합니다. 이 시나리오 자습서의 경우 다음 항목은 비즈니스 요구 사항입니다.

  • 모든 리소스에 필요한 두 개의 태그: CostCenterEnv
  • CostCenter는 모든 컨테이너 및 개별 리소스에 있어야 합니다.
    • 리소스는 현재 컨테이너에서 상속되지만 개별적으로 재정의될 수 있습니다.
  • Env 는 모든 컨테이너 및 개별 리소스에 있어야 합니다.
    • 리소스는 컨테이너 명명 체계에 따라 환경을 결정하며 재정의되지 않을 수 있습니다.
    • 컨테이너의 모든 리소스는 동일한 환경의 일부입니다.

CostCenter 태그 구성

Azure Policy 에서 관리하는 Azure 환경과 관련된 측면에서 CostCenter 태그 요구 사항은 다음 결과를 요구합니다.

  • CostCenter 태그가 누락된 Deny 리소스 그룹
  • 누락된 경우 부모 리소스 그룹에서 CostCenter 태그를 추가하도록 리소스 수정

CostCenter 태그가 누락된 Deny 리소스 그룹

리소스 그룹의 CostCenter는 리소스 그룹의 이름으로 확인할 수 없으므로 리소스 그룹을 만들기 위한 요청에 정의된 태그가 있어야 합니다. Deny 효과가 포함된 다음 정책 규칙은 CostCenter 태그가 없는 리소스 그룹이 생성되거나 업데이트되지 않도록 합니다.

"if": {
    "allOf": [{
            "field": "type",
            "equals": "Microsoft.Resources/subscriptions/resourceGroups"
        },
        {
            "field": "tags['CostCenter']",
            "exists": false
        }
    ]
},
"then": {
    "effect": "deny"
}

참고 항목

이 정책 규칙은 리소스 그룹을 대상으로 하기 때문에 정책 정의의 mode는 'Indexed'가 아닌 'All'이어야 합니다.

누락된 경우 CostCenter 태그를 상속하도록 리소스 수정

두 번째 CostCenter 요구는 누락된 경우 모든 리소스가 부모 리소스 그룹에서 태그를 상속하는 것입니다. 리소스에 태그가 이미 정의되어 있으면, 부모 리소스 그룹과 다르더라도 태그를 그대로 두어야 합니다. 다음 정책 규칙은 Modify를 사용합니다.

"policyRule": {
    "if": {
        "field": "tags['CostCenter']",
        "exists": "false"
    },
    "then": {
        "effect": "modify",
        "details": {
            "roleDefinitionIds": [
                "/providers/microsoft.authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"
            ],
            "operations": [{
                "operation": "add",
                "field": "tags['CostCenter']",
                "value": "[resourcegroup().tags['CostCenter']]"
            }]
        }
    }
}

이 정책 규칙은 기존 리소스를 수정할 때 태그 값이 있는 경우 태그 값을 변경하지 않기 때문에 addOrReplace 대신 추가 작업을 사용합니다. 또한 템플릿 함수를 [resourcegroup()] 사용하여 부모 리소스 그룹에서 태그 값을 가져옵니다.

참고 항목

이 정책 규칙은 태그 를 지원하는 리소스를 대상으로 하므로 정책 정의의 모드 는 '인덱싱됨'이어야 합니다. 또한 이 구성은 이 정책이 리소스 그룹을 건너뛰도록 합니다.

Env 태그 구성

Azure Policy 에서 관리하는 Azure 환경과 관련된 측면에서 Env 태그 요구 사항은 다음 결과를 요구합니다.

  • 리소스 그룹의 명명 체계에 따라 리소스 그룹의 Env 태그 수정
  • 리소스 그룹의 모든 리소스에 대한 Env 태그를 부모 리소스 그룹과 동일하게 수정합니다.

이름에 따라 리소스 그룹 Env 태그 수정

Azure 환경에 존재하는 각 환경에 대해 수정 정책이 필요합니다. 각각에 대한 수정 정책은 다음 정책 정의와 유사합니다.

"policyRule": {
    "if": {
        "allOf": [{
            "field": "type",
            "equals": "Microsoft.Resources/subscriptions/resourceGroups"
        },
        {
            "field": "name",
            "like": "prd-*"
        },
        {
            "field": "tags['Env']",
            "notEquals": "Production"
        }

    ]
    },
    "then": {
        "effect": "modify",
        "details": {
            "roleDefinitionIds": [
                "/providers/microsoft.authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"
            ],
            "operations": [{
                "operation": "addOrReplace",
                "field": "tags['Env']",
                "value": "Production"
            }]
        }
    }
}

참고 항목

이 정책 규칙은 리소스 그룹을 대상으로 하기 때문에 정책 정의의 mode는 'Indexed'가 아닌 'All'이어야 합니다.

이 정책은 리소스 그룹과 프로덕션 리소스에 사용되는 샘플 명명 체계만 일치합니다 prd-. 이 예제와 같이 like만 사용하는 대신 여러 가지 match 조건을 사용하면 더 복잡한 이름 지정 체계를 구현할 수 있습니다.

Env 태그를 상속하도록 리소스 수정

비즈니스 요구 사항에 따라 모든 리소스에 부모 리소스 그룹이 수행하는 Env 태그가 있어야 합니다. 이 태그는 재정의할 수 없기 때문에 addOrReplace 작업을Modify 효과와 함께 사용합니다. 정책 수정 샘플은 다음 규칙과 같습니다.

"policyRule": {
    "if": {
        "anyOf": [{
            "field": "tags['Env']",
            "notEquals": "[resourcegroup().tags['Env']]"
        },
        {
            "field": "tags['Env']",
            "exists": false
        }
    ]
    },
    "then": {
        "effect": "modify",
        "details": {
            "roleDefinitionIds": [
                "/providers/microsoft.authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"
            ],
            "operations": [{
                "operation": "addOrReplace",
                "field": "tags['Env']",
                "value": "[resourcegroup().tags['Env']]"
            }]
        }
    }
}

참고 항목

이 정책 규칙은 태그 를 지원하는 리소스를 대상으로 하므로 정책 정의의 모드 는 '인덱싱됨'이어야 합니다. 또한 이 구성은 이 정책이 리소스 그룹을 건너뛰도록 합니다.

이 정책 규칙은 Env 태그에 대한 부모 리소스 그룹 값이 없거나 Env 태그가 누락된 리소스를 찾습니다. 일치하는 리소스에는 태그가 리소스에 이미 있지만 다른 값을 가진 경우에도 해당 Env 태그가 부모 리소스 그룹 값으로 설정됩니다.

이니셔티브 할당 및 리소스 수정

위의 태그 정책이 만들어지면 태그 거버넌스를 위한 단일 이니셔티브에 가입하고 관리 그룹 또는 구독에 할당합니다. 그런 다음 이니셔티브 및 포함된 정책은 기존 리소스의 준수를 평가하고 정책 규칙의 if 속성과 일치하는 새 리소스 또는 업데이트된 리소스에 대한 요청을 변경합니다. 그러나 정책은 정의된 태그 변경 내용으로 기존 비준수 리소스를 자동으로 업데이트하지 않습니다.

deployIfNotExists 정책과 마찬가지로 수정 정책은 수정 작업을 사용하여 기존의 비준수 리소스를 변경합니다. 리소스를 수정하는 방법에 대한 지침에 따라 비준수 수정 리소스를 식별하고 태그를 정의된 분류로 수정합니다.

리소스 정리

이 자습서에서 리소스 작업을 완료한 경우 다음 단계를 사용하여 위에서 만든 할당 또는 정의를 삭제합니다.

  1. Azure Policy 페이지의 왼쪽에 있는 작성 아래에서 정의(또는할당을 삭제하려는 경우 할당)를 선택합니다.

  2. 제거할 새 이니셔티브 또는 정책 정의(또는 할당)를 검색합니다.

  3. 행을 마우스 오른쪽 단추로 클릭하거나 정의(또는 할당) 끝에 있는 줄임표를 선택하고 정의 삭제(또는 할당 삭제)를 선택합니다.

검토

이 자습서에서는 다음 작업에 대해 알아보았습니다.

  • 비즈니스 요구 사항 식별
  • 각 요구 사항을 정책 정의에 매핑
  • 태그 정책을 이니셔티브로 그룹화

다음 단계

정책 정의의 구조에 대해 자세히 알아보려면 다음 문서를 참조하세요.