Bicep のデータ型

この記事では、Bicep でサポートされているデータ型について説明します。 カスタム データ型を定義するには、「ユーザー定義データ型」を参照してください。

サポートされている型

Bicep 内では、こちらのデータ型を使用できます。

配列

配列は左大かっこ ([) で始めて、右大かっこ (]) で終わります。 Bicep では、配列を単一行または複数行で宣言できます。 コンマ (,) は単一行宣言の値の間で使用されますが、複数行宣言では使用されません。単一行宣言と複数行宣言を組み合わせることができます。 複数行宣言には、Bicep CLI バージョン 0.7.X 以降が必要です。

var multiLineArray = [
  'abc'
  'def'
  'ghi'
]

var singleLineArray = ['abc', 'def', 'ghi']

var mixedArray = ['abc', 'def'
    'ghi']

各配列要素には任意の型を指定できます。 各項目が同じデータ型である配列、または異なるデータ型を保持する配列を指定できます。

次の例は、整数の配列およびさまざまな型の配列を示したものです。

var integerArray = [
  1
  2
  3
]

var mixedArray = [
  resourceGroup().name
  1
  true
  'example string'
]

Bicep の配列は 0 オリジンです。 次の例では、exampleArray[0] は 1 に評価され、exampleArray[2] は 3 に評価されます。 インデクサーのインデックスは、別の式にすることができます。 式 exampleArray[index] は 2 に評価されます。 整数インデクサーは、配列型の式でのみ使用できます。

var index = 1

var exampleArray = [
  1
  2
  3
]

インデックスが範囲外の場合、次のエラーが発生します。

The language expression property array index 'x' is out of bounds

この例外を回避するには、次の例のように Or 論理演算子を使います。

param emptyArray array = []
param numberArray array = [1, 2, 3]

output foo bool = empty(emptyArray) || emptyArray[0] == 'bar'
output bar bool = length(numberArray) <= 3 || numberArray[3] == 4

ブール値

ブール値を指定するとき、true または false を使用します。 値を引用符で囲まないでください。

param exampleBool bool = true

整数

整数値を指定するとき、引用符を使用しないでください。

param exampleInt int = 1

Bicep 整数は 64 ビット整数です。 インライン パラメーターとして渡されると、デプロイに使用する SDK またはコマンド ライン ツールによって値の範囲を制限できます。 たとえば、PowerShell を使用して Bicep をデプロイする場合、整数型は -2147483648 から 2147483647 の範囲で指定できます。 この制限を回避するには、パラメーター ファイルで大きな整数値を指定します。 リソースの種類によって、整数プロパティに独自の制限が適用されます。

Bicep では、正確な整数である特定の値を参照する整数リテラル型がサポートされています。 次の例では、 1 は整数リテラル型であり、 foo は値 1 のみを割り当てることができ、それ以外の値は割り当てできません。

output foo 1 = 1

整数リテラル型は、前の例に示すようにインラインで宣言することも、 type ステートメントで宣言することもできます

type oneType = 1

output foo oneType = 1
output bar oneType = 2

前の例では、bar に 2 を割り当てるとBCP033 エラーが発生します。値が "1" ですが、指定された値は型 "2" です。

次の例は、整数リテラル型と union 型の使用を示しています。

output bar 1 | 2 | 3 = 3

浮動小数点、10 進数、またはバイナリ形式は現在サポートされていません。

オブジェクト

オブジェクトは左中かっこ ({) で始めて、右中かっこ (}) で終わります。 Bicep では、オブジェクトを単一行または複数行で宣言できます。 オブジェクト内の各プロパティはキーと値で構成されます。 キーと値はコロン (:) で区切られます。 オブジェクトでは、任意の型の任意のプロパティが許可されます。 コンマ (,) は、単一行宣言のプロパティ間で使用されますが、複数行宣言のプロパティ間では使用されません。 単一行宣言と複数行宣言を組み合わせることができます。 複数行宣言には、Bicep CLI バージョン 0.7.X 以降が必要です。

param singleLineObject object = {name: 'test name', id: '123-abc', isCurrent: true, tier: 1}

param multiLineObject object = {
  name: 'test name'
  id: '123-abc'
  isCurrent: true
  tier: 1
}

param mixedObject object = {name: 'test name', id: '123-abc', isCurrent: true
    tier: 1}

Bicep では、必要に応じてオブジェクトのプロパティ キーに引用符を使用できます。

var test = {
  'my - special. key': 'value'
}

前の例では、オブジェクトのプロパティ キーに特殊文字が含まれている場合に、引用符が使用されています。 たとえば、スペース、'-'、'.' などです。 次の例は、オブジェクト プロパティ キーに補間を使用する方法を示しています。

var stringVar = 'example value'
var objectVar = {
  '${stringVar}': 'this value'
}

オブジェクトのプロパティにアクセスするために、プロパティ アクセサーが使用されます。 これらは、. 演算子を使用して構築されます。

