Share via


Azure Policy 상태 변경 이벤트에 대응

Azure Policy 이벤트를 사용하면 애플리케이션이 상태 변경에 대응할 수 있습니다. 이 통합은 복잡한 코드나 비용이 많이 들고 비효율적인 폴링 서비스가 없어도 가능합니다. 대신, 이벤트는 Azure Event Grid를 통해 Azure Functions, Azure Logic Apps와 같은 구독자 또는 자체 사용자 지정 HTTP 수신기로도 푸시됩니다. 중요한 것은 사용한 양만큼만 요금을 지불한다는 것입니다.

Azure Policy 이벤트는 다양한 다시 시도 정책 및 배달 못한 편지를 통해 애플리케이션에 신뢰할 수 있는 배달 서비스를 제공하는 Azure Event Grid 서비스에 전송됩니다. Event Grid는 Event Grid 구독을 통해 대상에 대한 이벤트의 적절한 라우팅, 필터링, 멀티캐스팅을 처리합니다. 자세한 내용은 Event Grid 메시지 배달 및 다시 시도를 참조하세요.

참고 항목

평가 트리거가 리소스 평가를 완료한 다음, Azure Policy 상태 변경 이벤트가 Event Grid로 전송됩니다.

리소스 준수 상태 변경에 대한 Event Grid 알림은 최대 20분이 걸릴 수 있습니다.

Event Grid 혜택

Event Grid에는 Azure 에코시스템의 고객 및 서비스를 위한 몇 가지 혜택이 있습니다.

  • 자동화: 정책 환경을 최신 상태로 유지하기 위해 Event Grid는 규정 준수 상태에 따라 경고를 생성하고 작업을 트리거하는 자동화된 메커니즘을 제공합니다.
  • 지속성 제공: 서비스 및 사용자 애플리케이션이 정책 준수 이벤트에 실시간으로 응답할 수 있도록 Event Grid는 지연 시간을 최소화하는 정책 이벤트를 제공하려고 합니다. Event Grid는 구독자의 엔드포인트가 이벤트 수신을 확인하지 못하거나 수신하지 못한 경우 미리 정해진 재시도 일정과 재시도 정책에 따라 이벤트 전송을 다시 시도합니다.
  • 사용자 지정 이벤트 생산자: Event Grid 이벤트 생산자 및 소비자는 Azure 또는 Microsoft 서비스일 필요가 없습니다. 외부 애플리케이션은 경고를 수신하거나, 수정 작업의 생성을 표시하거나, 상태 변경에 응답하는 사람에 대한 메시지를 수집할 수 있습니다. 전체 자습서는 Azure CLI를 사용하여 정책 상태 변경 이벤트를 Event Grid로 라우팅을 참조하세요.

Event Grid를 사용하는 경우에는 두 가지 기본 엔터티가 있습니다.

  • 이벤트: 이러한 이벤트는 VM 또는 스토리지 계정과 같은 리소스의 정책 준수 상태가 생성, 변경, 삭제되는 경우를 포함하여 사용자가 반응할 수 있는 모든 것이 될 수 있습니다.
  • Event Grid 구독: 이러한 이벤트 구독은 게시자에서 구독자에게 적절한 이벤트 집합을 안내하는 사용자 구성 엔터티입니다. 이벤트 구독은 이벤트가 시작된 리소스 경로와 이벤트 유형에 따라 이벤트를 필터링할 수 있습니다. 또한 이벤트 구독은 Azure 구독과 관리 그룹 간의 범위를 기준으로 필터링할 수도 있습니다.

일반적인 Azure Policy 이벤트 시나리오에서는 정책을 평가하는 동안 리소스의 준수 상태가 변경되는 시기를 추적합니다. 이벤트 기반 아키텍처는 이러한 변화에 대응하는 효율적인 방법이며 규정 준수 상태 변화에 대한 이벤트 기반 대응을 지원합니다.

또 다른 시나리오는 정책 페이지에서 수정 작업 만들기를 수동으로 선택하지 않고 자동으로 수정 작업을 트리거하는 것입니다. Event Grid는 준수 상태를 확인하고 현재 비준수인 리소스를 수정할 수 있습니다. 수정 구조에 대해 자세히 알아봅니다. 수정하려면 관리되는 ID가 필요하며 정책이 수정 또는 DeployIfNotExist 효과에 있어야 합니다. 효과 유형에 대해 자세히 알아봅니다.

