次の方法で共有


Bicep のデータ型

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

配列

配列は左大かっこ ([) で始めて、右大かっこ (]) で終わります。 Bicep では、1 行または複数行で配列を宣言できます。 コンマ (,) は、単一行宣言の値間で使用されますが、複数行の宣言では使用されません。 単一行宣言と複数行宣言を組み合わせることができます。 複数行宣言には、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
  • Array 関数を参照してください。
  • Lambda 関数を参照してください。

ブール型

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

param exampleBool bool = true

Logical 関数」を参照してください。

整数

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

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

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

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

output bar 1 | 2 | 3 = 3

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

Numeric 関数を参照してください。

オブジェクト

オブジェクトは左中かっこ ({) で始めて、右中かっこ (}) で終わります。 Bicep では、1 行または複数行でオブジェクトを宣言できます。 オブジェクト内の各プロパティは、キーと値で構成されます。 キーと値はコロン (:) で区切られます。 オブジェクトでは、任意の型の任意のプロパティが許可されます。 コンマ (,) は、単一行宣言のプロパティ間で使用されますが、複数行宣言のプロパティ間では使用されません。 単一行宣言と複数行宣言を組み合わせることができます。 複数行宣言には、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
  • オブジェクトを比較するには、 Comparison 演算子 を使用します。
  • オブジェクトからプロパティを取得するには、 Index アクセサー を使用します。
  • オブジェクト メンバーにアクセスするには、 Safe-dereference 演算子 を使用します。
  • Spread を使用してオブジェクトをマージします。

Object 関数を参照してください。

文字列

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

param exampleString string = 'test value'

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

エスケープ シーケンス 表される値 Notes
\\ \
\' '
\n ライン フィード (LF)
\r キャリッジ リターン (CR)
\t タブ文字
\u{x} Unicode コード ポイント x xは、010FFFF (両方を含む) の間の 16 進数のコード ポイント値を表します。 先頭に 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'

前の例では、colorBlueblueを割り当てると、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 つの単一引用符 (''') の後に必要に応じて改行 (開始シーケンス) と 3 つの単一引用符 (''' が終了シーケンス) の間で定義されます。 開始シーケンスと終了シーケンスの間に入力された文字は、逐語的に読み取られます。 エスケープは必要でも可能でもない。

Note

Bicep パーサーは、すべての文字をそのまま読み取ります。 Bicep ファイルの行終端に応じて、改行は\r\nまたは\nとして解釈されます。

補間は現在、複数行の文字列ではサポートされていません。 この制限のため、interpolationを使用する代わりに、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)[]

型共用体は、 stringintboolなど、単一の Azure Resource Manager 型に減らすことができない必要があります。 それ以外の場合は、 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 型に減らされる必要があります。 次の定義が無効です。

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

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

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

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

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

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

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

@secure()
param password string

@secure()
param configValues object

データ型の割り当て可否

Bicep では、ある型 (ソース型) の値を別の型 (ターゲット型) に割り当てることができます。 次の表は、どのソースの種類 (水平方向に表示) をどのターゲットの種類 (垂直方向に表示) に割り当てることができるか、または割り当てることができないかを示しています。 テーブルでは、 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 ファイルの構造に関する記事を参照してください。