var a = {
  b: 'Dev'
  c: 42
  d: {
    e: true
  }
}

output result1 string = a.b // returns 'Dev'
output result2 int = a.c // returns 42
output result3 bool = a.d.e // returns true

プロパティ アクセサーは、オブジェクト型のパラメーターや変数、オブジェクト リテラルなど、任意のオブジェクトとともに使用できます。 オブジェクト型以外の式でプロパティ アクセサーを使用すると、エラーが発生します。

[] 構文を使用してプロパティにアクセスすることもできます。 次の例では、Development が返されます。

var environmentSettings = {
  dev: {
    name: 'Development'
  }
  prod: {
    name: 'Production'
  }
}

output accessorResult string = environmentSettings['dev'].name

JSON では、オブジェクトは 0 個以上のキーと値のペアの順序付けられていないコレクションです。 順序付けは実装によって異なる可能性があります。 たとえば、Bicep items() 関数では、アルファベット順でオブジェクトを並べ替えます。 他の場所では、元の順序を保持できます。 この非決定性のため、デプロイのパラメーターと出力と対話するコードを記述するときは、オブジェクト キーの順序について想定することは避けてください。

オブジェクトの存在しないプロパティにアクセスすると、次のエラーが発生します。

The language expression property 'foo' doesn't exist

この例外を回避するには、次の例のように And 論理演算子を使います。

param objectToTest object = {
  one: 1
  two: 2
  three: 3
}

output bar bool = contains(objectToTest, 'four') && objectToTest.four == 4

文字列

Bicep では、文字列は単一引用符でマークされ、1 行で宣言する必要があります。 0 から 10FFFF のコード ポイントの Unicode 文字をすべて使用できます。

param exampleString string = 'test value'

次の表に、円記号 (\) 文字でエスケープする必要がある予約文字のセットを示します。