또한 Event Grid는 상태 변경 내용을 저장하고 시간 경과에 따른 규정 위반의 원인을 파악하는 감사 시스템으로도 유용합니다. Event Grid에 대한 시나리오는 무한하며 동기에 따라 Event Grid를 구성할 수 있습니다.

Screenshot of Event Grid model of sources and handlers.

사용할 수 있는 이벤트 유형

Azure Policy는 다음과 같은 이벤트 형식을 내보냅니다.

이벤트 유형 설명
Microsoft.PolicyInsights.PolicyStateCreated 정책 준수 상태를 만들 때 발생합니다.
Microsoft.PolicyInsights.PolicyStateChanged 정책 준수 상태를 변경할 때 발생합니다.
Microsoft.PolicyInsights.PolicyStateDeleted 정책 준수 상태를 삭제할 때 발생합니다.

이벤트 속성

이벤트에는 다음과 같은 최상위 데이터가 있습니다.

속성 Type Description
topic string 이벤트 원본에 대한 전체 리소스 경로입니다. 이 필드는 쓸 수 없습니다. Event Grid는 이 값을 제공합니다.
subject string 리소스 이름과 리소스 형식을 포함하여 준수 상태 변경이 적용되는 리소스의 정규화된 ID입니다. /subscriptions/<SubscriptionID>/resourceGroups/<ResourceGroup>/providers/<ProviderNamespace>/<ResourceType>/<ResourceName> 형식 사용
eventType string 이 이벤트 원본에 대해 등록된 이벤트 유형 중 하나입니다.
eventTime string 공급자의 UTC 시간을 기준으로 이벤트가 생성되는 시간입니다.
id string 이벤트에 대한 고유 식별자입니다.
data 개체 Azure Policy 이벤트 데이터.
dataVersion string 데이터 개체의 스키마 버전입니다. 게시자가 스키마 버전을 정의합니다.
metadataVersion string 이벤트 메타데이터의 스키마 버전입니다. Event Grid는 최상위 속성의 스키마를 정의합니다. Event Grid는 이 값을 제공합니다.

데이터 개체의 속성은 다음과 같습니다.

속성 Type Description
timestamp string Azure Policy에서 리소스를 스캔한 시간(UTC)입니다. 이벤트 순서 지정을 위해 최상위 수준 eventTime이나 time 속성이 아니라 이 속성을 사용합니다.
policyAssignmentId string 정책 할당의 리소스 ID입니다.
policyDefinitionId string 정책 정의의 리소스 ID입니다.
policyDefinitionReferenceId string 이니셔티브의 정책 할당이면 이니셔티브 정의에 있는 정책 정의의 참조 ID입니다. 비어 있을 수 있습니다.
complianceState string 정책 할당과 관련된 리소스의 준수 상태입니다.
subscriptionId string 리소스의 구독 ID입니다.
complianceReasonCode string 준수 이유 코드입니다. 비어 있을 수 있습니다.

예제 이벤트

다음 예는 구독 수준에서 범위가 지정된 정책 상태 만들기 이벤트의 스키마를 보여 줍니다.

[{
    "id": "5829794FCB5075FCF585476619577B5A5A30E52C84842CBD4E2AD73996714C4C",
    "topic": "/subscriptions/<SubscriptionID>",
    "subject": "/subscriptions/<SubscriptionID>/resourceGroups/<ResourceGroup>/providers/<ProviderNamespace>/<ResourceType>/<ResourceName>",
    "data": {
        "timestamp": "2021-03-27T18:37:42.4496956Z",
        "policyAssignmentId": "<policy-assignment-scope>/providers/microsoft.authorization/policyassignments/<policy-assignment-name>",
        "policyDefinitionId": "<policy-definition-scope>/providers/microsoft.authorization/policydefinitions/<policy-definition-name>",
        "policyDefinitionReferenceId": "",
        "complianceState": "NonCompliant",
        "subscriptionId": "<subscription-id>",
        "complianceReasonCode": ""
    },
    "eventType": "Microsoft.PolicyInsights.PolicyStateCreated",
    "eventTime": "2021-03-27T18:37:42.5241536Z",
    "dataVersion": "1",
    "metadataVersion": "1"
}]

구독 수준에서 범위가 지정된 정책 상태 변경 이벤트에 대한 스키마는 다음과 유사합니다.

