JavaScriptを有効にしてください

Bicep の Resource Derived Types を試し隊

 ·   4 分で読めます  ·   Kento

今回は Bicep の v0.34.1 で GA になった Resource Derived Types という機能を試してみます
この機能は Bicep でのリソース定義をさらに型安全にし、開発体験を向上させるものです

Bicep とは

Bicep は Azure Resource Manager (ARM) テンプレートを簡潔に記述するための言語です
JSON 形式の ARM テンプレートと比較して、よりシンプルな構文で Azure リソースを定義できます
デプロイ時には Bicep ファイルが ARM テンプレートに変換されて実行されます。

従来の Bicep パラメータの課題

これまでの Bicep では、リソースのプロパティを指定する際には次のような課題がありました:

  1. 型安全性の欠如 - パラメータに指定できる値の種類が限定的(string, int, bool など)で、特定のリソースタイプに対する正確な値の制約を表現できませんでした
  2. 開発体験の不足 - 有効な値を知るために常にドキュメントを参照する必要がありました
  3. エラー検出のタイミング - 無効な値はデプロイ時にのみ検出され、開発中のフィードバックが遅れていました

例えば、ストレージアカウントを作成する従来の Bicep ファイルはこのようなものでした:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
param location string = resourceGroup().location
param storageAccountName string = 'st${uniqueString(resourceGroup().id)}'
param storageAccountSku string = 'Standard_LRS' // 有効な値はどこにも示されていない
param storageAccountKind string = 'StorageV2' // 有効な値はどこにも示されていない

resource storageAccount 'Microsoft.Storage/storageAccounts@2024-01-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: storageAccountSku // 入力ミスや無効な値はデプロイ時にのみエラーになる
  }
  kind: storageAccountKind // 入力ミスや無効な値はデプロイ時にのみエラーになる
}

このコードでは以下のような問題があります:

  • storageAccountSku パラメータは単なる文字列として定義されており、有効な値が何かをコード上で確認できません
  • 誤った値(例えば「Standerd_LRS」のようなタイプミス)を指定しても、デプロイ時までエラーが検出されません
  • Intellisense による補完やヒントが限定的です
image03
従来の Bicep の例:

パラメーターを使わず直接指定する場合は、候補が表示されます

image02
パラメータを使わない例:

Resource Derived Types の登場

Bicep v0.34.1 で導入された Resource Derived Types は、これらの問題を解決します
特定のリソースタイプとバージョンからプロパティの型情報を取得することで、より型安全な開発体験を提供します

新しい構文は resourceInput<'リソース@バージョン'>.プロパティ.パス の形式で、例えば:

1
param storageAccounntSku resourceInput<'Microsoft.Storage/storageAccounts@2024-01-01'>.sku.name

これにより:

  1. リソースの特定プロパティに対して有効な型情報が提供されます
  2. IDEでの入力補完と型チェックが可能になります
  3. デプロイ前に型エラーを検出できるようになります

Resource Derived Types を使ったサンプル

以下は Resource Derived Types を使ったストレージアカウント作成の例です:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
// 従来のパラメータ
param location string = resourceGroup().location
param storageAccountName string = 'st${uniqueString(resourceGroup().id)}'

// v0.34.1 から使える機能
param storageAccounntSku resourceInput<'Microsoft.Storage/storageAccounts@2024-01-01'>.sku.name = 'Standard_LRS'
param storageAccountKind resourceInput<'Microsoft.Storage/storageAccounts@2024-01-01'>.kind = 'StorageV2'

resource storageAccount 'Microsoft.Storage/storageAccounts@2024-01-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: storageAccounntSku
  }
  kind: storageAccountKind
}

output storageEndpoints resourceOutput<'Microsoft.Storage/storageAccounts@2024-01-01'>.properties.primaryEndpoints = storageAccount.properties.primaryEndpoints

このコードでは:

  1. resourceInput を使って、ストレージアカウントの SKU と Kind に対して型情報を提供
  2. これにより Visual Studio Code などの IDE では、有効な値の一覧が表示され入力補完が可能に
  3. resourceOutput を使って、出力値の型も厳密に定義
image01
Resource Derived Types の例:

Resource Derived Types のメリット

この新機能によって得られるメリットは多岐にわたります:

  1. 開発時の型安全性 - パラメータの型が明確に定義され、無効な値はコーディング段階で検出
  2. IDE サポートの強化 - IntelliSense による入力補完、ヒント、エラー検出が充実
  3. ドキュメント参照の削減 - 有効な値の一覧がコード補完で確認できるため、ドキュメントを頻繁に参照する必要がなくなる
  4. バグの早期発見 - デプロイ前に多くの問題を検出可能

Resource Derived Types の使い方

Resource Derived Types には、主に2つの形式があります:

  1. resourceInput - リソース定義のパラメータとして使用

    1
    
    param storageSku resourceInput<'Microsoft.Storage/storageAccounts@2024-01-01'>.sku.name
    
  2. resourceOutput - リソースからの出力として使用

    1
    
    output endpoint resourceOutput<'Microsoft.Storage/storageAccounts@2024-01-01'>.properties.primaryEndpoints
    

これらを使うことで、Visual Studio Code などの IDE では適切なプロパティの補完と型チェックが可能になります。

まとめ

Bicep の Resource Derived Types は、Azure リソースの定義をより型安全に、より開発者フレンドリーにする重要な機能です
従来の文字列ベースのパラメータ定義と比較して、コーディング時のエラー検出や補完機能が強化され、開発効率と品質の向上に貢献します

特に複雑なリソースタイプや、頻繁に使用しないリソースを扱う際に、正しいプロパティや値を覚えておく必要がなくなるため、開発者の認知負荷が軽減されます

Bicep を使用している方は、ぜひこの新機能を試してみてください。開発体験が大きく向上するはずです。

参考

共有

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