Azure Policy を使って特定の VM イメージのみデプロイを許可する

こんにちは、アーキテクトのやまぱんです。

今回は Azure Policyを使って、**特定の Publisher の Azure VM のみのデプロイを許可する** という設定をしてみたいと思います。

:::note info
+ 追記:以下の記事に改良版もの記事を書いてるので是非こちらもご確認ください。

https://qiita.com/aktsmm/items/5f0049a1c24a4dabbfb1

:::

補足コメントや質問、<font color="red">**いいね、拡散**</font>、是非お願いします🥺！
間違ってたら<font color="red">**優しく**</font>教えてください！


## Azure Policy とは
一言でいえば、"Azure内に存在するリソースを、ビジネス上のルールに準拠するよう一括管理できるサービス" です。特定の操作を禁止/許可するといったような使い方ができます。
Azure Portal では 検索窓で "Policy" から確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/4df7c062-ce05-7684-aedd-80e78b7d1939.png)

Azure Policy の定義は json 形式で定義されています。


## やりたいこと
特手の VM のみのデプロイを許可したい。
今回は例として、イメージのデプロイを拒否し、例外として MS SQL の入った Windows Server のイメージのみを許可するようにしてみます。
Azure Portal で見るとこれです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/9c1d1f83-fca9-88f3-079f-3837e7b959d7.png)


## 手順
### 発行元ID の確認
まず、以下のように **"使用状況情報とサポート"** から 発行元ID を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/46117630-b8d9-e9af-dd51-8ac485d36776.png)

今回の例だと、**[microsoftsqlserver]** です。

## ポリシーのデプロイ
+ ポリシーを作成する
ポリシー → 作成 → 定義 →  "+ ポリシー定義" より、新規でポリシーを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/6ec35bf3-9f55-d40f-8fb7-1f206168beff.png)

今回は以下のように設定する


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/283626f1-7dd5-d94e-b4ee-d39b372bad66.png)
ポリシールールの詳細は後述。

### ポリシールールの詳細

```json:Azure Policy で イメージの発行元を制限
{
  "mode": "All",
  "policyRule": {
    "if": {
      "allOf": [
        {
          "field": "type",
          "in": [
            "Microsoft.Compute/virtualMachines",
            "Microsoft.Compute/VirtualMachineScaleSets"
          ]
        },
        {
          "not": {
            "field": "Microsoft.Compute/imagePublisher",
            "in": "[parameters('listOfAllowedimagePublishers')]"
          }
        }
      ]
    },
    "then": {
      "effect": "deny"
    }
  },
  "parameters": {
    "listOfAllowedimagePublishers": {
      "type": "Array",
      "metadata": {
        "displayName": "Allowed image publishers",
        "description": null
      }
    }
  }
}

```
以下簡単な解説。
> ポリシーの構造:
> + mode: "All"
> このポリシーは、リソースグループやサブスクリプションに関係なくすべてのリソースに適用されます。
> 
> policyRule:
> 
> + if:
> すべての条件が満たされている場合にポリシーが適用される条件部分です。
> 
> -- "field": "type": リソースの種類が仮想マシンか仮想マシンスケールセットであること。
>  -- "not": {"field": "Microsoft.Compute/imagePublisher", "in": "[parameters('listOfAllowedimagePublishers')]"}: イメージの発行元が許可されたリストに含まれていないこと。
> + then:
条件が満たされた場合に実行されるアクションを定義します。
> 
>  -- "effect": "deny": リソースの作成や更新を拒否します。
> + parameters:
> 
>  -- listOfAllowedimagePublishers:
許可されたイメージの発行元のリストをパラメータとして定義しています。


## ポリシーの割り当て
+ ポリシーの割り当て
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/e50ae271-fd2a-9e0a-8f83-3bb423f11f26.png)

+ スコープ を設定する
今回は以下の用に特定のリソースグループを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/e246e9de-dea8-cf1b-207a-f333b3518ac4.png)

+ パラメータを設定する(許可する発行元を定義する)
メモしていた発行元の **”microsoftsqlserver”** をここで利用する。
配列の形式で記載する必要があるので、**["microsoftsqlserver"]** で記入する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/cda780d1-9729-bf73-7989-d76ae2df80cf.png)

その他の　"修復"、"非準拠メッセージ" はデフォルトのまま進める。

以下でデプロイ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/7d5fcf3e-7b53-b009-1322-8a7272d2a1b0.png)

## 挙動確認
### 許可していないイメージ
想定通り、ポリシーが効いてデプロイができなくなっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/567bc54c-d090-d80a-d395-6f0c9fef81f4.png)

### 許可したイメージ
こちらはポリシーのメッセージが出ていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/f3a496e8-665f-7377-e55d-1e892817d2ef.png)


## 参考

+ Azure Policy とは

https://learn.microsoft.com/ja-jp/azure/governance/policy/overview




以上です🙌