[{
    "id": "5829794FCB5075FCF585476619577B5A5A30E52C84842CBD4E2AD73996714C4C",
    "topic": "/subscriptions/<SubscriptionID>",
    "subject": "/subscriptions/<SubscriptionID>/resourceGroups/<ResourceGroup>/providers/<ProviderNamespace>/<ResourceType>/<ResourceName>",
    "data": {
        "timestamp": "2021-03-27T18:37:42.4496956Z",
        "policyAssignmentId": "<policy-assignment-scope>/providers/microsoft.authorization/policyassignments/<policy-assignment-name>",
        "policyDefinitionId": "<policy-definition-scope>/providers/microsoft.authorization/policydefinitions/<policy-definition-name>",
        "policyDefinitionReferenceId": "",
        "complianceState": "NonCompliant",
        "subscriptionId": "<subscription-id>",
        "complianceReasonCode": ""
    },
    "eventType": "Microsoft.PolicyInsights.PolicyStateChanged",
    "eventTime": "2021-03-27T18:37:42.5241536Z",
    "dataVersion": "1",
    "metadataVersion": "1"
}]

다음 예는 관리 그룹 수준에서 범위가 지정된 정책 상태 만들기 이벤트의 스키마를 보여 줍니다.

[{
    "id": "5829794FCB5075FCF585476619577B5A5A30E52C84842CBD4E2AD73996714C4C",
    "topic": "/tenants/<tenantId>/providers/Microsoft.Management/managementGroups/<managementGroupId>",
    "subject": "/subscriptions/<SubscriptionID>/resourceGroups/<ResourceGroup>/providers/<ProviderNamespace>/<ResourceType>/<ResourceName>",
    "data": {
        "timestamp": "2021-03-27T18:37:42.4496956Z",
        "policyAssignmentId": "<policy-assignment-scope>/providers/microsoft.authorization/policyassignments/<policy-assignment-name>",
        "policyDefinitionId": "<policy-definition-scope>/providers/microsoft.authorization/policydefinitions/<policy-definition-name>",
        "policyDefinitionReferenceId": "",
        "complianceState": "NonCompliant",
        "subscriptionId": "<subscription-id>",
        "complianceReasonCode": ""
    },
    "eventType": "Microsoft.PolicyInsights.PolicyStateCreated",
    "eventTime": "2021-03-27T18:37:42.5241536Z",
    "dataVersion": "1",
    "metadataVersion": "1"
}]

관리 그룹 수준에서 범위가 지정된 정책 상태 변경 이벤트에 대한 스키마는 다음과 유사합니다.

[{
    "id": "5829794FCB5075FCF585476619577B5A5A30E52C84842CBD4E2AD73996714C4C",
    "topic": "/tenants/<tenantId>/providers/Microsoft.Management/managementGroups/<managementGroupId>",
    "subject": "/subscriptions/<SubscriptionID>/resourceGroups/<ResourceGroup>/providers/<ProviderNamespace>/<ResourceType>/<ResourceName>",
    "data": {
        "timestamp": "2021-03-27T18:37:42.4496956Z",
        "policyAssignmentId": "<policy-assignment-scope>/providers/microsoft.authorization/policyassignments/<policy-assignment-name>",
        "policyDefinitionId": "<policy-definition-scope>/providers/microsoft.authorization/policydefinitions/<policy-definition-name>",
        "policyDefinitionReferenceId": "",
        "complianceState": "NonCompliant",
        "subscriptionId": "<subscription-id>",
        "complianceReasonCode": ""
    },
    "eventType": "Microsoft.PolicyInsights.PolicyStateChanged",
    "eventTime": "2021-03-27T18:37:42.5241536Z",
    "dataVersion": "1",
    "metadataVersion": "1"
}]

이벤트 사용에 관한 지침

Azure Policy 이벤트를 처리하는 애플리케이션은 다음과 같은 권장 사항을 따라야 합니다.

  • 이벤트를 같은 이벤트 처리기로 라우팅하도록 여러 구독을 구성할 수 있습니다. 따라서 이벤트가 특정 원본에서 제공되었다고 가정하지 마세요. 대신 메시지 토픽을 확인하여 정책 할당, 정책 정의 및 상태 변경 이벤트의 리소스를 확인합니다.
  • eventType을 확인하고 수신하는 모든 이벤트가 예상한 형식일 것이라고 가정하지 마세요.
  • 최상위 eventTime 또는 time 속성이 아니라 data.timestamp를 사용하여 Azure Policy에서 이벤트 순서를 결정합니다.
  • 주체 필드를 사용하여 정책 상태가 변경된 리소스에 액세스합니다.

다음 단계

Event Grid에 관해 자세히 알아보고 Azure Policy 상태 변경 이벤트를 사용해 보세요.