ARM テンプレートでのリソースの宣言

Azure Resource Manager テンプレート (ARM テンプレート) を使用してリソースをデプロイするには、リソース宣言を追加します。 JSON テンプレート内で resources 配列を使用します。

languageVersion 2.0 では、リソース宣言を配列から オブジェクトに変更するなど、ARM JSON テンプレートの機能強化の一覧が作成されます。 この記事で示しているほとんどのサンプルでは、引き続き resources 配列を使用しています。 languageVersion 2.0 固有の情報については、シンボリック名を使用する を参照してください。

Note

Visual Studio Code 用 Azure Resource Manager Tools 拡張機能の現在のリリースでは、languageVersion 2.0 で行われた拡張機能は認識されません。

ヒント

ARM テンプレートと同じ機能を備え、構文も使いやすいため、Bicep をお勧めします。 詳細については、「リソース宣言」を参照してください。

テンプレート内のリソースは 800 個に制限されています。 詳細については、「テンプレートの制限」を参照してください。

リソースの種類とバージョンの設定

テンプレートにリソースを追加する際には、まずリソースの種類と API バージョンを設定します。 これらの値によって、リソースで使用できるその他のプロパティが決まります。

次の例は、ストレージ アカウントのリソースの種類と API バージョンを設定する方法を示したものです。 この例は、リソース宣言の内容を完全に示したものではありません。

"resources": [
  {
    "type": "Microsoft.Storage/storageAccounts",
    "apiVersion": "2019-06-01",
    ...
  }
]

リソース名を設定する

各リソースには名前があります。 リソース名を設定する際には、リソース名の規則と制限事項に注意してください。

"parameters": {
  "storageAccountName": {
    "type": "string",
    "minLength": 3,
    "maxLength": 24
  }
},
"resources": [
  {
    "type": "Microsoft.Storage/storageAccounts",
    "apiVersion": "2019-06-01",
    "name": "[parameters('storageAccountName')]",
    ...
  }
]

場所の設定

多くのリソースには場所が必要です。 リソースに場所が必要かどうかは、Intellisense またはテンプレート参照を使用して判断できます。 次の例では、ストレージ アカウントに使用される location パラメーターを追加しています。

"parameters": {
  "storageAccountName": {
    "type": "string",
    "minLength": 3,
    "maxLength": 24
  },
  "location": {
    "type": "string",
    "defaultValue": "[resourceGroup().location]"
  }
},
"resources": [
  {
    "type": "Microsoft.Storage/storageAccounts",
    "apiVersion": "2019-06-01",
    "name": "[parameters('storageAccountName')]",
    "location": "[parameters('location')]",
    ...
  }
]

詳細については、「ARM テンプレートでリソースの場所を設定する」を参照してください。

タグを設定する

デプロイ時には、リソースにタグを適用することができます。 タグは、デプロイされたリソースを論理的に整理するために役立ちます。 タグを指定するさまざまな方法の例については、ARM テンプレートのタグに関する記事を参照してください。

リソース固有のプロパティを設定する

上記のプロパティは、ほとんどの種類のリソースに共通するものです。 これらの値を設定した後、デプロイするリソースの種類に固有のプロパティを設定する必要があります。

使用可能なプロパティと必要なプロパティを特定するには、Intellisense またはテンプレート参照を使用します。 次の例では、ストレージ アカウントの残りのプロパティを設定しています。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageAccountName": {
      "type": "string",
      "minLength": 3,
      "maxLength": 24
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    }
  },
  "functions": [],
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2019-06-01",
      "name": "[parameters('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS",
        "tier": "Standard"
      },
      "kind": "StorageV2",
      "properties": {
        "accessTier": "Hot"
      }
    }
  ]
}

シンボリック名を使用する

Bicep では、各リソース定義にシンボリック名があります。 シンボリック名は、Bicep ファイルの他の部分からリソースを参照するために使用されます。 ARM JSON テンプレートで シンボリック名をサポートするには、バージョン 2.0 以降で languageVersion を追加し、リソース定義を配列からオブジェクトに変更します。 テンプレートに languageVersion が指定されている場合は、ルート レベルのリソースにシンボリック名を指定する必要があります。 次に例を示します。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.ContainerService/managedClusters",
      ...
    }
  ]
}

上記の JSON は、次の JSON に書き込むことができます:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "languageVersion": "2.0",
  "contentVersion": "1.0.0.0",
  "resources": {
    "aks": {
      "type": "Microsoft.ContainerService/managedClusters",
      ...
    }
  }
}

シンボリック名は大文字と小文字が区別されます。 シンボリック名に使用できる文字は、文字、数字、および _ です。 シンボリック名はテンプレート内で一意である必要がありますが、テンプレート内の変数名、パラメーター名、出力名と重複する可能性があります。 次の例では、ストレージ アカウント リソースのシンボリック名の名前は出力と同じです。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "languageVersion": "2.0",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageAccountName": {
      "type": "string",
      "defaultValue": "[format('storage{0}', uniqueString(resourceGroup().id))]"
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    }
  },
  "resources": {
    "myStorage": {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-09-01",
      "name": "[parameters('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "properties": {}
    }
  },
  "outputs": {
    "myStorage":{
      "type": "object",
      "value": "[reference('myStorage')]"
    }
  }
}

参照 関数では、前の例に示すように、リソースのシンボリック名を使用できます。 参照関数では、リソースの名前を使用できなくなりました。たとえば、reference(parameters('storageAccountName')) は許可されていません。

シンボリック名のデプロイで デプロイのリソース が使用されている場合は、apiVersion 2020-09-01 以降を使用します。

既存のリソースの宣言

languageVersion 2.0を使用し、リソース宣言にシンボリック名を使用すると、既存のリソースを宣言できます。 "existing": true の最上位リソース プロパティを使用すると、ARM は次の例に示すように、リソースをデプロイするのではなく、読み取りを行います:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "languageVersion": "2.0",

  "resources": {
    "storageAccount": {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-09-01",
      "name": "storageacct",
      "existing": true
    }
  },
  "outputs": {
    "saBlocksPlaintext": {
      "type": "bool",
      "value": "[ reference('storageAccount').supportsHttpsTrafficOnly]"
    }
  }
}

既存のリソースでは、typeapiVersion および name 以外のプロパティを定義する必要はありません。

次のステップ