【Azure】Azure Bicepを試してみた


1.はじめに

平素より大変お世話になっております。
そろそろ暑くなると思いきや、いきなりじめじめしてきて嫌な感じですね。

私はARMテンプレートを利用してリソースをデプロイしていたのですが、これがすごく大変で。
ApplicationGatewayのテンプレートなんて、4000行オーバーの大作になってしまいました。
一回ポータルで形だけ作ったものをARMでエクスポートして、それを修正して作成したのですが、それでもかなり時間がかかりました。
しかもデプロイエラーは出るし。。。。

今回はそんな苦労にさよならができるかもしれない!?
Azure Bicepについてです。

2.一言でいうと

  • AzureでIaCといえばARMテンプレート!でも書くの大変!!
  • 新しく発表されたBicepを使うとすごく簡単にIaCできる!

3.Azure Bicepとは

Azure Bicepは、宣言型構文を使用してAzureリソースをデプロイするドメイン固有言語(DSL)です。
今まではAzureでIaCというと、Azure Resource Managerテンプレート(ARMテンプレート)を用いるのが一般的でした。
しかしながら…このARMテンプレートというのは、すごく冗長になってしまいます。
ARMテンプレートは、JSONで記述しているのでとにかく長くなりやすく、扱いにくいのです。

Bicepはその冗長になってしまうARMテンプレートを抽象化したものであり、Bicep⇔ARMテンプレートというようにそれぞれ変換することができます。

4.Azure Bicepをインストールする(Windowsの場合)

さて、では早速インストールしてみましょう!
BicepはAzureCLIを利用します。
CLIをインストールした環境のコマンドプロンプトで以下のコマンドをいれましょう。

az bicep install

はい、これで終わりです。
バージョンが古いとインストールできないので、失敗した場合はCLIのバージョンアップを行ってください。

また、VSCにbicep用の拡張機能がありますので、それを利用すると簡単にプログラムが書けます。
拡張機能は[Bicep]という名前です。

5.Azure Bicepでデプロイしてみる

では早速bicepを書いてみます…

例えばvnetを作ってみましょう。
拡張機能をインストールしたVSCでvnetと入れると、予測で「res-vnet」というのが出てきます。
これを選択すると…

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2019-11-01' = {
  name: 'name'
  location: resourceGroup().location
  properties: {
    addressSpace: {
      addressPrefixes: [
        '10.0.0.0/16'
      ]
    }
    subnets: [
      {
        name: 'Subnet-1'
        properties: {
          addressPrefix: '10.0.0.0/24'
        }
      }
      {
        name: 'Subnet-2'
        properties: {
          addressPrefix: '10.0.1.0/24'
        }
      }
    ]
  }
}

なんと、一瞬でvnetのテンプレートができてしまいました…!
”name”だけ、ここではsanple-vnetに変更しました。

はい、では早速デプロイしてみます。
az loginして…リソースグループ”motomiya”を指定して、先ほど作成したvnetのbicepコードを保存した"test.bicep"をazコマンドでデプロイします。

>az deployment group create --resource-group motomiya --template-file test.bicep
{
  "id": "/subscriptions/              /resourceGroups/motomiya/providers/Microsoft.Resources/deployments/test",
  "location": null,
  "name": "test",
  "properties": {
    "correlationId": "                     ",
    "debugSetting": null,
    "dependencies": [],
    "duration": "PT3.5085233S",
    "error": null,
    "mode": "Incremental",
    "onErrorDeployment": null,
    "outputResources": [
      {
        "id": "/                    /resourceGroups/motomiya/providers/Microsoft.Network/virtualNetworks/sample-vnet",
        "resourceGroup": "motomiya"
      }
    ],
    "outputs": null,
    "parameters": null,
    "parametersLink": null,
    "providers": [
      {
        "id": null,
        "namespace": "Microsoft.Network",
        "registrationPolicy": null,
        "registrationState": null,
        "resourceTypes": [
          {
            "aliases": null,
            "apiProfiles": null,
            "apiVersions": null,
            "capabilities": null,
            "defaultApiVersion": null,
            "locationMappings": null,
            "locations": [
              "japaneast"
            ],
            "properties": null,
            "resourceType": "virtualNetworks",
            "zoneMappings": null
          }
        ]
      }
    ],
    "provisioningState": "Succeeded",
    "templateHash": "4006047267200301994",
    "templateLink": null,
    "timestamp": "2021-07-07T14:12:43.021370+00:00",
    "validatedResources": null
  },
  "resourceGroup": "motomiya",
  "tags": null,
  "type": "Microsoft.Resources/deployments"
}

