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
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の流れを紹介します。
まずは公式ドキュメントから組み込みポリシーを確認します。そこから自分が適用させたいポリシーを確認します。以下画像はロケーションを制限する組み込みポリシーになります。赤枠をクリックします。
![]() |
---|
クリック後、Azure上のAzure policyに飛んできます。下記画像の上部の赤枠が組み込みポリシーを利用するための"Definition ID"を取得できます。この値がmain.bicep内の5行目になります。
下部の赤枠が変数で利用するパラメーター名になります。この値がmain.bicep内の18行目になります。
![]() |
---|
![]() |
---|
3. 検証
3-1 リソースの構築
ロケーションを変更し下記コマンドを実行すると構築完了です。
$ ls
main.bicep
$ az login
$ az deployment sub create --template-file main.bicep --location <Your location>
下記画像が構築前です。デフォルトのポリシー(イニシアティブ)のみあります。スコープは消していますが、サブスクリプションをスコープです。
![]() |
---|
下記画像が構築後です。ポリシーが2つ出来ています。
![]() |
---|
3-2 ロケーションの検証
それでは検証を実施します。ストレージアカウントを作成します。
以下画像でロケーションをUSに設定し、レビューします。
![]() |
---|
以下画面となりました。エラー詳細を確認するとAzure Policyによって制御されていることがわかります。
![]() |
---|
以下画面では東日本リージョンを選択しエラーは発生しませんでした。このあと、ストレージアカウントが作成されることも確認済みです。
![]() |
---|
ロケーションの制限確認は以上です。
3-3 SKUの検証
それでは検証を実施します。Azure VMを作成します。
以下画像はSKUの設定になります。B1s、B1ms以外は「Blocked by Policy」にカテゴライズされています。
仮にDS1_v2を選択しても「Select」ボタンが非活性であり選択出来ない状態がわかります。
![]() |
---|
SKUの制限確認は以上です。
4. 終わりに
本記事を最後まで読んで頂きましてありがとうございます。
参考記事で各定義はjsonファイルに記述されmain.bicep飛ばす方法がとても綺麗なコードだなと思います。
是非取り入れたい技術ですね。