6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Azure】Bicepを用いてAzure policyを適用させる。

Posted at

1. はじめに

1-1 ご挨拶

初めまして、井村と申します。
AzureのBicepを用いてAzure policyを適用させてみました。
Azure Policy の一般的なユースケースには、リソースの整合性、規制コンプライアンス、セキュリティ、コスト、管理のガバナンスになります。

1-2 対象読者

  • Azureに興味がある
  • Bicepに興味がある

1-3 適用させるポリシーについて

Azure policyはAzureで事前に用意されている組み込みポリシー(built-in policy)と自前で作成できるカスタムポリシー(custom policy)があります。今回は組み込みポリシーを利用し、以下を制限するポリシーを適用させます。

  • Azureリソースのデプロイ先を東日本リージョン、西日本リージョンのみに限定する。
  • Azure VMのSKU(VMのサイズです)を指定したSKUのみ(B1s、B1ms)利用できるよう制限する。

2. 構築

2-1 main.bicep構成

利用するBicepテンプレートは以下になります。
Githubにあげてます。

main.bicep
bicep
     1  targetScope = 'subscription'
     2
     3  @description('Parameter and variable for Allowed locations')
     4  param policyAssignmentNameAl string = 'Allowed locations - Japan'
     5  param policyDefinitionIDAl string = '/providers/Microsoft.Authorization/policyDefinitions/e56962a6-4747-49cd-b67b-bf8b01975c4c'
     6  param valueAL array = [ 'japaneast', 'japanwest' ]
     7
     8  @description('Parameter and variable for Allowed virtual machine size SKUs')
     9  param policyAssignmentNameVM string = 'Allowed virtual machine size SKUs - b1s,b1ms'  
    10  param policyDefinitionIDVM string = '/providers/Microsoft.Authorization/policyDefinitions/cccc23c7-8427-4f53-ad12-b6a63eb452b3'
    11  param valueVM array = [ 'Standard_b1ms', 'Standard_b1s' ]
    12
    13  param policyValues object = {
    14    AL: {
    15      name: policyAssignmentNameAl
    16      policyDefinitionId: policyDefinitionIDAl
    17      parameters: {
    18        listOfAllowedLocations: {
    19          value: valueAL
    20        }
    21      }
    22    }
    23    AVM: {
    24      name: policyAssignmentNameVM
    25      policyDefinitionId: policyDefinitionIDVM
    26      parameters: {
    27        listOfAllowedSKUs: {
    28          value: valueVM
    30      }
    31    }
    32  }
    33
    34  resource assignment 'Microsoft.Authorization/policyAssignments@2022-06-01' = [for policy in items(policyValues): {   
    35    name: policy.value.name
    36    properties: {
    37      policyDefinitionId: policy.value.policyDefinitionID
    38      parameters: policy.value.parameters
    39    }
    40  }]
    41

補足は以下の通りです。

  • 4行目から6行目の「param」でロケーションを制限するパラメーターを定義します。
  • 9行目から11行目の「param」でAzure VMのSKUを制限するパラメーターを定義します。
  • 13行目から32行目の「param」で上記のパラメーターを辞書オブジェクトの要素に格納します。
  • 34行目の「resource」でAzure policyを適用させます。

2-2 パラメーターの確認方法

ここからは私が作成したmain.bicepの流れを紹介します。
まずは公式ドキュメントから組み込みポリシーを確認します。そこから自分が適用させたいポリシーを確認します。以下画像はロケーションを制限する組み込みポリシーになります。赤枠をクリックします。

Document.png

クリック後、Azure上のAzure policyに飛んできます。下記画像の上部の赤枠が組み込みポリシーを利用するための"Definition ID"を取得できます。この値がmain.bicep内の5行目になります。
下部の赤枠が変数で利用するパラメーター名になります。この値がmain.bicep内の18行目になります。

Allowed-locations.png
source.png

3. 検証

3-1 リソースの構築

ロケーションを変更し下記コマンドを実行すると構築完了です。

cmd (Azure CLI)
$ ls
main.bicep

$ az login

$ az deployment sub create --template-file main.bicep --location <Your location>

下記画像が構築前です。デフォルトのポリシー(イニシアティブ)のみあります。スコープは消していますが、サブスクリプションをスコープです。

before.png

下記画像が構築後です。ポリシーが2つ出来ています。

after.png

3-2 ロケーションの検証

それでは検証を実施します。ストレージアカウントを作成します。
以下画像でロケーションをUSに設定し、レビューします。

CreateStorageAccount.png

以下画面となりました。エラー詳細を確認するとAzure Policyによって制御されていることがわかります。

stAzurePolicy.png

以下画面では東日本リージョンを選択しエラーは発生しませんでした。このあと、ストレージアカウントが作成されることも確認済みです。

jaAzurePolicy.png

ロケーションの制限確認は以上です。

3-3 SKUの検証

それでは検証を実施します。Azure VMを作成します。
以下画像はSKUの設定になります。B1s、B1ms以外は「Blocked by Policy」にカテゴライズされています。
仮にDS1_v2を選択しても「Select」ボタンが非活性であり選択出来ない状態がわかります。

BlockSKU.png

SKUの制限確認は以上です。

4. 終わりに

本記事を最後まで読んで頂きましてありがとうございます。
参考記事で各定義はjsonファイルに記述されmain.bicep飛ばす方法がとても綺麗なコードだなと思います。
是非取り入れたい技術ですね。

5. 参考記事

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?