Azure Policy を使って Azure リソースの特定タグを必須にする

2022.08.30

いわさです。

多くのパブリッククラウドではリソースに独自のタグを付与してリソースの管理に役立てることが出来ます。
ただしタグは任意で設定出来るパラメータなのでリソースを作成する人によってバラバラになりがちです。

これに対して Azure では Azure Policy を使ってタグ設定に関する統制を行うことが出来ます。

本日はよく使いそうなタグの必須チェックと、非準拠リソースへの強制適用をやってみます。

特定タグ必須化

前述のとおりタグの必須化に Azure Policy を使います。
まずは「ポリシー」の割り当てメニューから「ポリシーの割り当て」を選択し、ここから特定のタグが設定されていない場合に

スコープと除外

ポリシー定義ではまずスコープと除外を設定します。
ここでどのサブスクリプションやリソースグループ配下に作成されるリソースを対象とするのかが決まります。

スコープは特定のサブスクリプションと、任意でリソースグループを選択します。
リソースグループまで指定することも出来ますし、サブスクリプション全体を対象にすることも出来ます。

除外設定ではスコープ設定の範囲内で、除外となるものを追加することが出来ます。
スコープがリソースグループまで指定されている場合はリソースを指定し、スコープがサブスクリプションまで指定されている場合はリソースグループから指定出来ます。

ポリシー定義

続いて、設定したスコープ内のリソースに対してどういうポリシーを適用するかを設定します。
ポリシーは事前に用意された組み込みのものとカスタムポリシーから選択することが出来ます。

ポリシーではタグに関わらず様々な制御を行うことが可能ですが、シンプルに特定タグの必須程度であれば組み込みポリシーが用意されています。
程度というか、組み込みポリシーかなり充実しているのでまずは組み込みポリシーが利用出来るか確認してみると良いと思います。

ポリシー定義にはパラメータを定義することも可能で、例えば組み込みのタグ必須ポリシーの場合だと任意の「タグ名」を割り当て時に指定することが出来ます。
ここではhogeというタグ名を必須にします。タグ値は特に制限しません。

ポリシーを割り当てることが出来ました。すぐに有効になっています。

ちなみにポリシーは以下のような形式で定義されます。

{
  "properties": {
    "displayName": "リソースでタグを必須にする",
    "policyType": "BuiltIn",
    "mode": "Indexed",
    "description": "タグの存在を強制的に適用します。リソース グループには適用されません。",
    "metadata": {
      "version": "1.0.1",
      "category": "Tags"
    },
    "parameters": {
      "tagName": {
        "type": "String",
        "metadata": {
          "displayName": "タグ名",
          "description": "タグの名前 (例: environment)"
        }
      }
    },
    "policyRule": {
      "if": {
        "field": "[concat('tags[', parameters('tagName'), ']')]",
        "exists": "false"
      },
      "then": {
        "effect": "deny"
      }
    }
  },
  "id": "/providers/Microsoft.Authorization/policyDefinitions/871b6d14-10aa-478d-b590-94f262ecfa99",
  "type": "Microsoft.Authorization/policyDefinitions",
  "name": "871b6d14-10aa-478d-b590-94f262ecfa99"
}

動作確認

もうポリシー適用は終わったのであとはリソースを作成して動作確認するだけです。
対象スコープ内(今回だと特定のリソースグループ)にリソースを作成してみましょう。
ここでは適当な App Service を作成してみました。

挙動としては、デプロイ時の確認および作成タブで作成操作を行ったタイミングでエラーとなる形ですね。
ちょっとエラーメッセージが見づらいですが、先程のポリシー割り当てで設定したエラーメッセージが表示されていることを確認出来ます。

強制モードの無効化

ポリシーには適用の有効・無効を設定する「強制モード」があります。以下の設定です。

こちらを無効化した場合はリソースが問題なく作成出来ました。

ちなみに、強制モードが無効になっている場合、リソース作成の拒否はされませんが、以下のようにコンプライアンス評価はされます。

ポリシーをコンプライアンスチェックに留めるのか、リソース作成の拒否まで行うのか、運用ルール上の強さに応じて使い分ける形になりそうです。

タグが設定されていない既存リソースにタグを強制適用する

さて、先程のタグ必須ポリシーはリソース作成時や更新時にチェックされるもので、既存リソースに対して必須になるものではありません。(コンプライアンス準拠状況のチェック対象にはなるが強制適用されるわけではない)
既存リソースに対して定めた必須ポリシーに従ってタグを適用した場合があります。
この場合は「修復」という機能を使うことが出来ます。

どのタスク定義でも出来るわけではなく上記ドキュメントのとおりポリシーの条件はありますが、対象ポリシーであれば修復タスクを作成し・実行することで自動適用させることが出来ます。
ちなみに、先程使った組み込みタスク定義のものは修復タスクに使えないものです。

次の組み込みタスクは修復タスクを作成することが出来ます。こちらを使ってポリシー設定をしてみましょう。

修復タスクはすぐ作成することも、後ほど任意のタイミングで作成することも出来ます。
Azure ポータル上から設定した場合はリソース操作のためのアクセス許可が割り当てられますが、ポータル以外から操作した場合は手動でロールの割り当てが必要になります。

修復タスクの結果を見てみると、先程強制モードが無効化されている間に作成されたリソースが修復対象となっています。

リソースを確認してみるとタグが付与されていました。

さいごに

本日は Azure Policy を使って Azure リソースの特定タグを必須にし、修復までやってみました。

まず、Azure Policy とても直感的ですぐに設定することが出来ます。すごい。
こういったルールベースのサービスって前提となるルール構文や構成ファイルなどの理解の段階で挫折しそうに私はいつもなるのですが、組み込みポリシーが充実しているのでそこから初めつつ構成ファイルを紐解いてカスタムポリシーへの展開も出来そうです。