AzureでBicepという用語を聞いたことがあるでしょうか?
BicepはARMテンプレート(リソースをJson形式で記述しているファイル)が生成される前のファイルです。
テンプレートのエクスポートはBicep → コンパイル → ARMの処理がAzureでは行われています。以前までpreviewでしたが正式にリリースされました。
BicepはARMテンプレートやTerraformよりコードの可視性、依存関係が圧倒的に分かりやすいです。自分はインフラのアーキ検討で自動生成させたり、DevOpsのパイプライン処理で重宝しています。
①インストール手順
まずAzure CLI のバージョン 2.20.0 以降が必要になります。
インストール手順は下記参照です。
https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli-windows?tabs=azure-cli
Azure CLIのバージョンを確認します。
az --version
Bicepをインストールします。
az bicep install
Bicepのバージョンを確認します。
az bicep version
②文法
例としてストレージアカウントを生成するbicepファイルです。
詳細なパラメーターは以下参照してください。
https://docs.microsoft.com/en-us/azure/templates/microsoft.storage/storageaccounts?pivots=deployment-language-bicep
//----------パラメーター設定 開始--------------
//param storageSccountType変数の説明するアノテーションになります
@description('Storage Account type')
//param storageSccountType変数に入れられる値を制限します。
@allowed([
'Premium_LRS'
'Premium_ZRS'
'Standard_GRS'
'Standard_GZRS'
'Standard_LRS'
'Standard_RAGRS'
'Standard_RAGZRS'
'Standard_ZRS'
])
//パラメーターを変数として定義してます。
//param 変数名 オブジェクト型
param storageAccountType string = 'Standard_LRS'
//resurceGroup().locationはコマンド実行時に指定するリソースグループと同じリージョンを取得する関数になります。
@description('Location for the storage account.')
param location string = resourceGroup().location
//uniqueStringはハッシュ文字列を生成します。
@description('The name of the Storage Account')
param storageAccountName string = 'store${uniqueString(resourceGroup().id)}'
//----------パラメーター設定 終了--------------
//ストレージアカウントのリソース生成を指定します。
//resource リソース生成後の変数名 'Microsoftが提供しているサービス名'
resource stg 'Microsoft.Storage/storageAccounts@2021-06-01' = {
name: storageAccountName
location: location
sku: {
name: storageAccountType
}
kind: 'StorageV2'
properties: {}
}
上記ファイルをVisual Stadio Codeでbicepファイルを生成します。
拡張機能でBicepを検索してインストールします。
使用されていない変数が存在する、指定パラメーターに誤りがあると警告してくれます。
PowerShellを起動して、main.bicepを保存したフォルダに移動します。そしてbicepファイルからデプロイするコマンドを実行します。
cd "C:\Users\*****\OneDrive\ドキュメント\qiita材料\main.bicepがあるフォルダ"
リソースグループは生成したい場所を指定します。
az deployment group create --resource-group test_group --template-file main.bicep
VScode上で右クリックして、メニューから「Deploy Bicep File」からでもデプロイが可能です。
③便利コマンド・その他機能
・デプロイ前のチェック
他の機能としてTrraformのplanのようにデプロイ前にチェックすることが出来ます。
az deployment group what-if --resource-group (デプロイするリソースグループ) --template-file (bicepファイル)
上記画像では4つのリソースが新たに作成され、既存の2つのリソースは無視することを示しています。
・デプロイ中や詳細のチェック
リソースグループの設定にあるデプロイからBicepファイルのデプロイ状況が分かります。
・ARMテンプレートからのデコンパイル
ARMテンプレートからBicepファイルに変換が出来ます。
テンプレートのエクスポートでJsonファイルをダウンロードします。
template.json
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"storageAccounts_storeii74qbr62sx4u_name": {
"defaultValue": "storeii74qbr62sx4u",
"type": "String"
}
},
"variables": {},
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2021-09-01",
"name": "[parameters('storageAccounts_storeii74qbr62sx4u_name')]",
"location": "japanwest",
"sku": {
"name": "Standard_LRS",
"tier": "Standard"
},
"kind": "StorageV2",
"properties": {
"minimumTlsVersion": "TLS1_0",
"allowBlobPublicAccess": true,
"networkAcls": {
"bypass": "AzureServices",
"virtualNetworkRules": [],
"ipRules": [],
"defaultAction": "Allow"
},
"supportsHttpsTrafficOnly": true,
"encryption": {
"services": {
"file": {
"keyType": "Account",
"enabled": true
},
"blob": {
"keyType": "Account",
"enabled": true
}
},
"keySource": "Microsoft.Storage"
},
"accessTier": "Hot"
}
},
{
"type": "Microsoft.Storage/storageAccounts/blobServices",
"apiVersion": "2021-09-01",
"name": "[concat(parameters('storageAccounts_storeii74qbr62sx4u_name'), '/default')]",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_storeii74qbr62sx4u_name'))]"
],
"sku": {
"name": "Standard_LRS",
"tier": "Standard"
},
"properties": {
"cors": {
"corsRules": []
},
"deleteRetentionPolicy": {
"allowPermanentDelete": false,
"enabled": false
}
}
},
{
"type": "Microsoft.Storage/storageAccounts/fileServices",
"apiVersion": "2021-09-01",
"name": "[concat(parameters('storageAccounts_storeii74qbr62sx4u_name'), '/default')]",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_storeii74qbr62sx4u_name'))]"
],
"sku": {
"name": "Standard_LRS",
"tier": "Standard"
},
"properties": {
"protocolSettings": {
"smb": {}
},
"cors": {
"corsRules": []
},
"shareDeleteRetentionPolicy": {
"enabled": true,
"days": 7
}
}
},
{
"type": "Microsoft.Storage/storageAccounts/queueServices",
"apiVersion": "2021-09-01",
"name": "[concat(parameters('storageAccounts_storeii74qbr62sx4u_name'), '/default')]",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_storeii74qbr62sx4u_name'))]"
],
"properties": {
"cors": {
"corsRules": []
}
}
},
{
"type": "Microsoft.Storage/storageAccounts/tableServices",
"apiVersion": "2021-09-01",
"name": "[concat(parameters('storageAccounts_storeii74qbr62sx4u_name'), '/default')]",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_storeii74qbr62sx4u_name'))]"
],
"properties": {
"cors": {
"corsRules": []
}
}
}
]
}
下記コマンドを実行すると、今参照しているディレクトリにbicepファイルが生成されます。
読み取り専用パラメータも含まれているので、またBicepでデプロイする際は注意です。
az bicep decompile --file (ARMテンプレートのJsonファイル)
template.bicep
param storageAccounts_storeii74qbr62sx4u_name string = 'storeii74qbr62sx4u'
resource storageAccounts_storeii74qbr62sx4u_name_resource 'Microsoft.Storage/storageAccounts@2021-09-01' = {
name: storageAccounts_storeii74qbr62sx4u_name
location: 'japanwest'
sku: {
name: 'Standard_LRS'
tier: 'Standard'
}
kind: 'StorageV2'
properties: {
minimumTlsVersion: 'TLS1_0'
allowBlobPublicAccess: true
networkAcls: {
bypass: 'AzureServices'
virtualNetworkRules: []
ipRules: []
defaultAction: 'Allow'
}
supportsHttpsTrafficOnly: true
encryption: {
services: {
file: {
keyType: 'Account'
enabled: true
}
blob: {
keyType: 'Account'
enabled: true
}
}
keySource: 'Microsoft.Storage'
}
accessTier: 'Hot'
}
}
resource storageAccounts_storeii74qbr62sx4u_name_default 'Microsoft.Storage/storageAccounts/blobServices@2021-09-01' = {
parent: storageAccounts_storeii74qbr62sx4u_name_resource
name: 'default'
sku: {
name: 'Standard_LRS'
tier: 'Standard'
}
properties: {
cors: {
corsRules: []
}
deleteRetentionPolicy: {
allowPermanentDelete: false
enabled: false
}
}
}
resource Microsoft_Storage_storageAccounts_fileServices_storageAccounts_storeii74qbr62sx4u_name_default 'Microsoft.Storage/storageAccounts/fileServices@2021-09-01' = {
parent: storageAccounts_storeii74qbr62sx4u_name_resource
name: 'default'
sku: {
name: 'Standard_LRS'
tier: 'Standard'
}
properties: {
protocolSettings: {
smb: {
}
}
cors: {
corsRules: []
}
shareDeleteRetentionPolicy: {
enabled: true
days: 7
}
}
}
resource Microsoft_Storage_storageAccounts_queueServices_storageAccounts_storeii74qbr62sx4u_name_default 'Microsoft.Storage/storageAccounts/queueServices@2021-09-01' = {
parent: storageAccounts_storeii74qbr62sx4u_name_resource
name: 'default'
properties: {
cors: {
corsRules: []
}
}
}
resource Microsoft_Storage_storageAccounts_tableServices_storageAccounts_storeii74qbr62sx4u_name_default 'Microsoft.Storage/storageAccounts/tableServices@2021-09-01' = {
parent: storageAccounts_storeii74qbr62sx4u_name_resource
name: 'default'
properties: {
cors: {
corsRules: []
}
}
}
今回はストレージアカウントを例にしていますが、
parent: storageAccounts_storeii74qbr62sx4u_name_resource
とあります。
これはストレージアカウントとBlobコンテナー等の作成が親子関係にあることを明示しています。
他の例としてVNET、Subnetも親子関係となります。
bicepではこのparentを明示することで依存関係を解決してデプロイを行います。
また生成されたリソースのデプロイ名.idを他リソースに指定することでも自動的に依存関係を解消出来ます。
・既存リソースの指定
既にデプロイされているリソースを指定したい場合、existing
を使用します。
以下はデプロイされているSynapseのサービスプリンシパルをKeyVaultのアクセスポリシーに指定している例になります。
・モジュール化
メインファイルを作成して、それぞれのモジュールからリソースをデプロイすることも出来ます。
main.bicep
// module デプロイ後の変数名 '参照するbicepファイルパス'
module storage_d 'storage.bicep' = {
// name: はデプロイ名
// paramsは参照先のモジュール内の変数に渡したい値を指定します。
name: 'myStorageDeployment'
params: {
storageAccountName: 'stcontoso'
storageAccountType: 'Standard_LRS'
}
}
//storage_d.output.stgIdで下記storage.bicepファイルのoutputで指定した変数が使用出来ます。
storage.bicep
//main.bicepから受け取るパラメーターの変数
param storageAccountType string
param storageAccountName string
param location string = resourceGroup().location
resource stg 'Microsoft.Storage/storageAccounts@2021-06-01' = {
name: storageAccountName
location: location
sku: {
name: storageAccountType
}
kind: 'StorageV2'
properties: {}
}
//デプロイ後のリソースIdをstgIdにセットすることでmain.bicepから参照できます。
output stgId string = stg.id
・パラメータシートの使用
--parametersを追記して以下の形式のjsonファイルを作成して使用します。
az deployment group what-if --resource-group (デプロイするリソースグループ) --template-file (bicepファイル) --parameters (json形式のファイル)
parameter.json
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"bicepパラメーター変数名": {
"value": "変数値"
},
"location": {
"value": "japanwest"
}
}
}
main.bicep
param location string
bicep内のparam location string = 'japaneast'にして、パラメーターシートで'japanwest'でデプロイしてオーバーライドするような使用方法も可能です。
・代替コマンド
azコマンドで実行すると文字コードエラーが発生する場合があります(azはPython言語で構成されている)。その際には以下のコマンドレットで実行できることがあります(以下はPowerShell言語で構成)。
実行前確認コマンド
New-AzResourceGroupDeployment -WhatIf -ResourceGroupName リソースグループ名 -TemplateFile bicepファイルパス -TemplateParameterFile パラメーターjsonファイル
デプロイコマンド
New-AzResourceGroupDeployment -ResourceGroupName リソースグループ名 -TemplateFile bicepファイルパス -TemplateParameterFile パラメーターjsonファイル
④リファレンス
MicrosoftのBicepドキュメントです。
ARMで使用されている関数も利用できます。
https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/bicep/
クイックスタートを公開されているgithubになります。Bicep記述が非常に参考になります。
https://github.com/Azure/azure-quickstart-templates/tree/master/quickstarts
これで以上となります。
見て頂きありがとうございました。