Bicep のデータ型

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

サポートされている型

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

配列

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

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

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

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

配列内の各項目は、any 型によって表現されます。 各項目が同じデータ型である配列、または異なるデータ型を保持する配列を指定できます。

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

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 の範囲で指定できます。 この制限を回避するには、パラメーター ファイルで大きな整数値を指定します。 リソースの種類によって、整数プロパティに独自の制限が適用されます。

浮動小数点、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 内のすべての文字列は、補間をサポートしています。 式を挿入するには、その式を ${} で囲みます。 参照される式は、複数の行にまたがることはできません。

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 の使用時は、文字列またはオブジェクトに@secure()デコレーターを追加します。

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

次の例からは、セキュリティで保護された 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 ファイルの構造に関する記事を参照してください。