チュートリアル:Azure Policy を使用してタグ ガバナンスを管理する

タグは、Azure リソースを分類してまとめるうえで重要な要素です。 タグ管理のベスト プラクティスに従う際に、タグは Azure Policy を使用してビジネス ポリシーを適用したり、Cost Management を使用してコストを追跡したりするための基礎にすることができます。 タグを使用する方法や理由にかかわらず、Azure リソースのタグをすばやく追加、変更、および削除できることが重要です。 Azure リソースでタグ付けがサポートされているかどうかを確認するには、タグのサポートに関するページを参照してください。

Azure Policy の Modify 効果は、現在のリソース ガバナンスの段階に関係なく、タグのガバナンスを支援するように設計されています。 Modify は、次の場合に役立ちます。

  • クラウドを初めて使用し、タグ ガバナンスがない
  • タグ ガバナンスのない数千のリソースが既にある
  • 変更が必要な分類が既にある

このチュートリアルでは、次のタスクを実行します。

  • ビジネス要件を特定する
  • 各要件をポリシー定義にマップする
  • タグ ポリシーをイニシアチブにグループ化する

前提条件

このチュートリアルを完了するには、Azure サブスクリプションが必要です。 お持ちでない場合は、開始する前に無料アカウントを作成してください。

要件を特定する

ガバナンス管理の適切な実装と同様に、要件はビジネス ニーズに基づくものであり、技術的制御を作成する前に十分に理解しておく必要があります。 このシナリオのチュートリアルでは、次のようなビジネス要件があります。

  • すべてのリソースで必須の 2 つのタグ:CostCenterEnv
  • CostCenter は、すべてのコンテナーと個々のリソースに存在している必要があります
    • リソースは、それらが存在するコンテナーから継承されますが、個別に上書きされる可能性があります
  • Env は、すべてのコンテナーと個々のリソースに存在している必要があります
    • リソースでは、コンテナーの名前付けスキームによって環境が決定され、上書きされない可能性があります
    • コンテナー内のすべてのリソースは同じ環境に含まれています

CostCenter タグを構成する

Azure Policy によって管理される 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"
}

注意

このポリシー規則はリソース グループを対象とするため、ポリシー定義の モード は、'Indexed' ではなく 'All' にする必要があります。

欠落している場合は CostCenter タグを継承するようにリソースを変更する

2 つ目の 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 ではなく、add 操作を使用します。これは、既存のリソースを修復するときにタグ値が存在する場合は、それを変更しないためです。 また、[resourcegroup()] テンプレート関数を使用して、親リソース グループからタグ値を取得します。

注意

このポリシー規則は、タグをサポートするリソースを対象とするため、ポリシー定義の モード は 'Indexed' である必要があります。 また、この構成では、必ず、このポリシーでリソース グループをスキップするようにします。

Env タグを構成する

Azure Policy によって管理される 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"
            }]
        }
    }
}

注意

このポリシー規則はリソース グループを対象とするため、ポリシー定義の モード は、'Indexed' ではなく 'All' にする必要があります。

このポリシーは、prd- の実稼働リソースに使われるサンプルの名前付けスキームを使用するリソース グループのみと一致します。 この例では 1 つの like ではなく、複数の match 条件を使用して、より複雑な名前付けスキームを実現できます。

Env タグを継承するようにリソースを変更する

ビジネス要件では、すべてのリソースに対して、親リソース グループにある Env タグを含めることが求められます。 このタグは上書きできないため、addOrReplace 操作を、Modify 効果と共に使用します。 サンプルの 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']]"
            }]
        }
    }
}

注意

このポリシー規則は、タグをサポートするリソースを対象とするため、ポリシー定義の モード は 'Indexed' である必要があります。 また、この構成では、必ず、このポリシーでリソース グループをスキップするようにします。

このポリシー規則では、Env タグの親リソース グループ値がないか、Env タグが欠落しているリソースを検索します。 一致するリソースでは Env タグが親リソース グループの値に設定されます。これは、タグがリソースに既に存在していても値が異なる場合でも同様です。

イニシアチブを割り当てて、リソースを修復する

上記のタグ ポリシーが作成されたら、それらをタグ ガバナンスの 1 つのイニシアチブに結合し、管理グループまたはサブスクリプションに割り当てます。 その後、イニシアチブとそれに含まれるポリシーによって、既存のリソースのコンプライアンスが評価され、ポリシー規則の if プロパティに一致する新規または更新されたリソースの要求が変更されます。 しかし、ポリシーでは、定義済みのタグの変更によって、既存の準拠していないリソースが自動的に更新されることはありません。

deployIfNotExists ポリシーと同様に、Modify ポリシーでは修復タスクを使用して、既存の準拠していないリソースを変更します。 リソースを修復する方法の手順に従って、準拠していない Modify リソースを識別し、定義した分類に対するタグを修正します。

リソースをクリーンアップする

このチュートリアルのリソースに対する作業が完了した場合は、次の手順を使用して、ここで作成した割り当てまたは定義をすべて削除してください。

  1. Azure Policy ページの左側にある [作成] の下の [定義] (または割り当てを削除する場合は [割り当て] ) を選択します。

  2. 削除する新しいイニシアティブまたはポリシー定義 (または割り当て) を見つけます。

  3. 行を右クリックするか、定義 (または割り当て) の末尾にある省略記号を選択し、 [定義の削除] (または [割り当ての削除] ) を選択します。

確認

このチュートリアルでは、以下のタスクについて学習しました。

  • ビジネス要件を特定する
  • 各要件をポリシー定義にマップする
  • タグ ポリシーをイニシアチブにグループ化する

次のステップ

ポリシー定義の構造の詳細については、次の記事を参照してください。