ARM テンプレート用のラムダ関数

この記事では、ARM テンプレートで使用するラムダ関数について説明します。 ラムダ関数は、基本的に、引数として渡すことができるコードのブロックです。 これは、複数のパラメーターを取ることができますが、1 行のコードに限定されます。 Bicep では、ラムダ式は次の形式になります。

lambda(<lambda variable>, [<lambda variable>, ...], <expression>)

ヒント

ARM テンプレートと同じ機能を提供し、構文も使いやすいので、Bicep をお勧めします。 詳細については、「デプロイ関数」を参照してください。

制限事項

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" と各犬の名前を連結します。 mapArraymapArrayIndex は 、オブジェクトの別の 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"]}}

次のステップ