教學課程:使用 Azure 原則管理標籤治理

標籤是將 Azure 資源組織成分類的重要部分。 當您依照標籤管理的最佳做法操作時,標籤可作為使用 Azure 原則來套用商務原則或使用成本管理來追蹤成本的基礎。 無論您使用標籤的方式或原因為何,能夠在 Azure 資源上快速新增、變更和移除這些標籤,都是十分重要的。 若要查看您的 Azure 資源是否支援標記,請參閱標記支援

Azure 原則的 Modify 效果可用來協助您管理標籤,而不論您處於哪個資源治理階段。 Modify 可在下列情況下發揮作用:

  • 您不熟悉雲端,且沒有任何標籤治理
  • 已有數以千計的資源,但沒有標籤治理
  • 已有需要變更的現有分類法

在本教學課程中,您將完成下列工作:

  • 識別您的商務需求
  • 將每項需求對應至原則定義
  • 將標籤原則分組成一個計畫

必要條件

若要完成此教學課程,您需要 Azure 訂用帳戶。 如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶

識別需求

就像任何良好的治理控制實作一樣,這些需求應來自於您的商務需求,並且在建立技術控制之前受到充分了解。 在此案例教學課程中,我們的商務需求如下:

  • 所有資源的兩個必要標記:CostCenterEnv
  • 所有容器和個別資源上都必須有 CostCenter
    • 資源繼承自其所在的容器,但可能會個別遭到覆寫
  • 所有容器和個別資源上都必須有 Env
    • 資源會依據容器命名配置來決定環境,且不會遭到覆寫
    • 容器中的所有資源都是相同環境的一部分

設定 CostCenter 標籤

就 Azure 原則所管理的 Azure 環境而言,CostCenter 標籤需求會產生如下結果:

  • 拒絕遺漏 CostCenter 標籤的資源群組
  • 在遺漏 CostCenter 標籤時,修改資源以從父資源群組新增該標籤

拒絕遺漏 CostCenter 標籤的資源群組

由於資源群組的 CostCenter 無法由資源群組的名稱決定,因此必須在建立資源群組的要求上定義標籤。 具有 Deny 效果的下列原則規則,會防止建立或更新沒有 CostCenter 標籤的資源群組:

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

注意

當此原則規則以資源群組為目標時,原則定義上的模式必須是「全部」,而不是「已編製索引」。

在遺漏 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']]"
            }]
        }
    }
}

此原則規則會使用 add 作業,而不是 addOrReplace,因為我們不想要在修復現有資源時修改現有的標籤值。 它也會使用 [resourcegroup()] 範本函式來取得父資源群組中的標籤值。

注意

當此原則規則以支援標籤的資源為目標時,原則定義上的模式必須是「已編製索引」。 這種設定也可確保此原則會略過資源群組。

設定 Env 標籤

就 Azure 原則所管理的 Azure 環境而言,Env 標籤會產生如下結果:

  • 根據資源群組的命名配置,修改資源群組的 Env 標籤
  • 將資源群組中所有資源的 Env 標籤修改為與父資源群組相同的標籤

根據名稱修改資源群組 Env 標籤

存在於 Azure 環境中的每個環境都需要 Modify 原則。 每個環境的 Modify 原則會類似於如下的原則定義:

"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"
            }]
        }
    }
}

注意

當此原則規則以資源群組為目標時,原則定義上的模式必須是「全部」,而不是「已編製索引」。

符合此原則的資源群組,僅限於將範例命名配置用於 prd- 之生產資源的群組。 若要達到更複雜的命名配置,必須使用數個比對條件,而不是此範例中的單一 like

修改資源以繼承 Env 標籤

依據商務需求,所有資源都必須具有其父資源群組所具備的 Env 標籤。 此標籤無法覆寫,因此我們將使用搭配 Modify 效果的 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 原則,Modify 原則也會使用補救工作來改變不符合規範的現有資源。 依照如何補救資源的指示識別不符合規範的 Modify 資源,並將標籤更正為您已定義的分類。

清除資源

如果您已完成使用本教學課程中的資源,請使用下列步驟來刪除前面建立的任何指派或定義:

  1. 選取 Azure 原則頁面左側 [製作] 下的 [定義] (如果您嘗試刪除指派,則選取 [指派])。

  2. 搜尋您要移除的新計畫或原則定義 (或指派)。

  3. 以滑鼠右鍵按一下資料列,或選取定義 (或指派) 結尾的省略符號,然後選取 [刪除定義] (或 [刪除指派])。

檢閱

在本教學課程中,您已了解下列下列工作:

  • 識別您的商務需求
  • 將每項需求對應至原則定義
  • 將標籤原則分組成一個方案

下一步

若要深入了解原則定義的結構,請閱讀這篇文章: