ARM テンプレートでの条件付きデプロイ

場合によっては、Azure Resource Manager テンプレート (ARM テンプレート) でリソースをデプロイすることが必要となります。 リソースをデプロイするかどうかを指定するには、condition 要素を使用します。 この条件の値は true または false に解決されます。 値が true の場合、リソースが作成されます。 値が false の場合、リソースは作成されません。 この要素の値は、リソース全体にのみ適用できます。

注意

条件付きのデプロイは子リソースにはカスケードされません。 リソースとその子リソースを条件付きでデプロイする場合は、リソースの種類ごとに同じ条件を適用する必要があります。

ヒント

ARM テンプレートと同じ機能を備え、構文も使いやすいため、Bicep をお勧めします。 詳しくは、「 条件付きのデプロイ」をご覧ください。

デプロイの条件

リソースをデプロイするかどうかを示すパラメーター値を渡すことができます。 次の例では、DNS ゾーンを条件付きでデプロイします。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "deployZone": {
      "type": "bool"
    }
  },
  "functions": [],
  "resources": [
    {
      "condition": "[parameters('deployZone')]",
      "type": "Microsoft.Network/dnsZones",
      "apiVersion": "2018-05-01",
      "name": "myZone",
      "location": "global"
    }
  ]
}

より複雑な例については、「Azure SQL 論理サーバー」を参照してください。

新規または既存のリソース

条件付きデプロイを使用して、新しいリソースを作成したり、既存のリソースを使用したりすることができます。 次の例は、新しいストレージ アカウントをデプロイするか、または既存のストレージ アカウントを使用する方法を示しています。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageAccountName": {
      "type": "string"
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    },
    "newOrExisting": {
      "type": "string",
      "defaultValue": "new",
      "allowedValues": [
        "new",
        "existing"
      ]
    }
  },
  "resources": [
    {
      "condition": "[equals(parameters('newOrExisting'), 'new')]",
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-09-01",
      "name": "[parameters('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "StorageV2"
    },
    {
      "condition": "[equals(parameters('newOrExisting'), 'existing')]",
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-09-01",
      "name": "[parameters('storageAccountName')]"
    }
  ],
  "outputs": {
    "storageAccountId": {
      "type": "string",
      "value": "[if(equals(parameters('newOrExisting'), 'new'), resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')))]"
    }
  }
}

パラメーター newOrExistingnew に設定されると、その条件は true に評価されます。 ストレージ アカウントはデプロイされます。 そうでない場合は、既存のストレージ アカウントが使用されます。

condition 要素を使用する完全なテンプレート例については、新規または既存の仮想ネットワーク、ストレージ、およびパブリック IP を使用する VM に関するページを参照してください。

ランタイム関数

条件付きでデプロイされるリソースで reference または list 関数を使用した場合、この関数はリソースがデプロイされていなくても評価されます。 この関数が存在しないリソースを参照する場合、エラーが返されます。

リソースがデプロイされるときにのみ条件に対してこの関数が評価されるようにするには、if 関数を使用します。 条件付きでデプロイされるリソースで ifreference を使用するサンプル テンプレートについては、if 関数に関するページを参照してください。

他のリソースと同じように、条件付きリソースにる依存するリソースとして設定します。 条件付きリソースがデプロイされていない場合、Azure Resource Manager によって必要な依存関係からそれが自動的に削除されます。

完全モード

完全モードでテンプレートをデプロイし、condition が false に評価されるためにリソースがデプロイされない場合は、テンプレートをデプロイするためにどの REST API バージョンを使用するかによって結果が異なります。 2019-05-10 より前のバージョンを使用する場合、リソースは削除されません。 2019-05-10 以降では、リソースは削除されます。 最新バージョンの Azure PowerShell および Azure CLI では、condition が false の場合、リソースが削除されます。

次のステップ