はい、これで完了です。
ポータルから見てみると…

はい、この通り作成できてしまいました。すごく簡単ですね。
もしこれをARMテンプレートで書くと…

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "virtualNetworks_sample_vnet_name": {
            "defaultValue": "sample-vnet",
            "type": "String"
        }
    },
    "variables": {},
    "resources": [
        {
            "type": "Microsoft.Network/virtualNetworks",
            "apiVersion": "2020-11-01",
            "name": "[parameters('virtualNetworks_sample_vnet_name')]",
            "location": "japaneast",
            "properties": {
                "addressSpace": {
                    "addressPrefixes": [
                        "10.0.0.0/16"
                    ]
                },
                "subnets": [
                    {
                        "name": "Subnet-1",
                        "properties": {
                            "addressPrefix": "10.0.0.0/24",
                            "delegations": [],
                            "privateEndpointNetworkPolicies": "Enabled",
                            "privateLinkServiceNetworkPolicies": "Enabled"
                        }
                    },
                    {
                        "name": "Subnet-2",
                        "properties": {
                            "addressPrefix": "10.0.1.0/24",
                            "delegations": [],
                            "privateEndpointNetworkPolicies": "Enabled",
                            "privateLinkServiceNetworkPolicies": "Enabled"
                        }
                    }
                ],
                "virtualNetworkPeerings": [],
                "enableDdosProtection": false
            }
        },
        {
            "type": "Microsoft.Network/virtualNetworks/subnets",
            "apiVersion": "2020-11-01",
            "name": "[concat(parameters('virtualNetworks_sample_vnet_name'), '/Subnet-1')]",
            "dependsOn": [
                "[resourceId('Microsoft.Network/virtualNetworks', parameters('virtualNetworks_sample_vnet_name'))]"
            ],
            "properties": {
                "addressPrefix": "10.0.0.0/24",
                "delegations": [],
                "privateEndpointNetworkPolicies": "Enabled",
                "privateLinkServiceNetworkPolicies": "Enabled"
            }
        },
        {
            "type": "Microsoft.Network/virtualNetworks/subnets",
            "apiVersion": "2020-11-01",
            "name": "[concat(parameters('virtualNetworks_sample_vnet_name'), '/Subnet-2')]",
            "dependsOn": [
                "[resourceId('Microsoft.Network/virtualNetworks', parameters('virtualNetworks_sample_vnet_name'))]"
            ],
            "properties": {
                "addressPrefix": "10.0.1.0/24",
                "delegations": [],
                "privateEndpointNetworkPolicies": "Enabled",
                "privateLinkServiceNetworkPolicies": "Enabled"
            }
        }
    ]
}

はい、行数が全然違いますね。
これだけでもbicepがかなり便利であることがわかりました。

5.終わりに

Bicepのドキュメントはまだ英語なのですが、ドキュメントを機械翻訳かけたら「上腕二頭筋のドキュメント」になっていてすごく笑いました。
(実はそれが言いたかっただけだったり)
Bicepは上腕二頭筋という意味なんですねぇ。

Bicepを使ってみたらすごく便利だったので、これからは積極的に使っていきたいです!!

最後にまだまだじめじめした季節が続きますが、皆さまにおかれましては体調など崩さないよう、お気を付けくださいませ。

では!

参考

What is Bicep?
https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/bicep/overview