Bicep のユーザー定義関数
Bicep ファイル内で、独自の関数を作成できます。 これらの関数は、Bicep ファイルで使用できます。 ユーザー定義関数は、Bicep ファイル内で自動的に使用可能になる標準 Bicep 関数とは別のものです。 Bicep ファイルで繰り返し使用される複雑な式がある場合は、独自の関数を作成します。 ユーザー定義関数を使用すると、言語バージョン 2.0 コード生成が自動的に有効になります。
この機能を使用するには、Bicep CLI バージョン 0.26.X 以上が必要です。
制限事項
ユーザー関数を定義するときは、いくつかの制限があります。
- 関数は変数にアクセスできません。
- 関数は、関数内で定義されているパラメーターのみを使用できます。
- 関数では、reference 関数、またはいずれの list 関数も使用できません。
- 関数のパラメーターでは既定値を指定できません。
関数を定義する
func
ステートメントを使用して、ユーザー定義関数を定義します。
@<decorator>(<argument>)
func <user-defined-function-name> (<argument-name> <data-type>, <argument-name> <data-type>, ...) <function-data-type> => <expression>
例
次の例は、ユーザー定義関数を定義して使用する方法を示しています。
func buildUrl(https bool, hostname string, path string) string => '${https ? 'https' : 'http'}://${hostname}${empty(path) ? '' : '/${path}'}'
func sayHelloString(name string) string => 'Hi ${name}!'
func sayHelloObject(name string) object => {
hello: 'Hi ${name}!'
}
func nameArray(name string) array => [
name
]
func addNameArray(name string) array => [
'Mary'
'Bob'
name
]
output azureUrl string = buildUrl(true, 'microsoft.com', 'azure')
output greetingArray array = map(['Evie', 'Casper'], name => sayHelloString(name))
output greetingObject object = sayHelloObject('John')
output nameArray array = nameArray('John')
output addNameArray array = addNameArray('John')
上記の例の出力は、次のとおりです。
名前 | Type | 値 |
---|---|---|
azureUrl | String | https://microsoft.com/azure |
greetingArray | Array | ["Hi Evie!","Hi Casper!"] |
greetingObject | オブジェクト | {"hello":"Hi John!"} |
nameArray | Array | ["John"] |
addNameArray | Array | ["Mary","Bob","John"] |
Bicep CLI バージョン 0.23.X 以上では、ユーザー定義関数内で別のユーザー定義関数を呼び出す柔軟性があります。 前の例では、sayHelloString
関数の定義を使用して、sayHelloObject
関数を次のように再定義することができます。
func sayHelloObject(name string) object => {
hello: sayHelloString(name)
}
ユーザー定義関数では、ユーザー定義データ型の使用がサポートされています。 次に例を示します。
@minValue(0)
type positiveInt = int
func typedArg(input string[]) positiveInt => length(input)
param inArray array = [
'Bicep'
'ARM'
'Terraform'
]
output elements positiveInt = typedArg(inArray)
前の例からの出力は次のようになります。
名前 | Type | 値 |
---|---|---|
要素 | positiveInt | 3 |
デコレーターを使用する
デコレーターは、@expression
という形式で記述して、関数宣言の上に置きます。 次の表は、関数で使用できるデコレーターです。
デコレーター | 引数 | 説明 |
---|---|---|
説明 | string | 関数の説明を指定します。 |
export | なし | 関数を別の Bicep ファイルでインポートできることを示します。 |
metadata | オブジェクト | 関数に適用するカスタム プロパティ。 description デコレーターに相当する description プロパティを含めることができます。 |
デコレーターは、sys 名前空間にあります。 このデコレーターを同じ名前の別の項目と区別する必要がある場合は、デコレータの前に「sys
」を付けます。 たとえば、Bicep ファイルに description
という名前の変数が含まれている場合、description デコレーターを使用するときに、sys 名前空間を追加する必要があります。
説明
説明を追加するには、関数の宣言に description を追加します。 次に例を示します。
@description('The say hello function.')
func sayHelloString(name string) string => 'Hi ${name}!'
説明のテキストとして Markdown 形式のテキストを使用できます。
Export
関数を他の Bicep ファイルと共有するには、@export()
を使います。 詳しくは、「エクスポート型、変数、および関数」をご覧ください。
Metadata
ユーザー定義関数に適用するカスタム プロパティがある場合は、メタデータ デコレーターを追加します。 メタデータ内で、カスタムの名前と値を持つオブジェクトを定義します。 メタデータに対して定義するオブジェクトには、任意の名前と型のプロパティを含めることができます。
このデコレーターを使用して、説明に追加しても意味のない、関数に関する情報を追跡できます。
@description('Configuration values that are applied when the application starts.')
@metadata({
source: 'database'
contact: 'Web team'
})
type settings object
別のデコレーターと競合するプロパティを持つ @metadata()
デコレーターを指定すると、その別のデコレーターが @metadata()
デコレーター内のいずれよりも常に優先されます。 そのため、@metadata()
値内の競合するプロパティは冗長であり、置き換えられます。 詳細については、「競合するメタデータがない」を参照してください。
次のステップ
- Bicep ファイルの構造と構文の詳細については、「Bicep ファイルの構造と構文について」を参照してください。
- 使用可能な Bicep 関数の一覧については、「Bicep 関数」を参照してください。