ARM テンプレート用のラムダ関数
この記事では、ARM テンプレートで使用するラムダ関数について説明します。 ラムダ関数は、基本的に、引数として渡すことができるコードのブロックです。 これは、複数のパラメーターを取ることができますが、1 行のコードに限定されます。 Bicep では、ラムダ式は次の形式になります。
lambda(<lambda variable>, [<lambda variable>, ...], <expression>)
制限事項
ARM テンプレートのラムダ関数には、次の制限があります。
- ラムダ式は、次の関数の関数引数としてのみ直接指定できます。
filter()
groupBy()
map()
mapValues()
reduce()
sort()
toObject()
- リソース内またはモジュール配列アクセスでのラムダ変数 (ラムダ関数で使用される一時的な変数) の使用は、現在サポートされていません。
listKeys
関数内でのラムダ変数の使用は現在サポートされていません。- reference 関数内でのラムダ変数の使用は現在サポートされていません。
filter
filter(inputArray, lambda function)
カスタム フィルター関数を使用して配列をフィルター処理します。
Bicep では、filter 関数を使用します。
パラメーター
パラメーター | 必須 | タイプ | 説明 |
---|---|---|---|
inputArray | はい | array | フィルター処理する配列。 |
ラムダ関数 | はい | expression | 各入力配列要素に適用されるラムダ関数。 false の場合、項目は出力配列からフィルターで除外されます。 |
戻り値
配列。
例
次の例は、filter
関数を使用する方法を示しています。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"dogs": [
{
"name": "Evie",
"age": 5,
"interests": [
"Ball",
"Frisbee"
]
},
{
"name": "Casper",
"age": 3,
"interests": [
"Other dogs"
]
},
{
"name": "Indy",
"age": 2,
"interests": [
"Butter"
]
},
{
"name": "Kira",
"age": 8,
"interests": [
"Rubs"
]
}
]
},
"resources": [],
"outputs": {
"oldDogs": {
"type": "array",
"value": "[filter(variables('dogs'), lambda('dog', greaterOrEquals(lambdaVariables('dog').age, 5)))]"
},
"dogNameIndex": {
"type": "array",
"value": "[filter(variables('dogs'), lambda('val', 'i', and(less(lambdaVariables('i'), 2), equals(substring(lambdaVariables('val').name, 0, 1), 'C'))))]"
}
}
}
前の例の出力は次のとおりです。
名前 | Type | 値 |
---|---|---|
oldDogs | Array | [{"name":"Evie","age":5,"interests":["Ball","Frisbee"]},{"name":"Ira","age":8,"interests":["Rubs"]}] |
dogNameIndex | Array | [{"name":"Casper","age":3,"interests":["Other dogs"]}] |
oldDogsは 5歳以上の犬を一覧表示します。 dogNameIndex は、 インデックス番号が 2 未満で、名前が文字 "C" で始まる犬を識別します。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"copy": [
{
"name": "itemForLoop",
"count": "[length(range(0, 10))]",
"input": "[range(0, 10)[copyIndex('itemForLoop')]]"
}
]
},
"resources": [],
"outputs": {
"filteredLoop": {
"type": "array",
"value": "[filter(variables('itemForLoop'), lambda('i', greater(lambdaVariables('i'), 5)))]"
},
"isEven": {
"type": "array",
"value": "[filter(range(0, 10), lambda('i', equals(0, mod(lambdaVariables('i'), 2))))]"
}
}
}
前の例からの出力は次のようになります。
名前 | Type | 値 |
---|---|---|
filteredLoop | Array | [6, 7, 8, 9] |
isEven | Array | [0, 2, 4, 6, 8] |
filterdLoop は、5 より大きい配列の数値を示します。isEven は配列内の偶数を示します。
groupBy
groupBy(inputArray, lambda expression)
グループ化条件を使用して、配列から配列値を持つオブジェクトを作成します。
Bicep では、groupBy 関数を使用します。
パラメーター
パラメーター | 必須 | タイプ | 説明 |
---|---|---|---|
inputArray | はい | 配列 | グループ化する配列。 |
ラムダ式 | はい | 式 (expression) | ラムダ式は、各入力配列要素に適用され、グループ化条件を使用して要素をグループ化します。 |
戻り値
オブジェクト。
例
次の例は、groupBy
関数の使用法を示しています。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"inputArray": [
"foo",
"bar",
"baz"
]
},
"resources": [],
"outputs": {
"outObject": {
"type": "object",
"value": "[groupBy(variables('inputArray'), lambda('x', substring(lambdaVariables('x'), 0, 1)))]"
}
}
}
前の例の出力は、5 才以上の犬を示しています。
名前 | Type | Value |
---|---|---|
outObject | Object | {"f":["foo"],"b":["bar","baz"]} |
outObject は、配列要素を最初の文字でグループ化するオブジェクトを示します。
map
map(inputArray, lambda function)
配列の各要素にカスタム マッピング関数を適用します。
Bicep では、map 関数を使用します。
パラメーター
パラメーター | 必須 | タイプ | 説明 |
---|---|---|---|
inputArray | はい | array | マップする配列。 |
ラムダ関数 | はい | expression | 出力配列を生成するために、各入力配列要素に適用されるラムダ関数。 |
戻り値
配列。
例
次の例は、map
関数の使用法を示しています。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"dogs": [
{
"name": "Evie",
"age": 5,
"interests": [
"Ball",
"Frisbee"
]
},
{
"name": "Casper",
"age": 3,
"interests": [
"Other dogs"
]
},
{
"name": "Indy",
"age": 2,
"interests": [
"Butter"
]
},
{
"name": "Kira",
"age": 8,
"interests": [
"Rubs"
]
}
]
},
"resources": [],
"outputs": {
"dogNames": {
"type": "array",
"value": "[map(variables('dogs'), lambda('dog', lambdaVariables('dog').name))]"
},
"sayHi": {
"type": "array",
"value": "[map(variables('dogs'), lambda('dog', format('Hello {0}!', lambdaVariables('dog').name)))]"
},
"mapArray": {
"type": "array",
"value": "[map(range(0, length(variables('dogs'))), lambda('i', createObject('i', lambdaVariables('i'), 'dog', variables('dogs')[lambdaVariables('i')].name, 'greeting', format('Ahoy, {0}!', variables('dogs')[lambdaVariables('i')].name))))]"
},
"mapArrayIndex": {
"type": "array",
"value": "[map(variables('dogs'), lambda('x', 'i', createObject('index', lambdaVariables('i'), 'val', lambdaVariables('x').name)))]"
}
}
}
前の例からの出力は次のようになります。
名前 | Type | 値 |
---|---|---|
dogNames | Array | ["Evie","Casper","Indy","Kira"] |
sayHi | Array | ["Hello Evie!","Hello Casper!","Hello Indy!","Hello Kira!"] |
mapArray | Array | [{"i":0,"dog":"Evie","greeting":"Ahoy, Evie!"},{"i":1,"dog":"Casper","greeting":"Ahoy, Casper!"},{"i":2,"dog":"Indy","greeting":"Ahoy, Indy!"},{"i":3,"dog":"Kira","greeting":"Ahoy, Kira!"}] |
mapArrayIndex | Array | [{"index":0,"val":"Evie"},{"index":1,"val":"Casper"},{"index":2,"val":"Indy"},{"index":3,"val":"Kira"}] |
dogNames は、 オブジェクトの配列からの犬の名前を示します。 sayHi は "Hello" と各犬の名前を連結します。 mapArray と mapArrayIndex は 、オブジェクトの別の 2 つの配列を作成します。
mapValues
mapValues(inputObject, lambda expression)
ラムダ式を使用して値をマップし、入力オブジェクトからオブジェクトを作成します。
Bicep では、mapValues 関数を使用します。
パラメーター
パラメーター | 必須 | タイプ | 説明 |
---|---|---|---|
inputObject | はい | オブジェクト | マップするオブジェクト。 |
ラムダ式 | はい | 式 (expression) | 値のマップに使用されるラムダ式。 |
戻り値
オブジェクト。
例
次の例は、mapValues
関数の使用法を示しています。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"inputObject": {
"foo": "foo",
"bar": "bar"
}
},
"resources": [],
"outputs": {
"mapObject": {
"type": "object",
"value": "[mapValues(variables('inputObject'), lambda('val', toUpper(lambdaVariables('val'))))]"
}
}
}
前の例からの出力は次のようになります。
名前 | Type | Value |
---|---|---|
mapObject | Object | {foo: 'FOO', bar: 'BAR'} |
mapObject は、大文字の値を持つ別のオブジェクトを作成します。
reduce
reduce(inputArray, initialValue, lambda function)
カスタムの reduce 関数を使用して配列を減らします。
Bicep では、reduce 関数を使用します。
パラメーター
パラメーター | 必須 | タイプ | 説明 |
---|---|---|---|
inputArray | はい | array | 削減する配列。 |
initialValue | はい | any | 初期値。 |
ラムダ関数 | はい | expression | 現在の値と次の値を集計するために使用されるラムダ関数。 |
戻り値
任意。
例
次の例は、reduce
関数を使用する方法を示しています。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"dogs": [
{
"name": "Evie",
"age": 5,
"interests": [
"Ball",
"Frisbee"
]
},
{
"name": "Casper",
"age": 3,
"interests": [
"Other dogs"
]
},
{
"name": "Indy",
"age": 2,
"interests": [
"Butter"
]
},
{
"name": "Kira",
"age": 8,
"interests": [
"Rubs"
]
}
],
"ages": "[map(variables('dogs'), lambda('dog', lambdaVariables('dog').age))]"
},
"resources": [],
"outputs": {
"totalAge": {
"type": "int",
"value": "[reduce(variables('ages'), 0, lambda('cur', 'next', add(lambdaVariables('cur'), lambdaVariables('next'))))]"
},
"totalAgeAdd1": {
"type": "int",
"value": "[reduce(variables('ages'), 1, lambda('cur', 'next', add(lambdaVariables('cur'), lambdaVariables('next'))))]"
},
"oddAge": {
"type": "int",
"value": "[reduce(variables('ages'), 0, lambda('cur', 'next', 'i', if(equals(mod(lambdaVariables('i'), 2), 0), add(lambdaVariables('cur'), lambdaVariables('next')), lambdaVariables('cur'))))]"
}
}
}
前の例からの出力は次のようになります。
名前 | Type | 値 |
---|---|---|
totalAge | INT | 18 |
totalAgeAdd1 | INT | 19 |
oddAge | int | 7 |
totalAge は犬の年齢を合計します。totalAgeAdd1 の初期値は 1 で、この初期値にすべての犬の年齢が加算されます。 oddAge は、偶数インデックスにある犬の年齢を合計します。具体的には 5 (Evie) と 2 (Indy) です。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [],
"outputs": {
"reduceObjectUnion": {
"type": "object",
"value": "[reduce(createArray(createObject('foo', 123), createObject('bar', 456), createObject('baz', 789)), createObject(), lambda('cur', 'next', union(lambdaVariables('cur'), lambdaVariables('next'))))]"
}
}
}
前の例からの出力は次のようになります。
名前 | Type | 値 |
---|---|---|
reduceObjectUnion | object | {"foo":123,"bar":456,"baz":789} |
union 関数は、パラメーターからのすべての要素とともに 1 つのオブジェクトを返します。 関数呼び出しは、オブジェクトのキーと値のペアを新しいオブジェクトに結合します。
sort
sort(inputArray, lambda function)
カスタムの sort 関数を使用して配列を並べ替えます。
Bicep では、sort 関数を使用します。
パラメーター
パラメーター | 必須 | タイプ | 説明 |
---|---|---|---|
inputArray | はい | array | 並べ替える配列。 |
ラムダ関数 | はい | expression | 順序付けのため、2 つの配列要素を比較するために使用されるラムダ関数。 true の場合、2 番目の要素が、出力配列の最初の要素の後に置かれます。 |
戻り値
配列。
例
次の例は、sort
関数の使用法を示しています。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"dogs": [
{
"name": "Evie",
"age": 5,
"interests": [
"Ball",
"Frisbee"
]
},
{
"name": "Casper",
"age": 3,
"interests": [
"Other dogs"
]
},
{
"name": "Indy",
"age": 2,
"interests": [
"Butter"
]
},
{
"name": "Kira",
"age": 8,
"interests": [
"Rubs"
]
}
]
},
"resources": [],
"outputs": {
"dogsByAge": {
"type": "array",
"value": "[sort(variables('dogs'), lambda('a', 'b', less(lambdaVariables('a').age, lambdaVariables('b').age)))]"
}
}
}
前の例の出力では、dog オブジェクトが若いものから順に並べ替えられています。
名前 | Type | 値 |
---|---|---|
dogsByAge | Array | [{"name":"Indy","age":2,"interests":["Butter"]},{"name":"Casper","age":3,"interests":["Other dogs"]},{"name":"Evie","age":5,"interests":["Ball","Frisbee"]},{"name":"Kira","age":8,"interests":["Rubs"]}] |
toObject
toObject(inputArray, lambda function, [lambda function])
カスタム キー関数と省略可能なカスタム値関数を使用して、配列をオブジェクトに変換します。 オブジェクトの配列への変換については、items を参照してください。
Bicep で toObject 関数を使用します。
パラメーター
パラメーター | 必須 | タイプ | 説明 |
---|---|---|---|
inputArray | はい | array | オブジェクトの作成に使用される配列。 |
ラムダ関数 | はい | expression | キー述語を提供するために使用されるラムダ関数。 |
ラムダ関数 | いいえ | expression | 値述語を提供するために使用されるラムダ関数。 |
戻り値
オブジェクト。
例
次の例は、2 つの必須パラメーターをもつ toObject
関数を使用する方法を示しています。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"dogs": [
{
"name": "Evie",
"age": 5,
"interests": [
"Ball",
"Frisbee"
]
},
{
"name": "Casper",
"age": 3,
"interests": [
"Other dogs"
]
},
{
"name": "Indy",
"age": 2,
"interests": [
"Butter"
]
},
{
"name": "Kira",
"age": 8,
"interests": [
"Rubs"
]
}
]
},
"resources": [],
"outputs": {
"dogsObject": {
"type": "object",
"value": "[toObject(variables('dogs'), lambda('entry', lambdaVariables('entry').name))]"
}
}
}
前の例では、配列に基づいて オブジェクトを生成します。
名前 | Type | 値 |
---|---|---|
dogsObject | Object | {"Evie":{"name":"Evie","age":5,"interests":["Ball","Frisbee"]},"Casper":{"name":"Casper","age":3,"interests":["Other dogs"]},"Indy":{"name":"Indy","age":2,"interests":["Butter"]},"Kira":{"name":"Kira","age":8,"interests":["Rubs"]}} |
3 番目のパラメーターをもつ次の toObject
関数は、同じ出力を提供します。
"outputs": {
"dogsObject": {
"type": "object",
"value": "[toObject(variables('dogs'), lambda('entry', lambdaVariables('entry').name), lambda('entry', lambdaVariables('entry')))]"
}
}
次の例は、3 つのパラメーターをもつ toObject
関数を使用する方法を示しています。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"dogs": [
{
"name": "Evie",
"properties": {
"age": 5,
"interests": [
"Ball",
"Frisbee"
]
}
},
{
"name": "Casper",
"properties": {
"age": 3,
"interests": [
"Other dogs"
]
}
},
{
"name": "Indy",
"properties": {
"age": 2,
"interests": [
"Butter"
]
}
},
{
"name": "Kira",
"properties": {
"age": 8,
"interests": [
"Rubs"
]
}
}
]
},
"resources": [],
"outputs": {
"dogsObject": {
"type": "object",
"value": "[toObject(variables('dogs'), lambda('entry', lambdaVariables('entry').name), lambda('entry', lambdaVariables('entry').properties))]"
}
}
}
前の例では、配列に基づいて オブジェクトを生成します。
名前 | Type | 値 |
---|---|---|
dogsObject | Object | {"Evie":{"age":5,"interests":["Ball","Frisbee"]},"Casper":{"age":3,"interests":["Other dogs"]},"Indy":{"age":2,"interests":["Butter"]},"Kira":{"age":8,"interests":["Rubs"]}} |
次のステップ
- その他の配列に関連するテンプレート関数については、テンプレート関数 - 配列に関する記事を参照してください。