エスケープ シーケンス 表される値 Notes
\\ \
\' '
\n ライン フィード (LF)
\r キャリッジ リターン (CR)
\t タブ文字
\u{x} Unicode コード ポイント x x は、0 から 10FFFF の範囲にある 16 進数のコード ポイント を表します (0 と 10FFFF を含む)。 先頭に 0 を指定できます。 FFFF より大きいコード ポイントはサロゲート ペアとして出力されます。
\$ $ { が後に続く場合のみエスケープします。
// evaluates to "what's up?"
var myVar = 'what\'s up?'

Bicep では、特定の文字列値を参照する文字列リテラル型がサポートされています。 次の例では、 red は文字列リテラル型であり、 redColor には、 red 値のみを割り当てることができ その他の値は割り当てできません。

output redColor 'red' = 'red'

文字列リテラル型は、前の例に示すようにインラインで宣言することも、 type ステートメントで宣言することもできます

type redColor = 'red'

output colorRed redColor = 'red'
output colorBlue redColor = 'blue'

前の例では、bluecolorBlue に割り当てるとBCP033 エラーが発生します。"'red' 型の値が適用されましたが、指定された値は "'blue'" 型です。

次の例は、文字列リテラル型と union 型の使用を示しています。

type direction = 'north' | 'south' | 'east' | 'west'

output west direction = 'west'
output northWest direction = 'northwest'

Bicep 内のすべての文字列は、補間をサポートしています。 式を挿入するには、その式を ${} で囲みます。 参照される式は、複数の行にまたがることはできません。

var storageName = 'storage${uniqueString(resourceGroup().id)}'

複数行の文字列

Bicep では、連続した 3 つのシングル クォーテーション記号 2 組ではさんだ部分が複数行文字列となります。最初の 3 つのシングル クォーテーション (''') を開始シーケンスと呼び、必要に応じてこの後に改行を挿入します。最後の 3 つのシングル クォーテーション (''') は終了シーケンスと呼びます。 開始シーケンスと終了シーケンスの間に入力された文字は逐語的に読み取られ、エスケープは必要ありません。

注意

Bicep パーサーでは、Bicep ファイルの行の終わりに従って、すべての文字がそのまま読み取られるため、改行は \r\n または \n として解釈される可能性があります。

現在、複数行の文字列では、補間はサポートされていません。 この制限があるため、補間を使用する代わりに concat 関数を使用する必要がある場合があります。

''' を含む複数行の文字列はサポートされていません。

// evaluates to "hello!"
var myVar = '''hello!'''

// evaluates to "hello!" because the first newline is skipped
var myVar2 = '''
hello!'''

// evaluates to "hello!\n" because the final newline is included
var myVar3 = '''
hello!
'''

// evaluates to "  this\n    is\n      indented\n"
var myVar4 = '''
  this
    is
      indented
'''

// evaluates to "comments // are included\n/* because everything is read as-is */\n"
var myVar5 = '''
comments // are included
/* because everything is read as-is */
'''

// evaluates to "interpolation\nis ${blocked}"
// note ${blocked} is part of the string, and is not evaluated as an expression
var myVar6 = '''interpolation
is ${blocked}'''

共用体型

Bicep では、共用体型を使用して、一連のサブタイプで構成される結合型を作成できます。 個々のサブタイプの割り当てが許可されている場合、割り当ては有効です。 |文字は、or 条件を使用して個々のサブタイプを区切ります。 たとえば、構文 'a' |'b' は、有効な割り当てが 'a' または 'b'であることを意味します。 共用体型は Bicep の使用できる値の制約に変換されるため、リテラルのみがメンバーとして許可されます。 共用体には、任意の個数のリテラル型の式を含めることができます。

type color = 'Red' | 'Blue' | 'White'
type trueOrFalse = 'true' | 'false'
type permittedIntegers = 1 | 2 | 3
type oneOfSeveralObjects = {foo: 'bar'} | {fizz: 'buzz'} | {snap: 'crackle'}
type mixedTypeArray = ('fizz' | 42 | {an: 'object'} | null)[]

型共用体は、単一の ARM 型 ('string'、'int'、'bool' など) に減らすことができない必要があります。 それ以外の場合は、 BCP294 エラー コードが表示されます。 次に例を示します。

type foo = 'a' | 1

共用体の型宣言では、任意の型式をサブタイプとして使用できます ( | 文字間)。 たとえば、次の例はすべて有効です。

type foo = 1 | 2
type bar = foo | 3
type baz = bar | (4 | 5) | 6

カスタム タグ付き共用体データ型

Bicep では、カスタムタグ付き共用体データ型がサポートされています。これは、複数の異なる型のいずれかである可能性のある値を表すために使用されます。 カスタムタグ付き共用体データ型を宣言するには、 @discriminator() デコレーターを使用できます。 このデコレータを使用するには、Bicep CLI バージョン 0.21.X 以上が必要です。 構文は次のとおりです。

@discriminator('<property-name>')

識別子デコレーターは、1 つのパラメーターを受け取り、これはすべての共用体メンバーにわたって共有されるプロパティ名を表します。 このプロパティ名は、すべてのメンバーで要求される文字列リテラルである必要があり、大文字と小文字が区別されます。 共用体メンバーの判別プロパティの値は、大文字と小文字を区別しない方法で一意である必要があります。

type FooConfig = {
  type: 'foo'
  value: int
}

type BarConfig = {
  type: 'bar'
  value: bool
}

@discriminator('type')
param ServiceConfig  FooConfig | BarConfig | { type: 'baz', *: string } = { type: 'bar', value: true }

パラメーター値は、判別プロパティ値に基づいて検証されます。 たとえば、前の例では、 serviceConfig パラメーターの型が foo の場合、 FooConfig 型を使用して検証されます。 同様に、パラメーターの型が bar の場合は、 BarConfig 型を使用して検証されます。 このパターンは、他の型にも適用されます。

共用体の種類にはいくつかの制限があります。

  • 共用体の種類は、1 つの Azure Resource Manager (ARM) 型に減らされる必要があります。 次の定義が無効です。

    type foo = 'a' | 1
    
  • リテラルのみがメンバーとして許可されます。

  • すべてのリテラルは、同じプリミティブ データ型 (たとえば、すべての文字列またはすべての整数) である必要があります。

共用体の型構文は、ユーザー定義データ型で使用できます。

セキュリティで保護された文字列とオブジェクト

セキュリティで保護された文字列では文字列と同じ形式が使用され、セキュリティで保護されたオブジェクトではオブジェクトと同じ形式が使用されます。 Bicep では、 @secure() decorator を文字列またはオブジェクトに追加します。

パラメーターをセキュリティで保護された文字列またはセキュリティで保護されたオブジェクトに設定した場合、パラメーターの値はデプロイ履歴に保存されず、ログにも記録されません。 ただし、セキュリティで保護された値を、セキュリティで保護された値を想定していないプロパティに設定した場合、その値は保護されません。 たとえば、セキュリティで保護された文字列をタグに設定すると、その値はプレーンテキストとして格納されます。 パスワードとシークレットにはセキュリティで保護された文字列を使用します。

次の例からは、セキュリティで保護された 2 つのパラメーターを確認できます。

@secure()
param password string

@secure()
param configValues object

データ型の割り当て可否

Bicep では、ある型 (ソース型) の値をもう 1 つの別の型 (ターゲット型) に割り当てることができます。 次のテーブルは、どのソース型 (横向きに配置) をどのターゲット型 (縦向きに配置) に割り当てられるかを示しています。 このテーブルで、X は割り当てられることを、空欄は割り当てられないことを、? は互換性がある場合に限り割り当てられることを表します。

種類 any error string number int bool null object array 名前付きリソース 名前付きモジュール scope
any X X X X X X X X X X X
error
string X X
number X X X
int X X
bool X X
null X X
object X X
array X X
resource X X
module X X
scope ?
名前付きリソース X ? ?
名前付きモジュール X ? ?

次のステップ

Bicep の構造と構文については、Bicep ファイルの構造に関する記事を参照してください。