JavaScriptを有効にしてください

ARM テンプレートとBicep 01

 ·   5 分で読めます  ·   Kento

今まで時間をとって勉強ができなかった Azure の Infrastructure as Code (IaC) に挑戦します

Infrastructure as Code とは

IaC とは、マシンで読み取り可能な定義ファイルを使用してインフラストラクチャ リソースのライフサイクルを管理するためのプラクティスとツールです

コードとしてインフラストラクチャを使用して Azure ランディング ゾーンを更新する - Cloud Adoption Framework | Microsoft Learn

IaC を使うと インフラストラクチャの管理をコードで行うことができます

Azure での IaC

Azure で IaC を実行するにはいくつかの選択肢があります
このブログでは ARM テンプレート と Bicep について取り上げたいと思います

ARM テンプレート

Azure Resource Manager テンプレート (ARM テンプレート) は JSON 形式で記述します
また、以下のような特徴があるそうです

  • 宣言型
  • オーケストレーション
    • Azure には依存関係のあるサービスがありますが、順番を意識せずに記述が可能
  • モジュール式
    • ARM テンプレートを1つの巨大なファイルにしなくても役割ごとに分けて、参照することが可能
  • 変更のプレビュー
    • どのリソースが作成・削除・変更されるのかをデプロイせずに把握
  • 検証
    • デプロイ実行前に検証作業が行われるため、デプロイの失敗する可能性が低い
  • エクスポート
    • 1 から ARM テンプレートを作成しなくても、リソース グループなどをエクスポートできる

※公開情報からいくつかを抜粋
テンプレートの概要 - Azure Resource Manager | Microsoft Learn

ARM テンプレートはこんな感じで記載されます

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "",
  "apiProfile": "",
  "parameters": {  },
  "variables": {  },
  "functions": [  ],
  "resources": [  ],
  "outputs": {  }
}

要素を少し整理します

要素名 必須 ざっくり説明
$schema yes ARM テンプレートのスキーマファイルの場所。バージョンが異なるとリソースによっては対応してないパラメータが存在する可能性も?
contentVersion yes ARM テンプレートのバージョン。1.0.0.0 などを入れておく
apiProfile no resource のなかで、API のバージョンを記載せずに、ここでまとめて記載をすることが可能
parameters no デプロイする内容をカスタマイズするときに使用
variables no ARM テンプレートの中で同一の記載を省略するときに使用
functions no ARM テンプレートの中でユーザーが定義した関数を記述
resources yes ARM テンプレートによって作成・削除・変更を行うリソースを記述する。メインの場所
outputs no デプロイ後の戻り値

詳細を知りたい方は公開情報を確認ください
テンプレートの構造と構文 - Azure Resource Manager | Microsoft Learn

JSON 形式ではコメントアウトができないことが一般的だそうですが (他の JSON 形式の経験がない…) ARM テンプレートではコメントアウトをすることができます
ただし、JSON としてエラーが出てしまう可能性があるので、VS code を使う場合には拡張機能を正しく入れておく必要があります

インライン コメントについては、// または /* … */ のいずれかを使用できます。

テンプレートの構造と構文 - Azure Resource Manager | Microsoft Learn

Bicep

Bicep は Azure リソースをデプロイするためのドメイン固有言語です
Azure のために作られたものってことですね
ARM テンプレートの公開情報にも記載がありますが、Bicep は ARM テンプレートと同じ機能を提供しつつ、使いやすい構文にしているそうです

ARM テンプレートと同じ機能を提供するが構文がより使いやすい、Bicep という名前の新しい言語が導入されました

テンプレートの概要 - Azure Resource Manager | Microsoft Learn

ドメイン固有言語(ドメインこゆうげんご、英: domain-specific language、DSL)とは、特定のタスク向けに設計されたコンピュータ言語を意味する。. ドメイン特化言語あるいは単にドメイン言語とも呼ばれるが、学術的にはドメイン特化言語と呼ばれることが多い。. C言語やJavaのような汎用のプログラミング言語の対照とされる。. (wikipedia: ドメイン固有言語) DSLは、大きく内部DSLと外部DSLに分類することができます。. 内部DSL: 内部DSLは、汎用のプログラミング言語の書き方を工夫して、見かけ上の構文を自然言語に近づけた言語です。. 外部DSL: 外部DSLは、汎用のプログラミング言語とはまったく別の構文を持ったDSLです。.

Bicep の特徴を見てみます

  • すべてのリソースの種類と API バージョンのサポート
  • 単純な構文
    • JSON 形式の ARM と比べて簡潔で読みやすくなっている
  • オーケストレーション
    • Azure には依存関係のあるサービスがありますが、順番を意識せずに記述が可能
  • モジュール式
    • Bicep ファイルを1つの巨大なファイルにしなくても役割ごとに分けて、参照することが可能
  • 変更のプレビュー
    • どのリソースが作成・削除・変更されるのかをデプロイせずに把握

※公開情報からいくつか抜粋
Azure リソースをデプロイするための Bicep 言語 - Azure Resource Manager | Microsoft Learn

Bicep を使って Azure サービスをデプロイするときは ARM テンプレートへの変換処理が行われています

デプロイ中、Bicep CLI により、Bicep ファイルが ARM テンプレート JSON に変換されます。

Azure リソースをデプロイするための Bicep 言語 - Azure Resource Manager | Microsoft Learn

そのため、よりシンプルな Bicep を使って開発を行い ARM テンプレートへ変換 ということも可能です

ARM テンプレートと Bicep の比較

公開情報にストレージ アカウントを作成するときのサンプルがあったので、コピペしておきます

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
  "location": {
    "type": "string",
    "defaultValue": "[resourceGroup().location]"
  },
  "storageAccountName": {
    "type": "string",
    "defaultValue": "[format('toylaunch{0}', uniqueString(resourceGroup().id))]"
  }
},
"resources": [
  {
    "type": "Microsoft.Storage/storageAccounts",
    "apiVersion": "2021-06-01",
    "name": "[parameters('storageAccountName')]",
    "location": "[parameters('location')]",
    "sku": {
      "name": "Standard_LRS"
    },
    "kind": "StorageV2",
    "properties": {
      "accessTier": "Hot"
    }
  }
]
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
param location string = resourceGroup().location
param storageAccountName string = 'toylaunch${uniqueString(resourceGroup().id)}'

resource storageAccount 'Microsoft.Storage/storageAccounts@2021-06-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
  properties: {
    accessTier: 'Hot'
  }
}

確かに行数を見ると短くなっています
個人的に JSON はかっこの位置の対応関係が見ずらいと思うんですが、Bicep はそれがない分見やすく感じます

これを見ると、今から勉強をするなら Bicep が良さそうです
しかし、Bicep は ARM テンプレートに変換されてからデプロイされるという特徴がありました
そのためトラブルシューティングのためには ARM テンプレートの知識もある程度必要になる気がします
また Azure の IaC のサービスには ARM テンプレートしか対応していないものがあります

Azure Deployment Environments では、現在 Azure Resource Manager (ARM) テンプレートのみがサポートされています。

Azure Deployment Environments とは - Azure Deployment Environments | Microsoft Learn

以上のことから、自分はしばらくの間は ARM テンプレートと Bicep の両方を少しずつ勉強しようと思います

まとめ

Azure の IaC には ARM テンプレートと Bicep がある(他にもある)
Bicep の方に利点があるが、ARM テンプレートも大事

共有

Kento
著者
Kento
2020年に新卒で IT 企業に入社. インフラエンジニア(主にクラウド)として活動中