Azure リソース マネージャーのテンプレートの作成

このトピックでは、Azure Resource Manager テンプレートの構造について説明します。 テンプレートの各種セクションとそこで使用できるプロパティを紹介しています。 テンプレートは、JSON、およびデプロイの値を構築するときの式で構成されます。

既にデプロイしているリソースのテンプレートを表示するには、「既存のリソースから Azure Resource Manager テンプレートをエクスポートする」をご覧ください。 テンプレートの作成に関するガイダンスについては、「 Resource Manager テンプレートのチュートリアル」をご覧ください。 テンプレート作成の推奨事項については、「 Azure Resource Manager テンプレートを作成するためのベスト プラクティス」を参照してください。

テンプレートを作成する作業は、適切な JSON エディターを使用することで省力化できます。 テンプレートでの Visual Studio の使用の詳細については、「 Visual Studio での Azure リソース グループの作成とデプロイ」を参照してください。 VS Code の使用については、「 Visual Studio Code で Azure Resource Manager テンプレートを操作する」を参照してください。

テンプレートのサイズを 1 MB に、各パラメーター ファイルのサイズを 64 KB に制限します。 1 MB の制限は、反復的なリソースの定義と変数およびパラメーターの値で拡張された後のテンプレートの最終的な状態に適用されます。

テンプレートの形式

最も単純な構造のテンプレートは、次の要素で構成されます。

{
   "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
   "contentVersion": "",
   "parameters": {  },
   "variables": {  },
   "resources": [  ],
   "outputs": {  }
}

| 要素名

必須 説明
$schema はい
contentVersion はい
parameters いいえ
variables いいえ
resources はい
outputs いいえ

テンプレートのセクションについては、後で詳しく説明します。

式と関数

テンプレートの基本的な構文は JSON です。 ただし、式や関数により、テンプレートで使用できる JSON が拡張されます。 式を使用すると、厳密なリテラル値以外の値を作成できます。 式は角かっこ ([]) で囲まれ、テンプレートがデプロイされるときに評価されます。 式は、JSON 文字列値内の任意の場所に配置でき、常に別の JSON 値を返します。 角かっこ [ で始まるリテラル文字列を使用する必要がある場合は、2 つの角かっこ [[ を使用する必要があります。

通常、関数と式を使用してデプロイを構成する操作を実行します。 JavaScript の場合と同様に、関数呼び出しは functionName(arg1,arg2,arg3)という形式になります。 プロパティの参照には、ドットと [index] 演算子を使用します。

次の例では、値を構築する際にいくつかの関数を使用する方法を示します。

"variables": {
   "location": "[resourceGroup().location]",
   "usernameAndPassword": "[concat(parameters('username'), ':', parameters('password'))]",
   "authorizationHeader": "[concat('Basic ', base64(variables('usernameAndPassword')))]"
}

テンプレート関数の完全一覧が必要な場合、「 Azure リソース マネージャーのテンプレートの関数」を参照してください。

parameters

テンプレートの parameters セクションでは、リソースをデプロイするときにどのような値を入力できるかを指定します。 特定の環境 (開発、テスト、運用など) に合った値をパラメーターに渡すことで、デプロイをカスタマイズすることができます。 テンプレートでは必ずしもパラメーターを使用する必要はありませんが、パラメーターを使わなかった場合、常に同じリソースが同じ名前、同じ場所、同じプロパティでデプロイされます。

テンプレート全体でこれらのパラメーター値を使用して、デプロイ済みのリソースに値を設定できます。 テンプレートの他のセクションで使用できるのは、パラメーター セクションで宣言されるパラメーターだけです。

次の構造でパラメーターを定義します。

"parameters": {
   "<parameter-name>" : {
     "type" : "<type-of-parameter-value>",
     "defaultValue": "<default-value-of-parameter>",
     "allowedValues": [ "<array-of-allowed-values>" ],
     "minValue": <minimum-value-for-int>,
     "maxValue": <maximum-value-for-int>,
     "minLength": <minimum-length-for-string-or-array>,
     "maxLength": <maximum-length-for-string-or-array-parameters>,
     "metadata": {
         "description": "<description-of-the parameter>" 
     }
   }
}

| 要素名

必須 Description
parameterName はい
type はい
defaultValue いいえ
allowedValues いいえ
minValue いいえ
maxValue いいえ
minLength いいえ
maxLength いいえ
description なし

使用できる型と値は次のとおりです。

  • string
  • secureString
  • int
  • bool
  • object
  • secureObject
  • array

パラメーターを省略可能に指定するには、defaultValue を設定します (空の文字列を指定できます)。

コマンドのパラメーターと同じ名前のパラメーターをテンプレートで指定して、そのテンプレートをデプロイすると、指定する値があいまいになる可能性があります。 Resource Manager では、接尾辞 FromTemplate をテンプレート パラメーターに追加することで、このような混乱を防ぎます。 たとえば、ResourceGroupName という名前のパラメーターをテンプレートに追加した場合、このパラメーターは、New-AzureRmResourceGroupDeployment コマンドレットの ResourceGroupName パラメーターと競合するため、 デプロイ中、ResourceGroupNameFromTemplate に値を指定するように求められます。 一般的に、このような混乱を防ぐために、デプロイ処理に使用したパラメーターと同じ名前をパラメーターに付けないことが推奨されます。

メモ

すべてのパスワード、キー、およびその他のシークレットでは、 secureString 型を使用する必要があります。 JSON オブジェクトに機密データを渡す場合は、secureObject 型を使用します。 secureString 型または secureObject 型を含むテンプレート パラメーターをリソースのデプロイ後に読み取ることはできません。

たとえば、デプロイ履歴の次のエントリには文字列とオブジェクトの値が表示されますが、secureString と secureObject の値は表示されません。

デプロイの値の表示

次の例では、パラメーターを定義する方法を示します。

"parameters": {
  "siteName": {
    "type": "string",
    "defaultValue": "[concat('site', uniqueString(resourceGroup().id))]"
  },
  "hostingPlanName": {
    "type": "string",
    "defaultValue": "[concat(parameters('siteName'),'-plan')]"
  },
  "skuName": {
    "type": "string",
    "defaultValue": "F1",
    "allowedValues": [
      "F1",
      "D1",
      "B1",
      "B2",
      "B3",
      "S1",
      "S2",
      "S3",
      "P1",
      "P2",
      "P3",
      "P4"
    ]
  },
  "skuCapacity": {
    "type": "int",
    "defaultValue": 1,
    "minValue": 1
  }
}

デプロイ時にパラメーター値を入力する方法については、 Azure Resource Manager テンプレートを使用したリソースのデプロイに関するページをご覧ください。

variables

テンプレート内で使用できる値は、variables セクションで構築します。 通常、変数は、パラメーターから提供される値に基づきます。 必ずしも変数を定義する必要はありませんが、変数を定義することによって複雑な式が減り、テンプレートが単純化されることはよくあります。

変数は、次の構造で定義します。

"variables": {
   "<variable-name>": "<variable-value>",
   "<variable-name>": { 
       <variable-complex-type-value> 
   }
}

次の例では、2 つのパラメーター値で構成される変数の定義方法を示しています。

"variables": {
    "connectionString": "[concat('Name=', parameters('username'), ';Password=', parameters('password'))]"
}

次の例では、複雑な JSON 型である変数と、その他の変数で構成される変数を示します。

"parameters": {
   "environmentName": {
     "type": "string",
     "allowedValues": [
       "test",
       "prod"
     ]
   }
},
"variables": {
   "environmentSettings": {
     "test": {
       "instancesSize": "Small",
       "instancesCount": 1
     },
     "prod": {
       "instancesSize": "Large",
       "instancesCount": 4
     }
   },
   "currentEnvironmentSettings": "[variables('environmentSettings')[parameters('environmentName')]]",
   "instancesSize": "[variables('currentEnvironmentSettings').instancesSize]",
   "instancesCount": "[variables('currentEnvironmentSettings').instancesCount]"
}

リソース

resources セクションでは、デプロイまたは更新されるリソースを定義します。 このセクションは、複雑になりやすい部分です。適切な値を指定するためには、デプロイするリソースの種類を理解している必要があるためです。

リソースは、次の構造で定義します。

"resources": [
   {
     "apiVersion": "<api-version-of-resource>",
     "type": "<resource-provider-namespace/resource-type-name>",
     "name": "<name-of-the-resource>",
     "location": "<location-of-resource>",
     "tags": "<name-value-pairs-for-resource-tagging>",
     "comments": "<your-reference-notes>",
     "dependsOn": [
       "<array-of-related-resource-names>"
     ],
     "properties": "<settings-for-the-resource>",
     "copy": {
       "name": "<name-of-copy-loop>",
       "count": "<number-of-iterations>"
     },
     "resources": [
       "<array-of-child-resources>"
     ]
   }
]

| 要素名

必須 説明
apiVersion はい
type はい
name はい
location 多様
tags いいえ
コメント いいえ
dependsOn なし
properties いいえ
copy いいえ
resources いいえ

apiVersiontypelocation に指定する値は、すぐには分かりません。 さいわいなことに、Azure PowerShell または Azure CLI からこれらの値を特定できます。

PowerShell ですべてのリソース プロバイダーを取得するには、次を使用します。

Get-AzureRmResourceProvider -ListAvailable

返された一覧から、目的のリソース プロバイダーを見つけます。 リソース プロバイダー (ストレージなど) のリソースの種類を取得するには、次を使用します。

(Get-AzureRmResourceProvider -ProviderNamespace Microsoft.Storage).ResourceTypes

リソースの種類 (ストレージ アカウントなど) の API バージョンを取得するには、次を使用します。

((Get-AzureRmResourceProvider -ProviderNamespace Microsoft.Storage).ResourceTypes | Where-Object ResourceTypeName -eq storageAccounts).ApiVersions

リソースの種類のサポートされている場所を取得するには、次を使用します。

((Get-AzureRmResourceProvider -ProviderNamespace Microsoft.Storage).ResourceTypes | Where-Object ResourceTypeName -eq storageAccounts).Locations

Azure CLI ですべてのリソース プロバイダーを取得するには、次を使用します。

azure provider list

返された一覧から、目的のリソース プロバイダーを見つけます。 リソース プロバイダー (ストレージなど) のリソースの種類を取得するには、次を使用します。

azure provider show Microsoft.Storage

サポートされている場所と API のバージョンを取得するには、次を使用します。

azure provider show Microsoft.Storage --details --json

リソース プロバイダーの詳細については、Resource Manager のプロバイダー、リージョン、API のバージョン、およびスキーマに関するページをご覧ください。

resources セクションには、デプロイの対象となる一連のリソースが記述されます。 また、リソースごとに子リソースを複数定義することができます。 その場合、resources セクションは次のような構造となります。

"resources": [
   {
       "name": "resourceA",
   },
   {
       "name": "resourceB",
       "resources": [
           {
               "name": "firstChildResourceB",
           },
           {   
               "name": "secondChildResourceB",
           }
       ]
   },
   {
       "name": "resourceC",
   }
]

次の例では、Microsoft.Web/serverfarms リソースと、入れ子になった Extensions リソースを含む Microsoft.Web/sites リソースを示しています。 サイトがサーバー ファームに依存するリソースとして指定されている点に注意してください。これは、サーバー ファームが存在して初めてサイトをデプロイできるためです。 また、Extensions リソースがサイトの子になっている点にも注意してください。

"resources": [
  {
    "apiVersion": "2015-08-01",
    "name": "[parameters('hostingPlanName')]",
    "type": "Microsoft.Web/serverfarms",
    "location": "[resourceGroup().location]",
    "tags": {
      "displayName": "HostingPlan"
    },
    "sku": {
      "name": "[parameters('skuName')]",
      "capacity": "[parameters('skuCapacity')]"
    },
    "properties": {
      "name": "[parameters('hostingPlanName')]",
      "numberOfWorkers": 1
    }
  },
  {
    "apiVersion": "2015-08-01",
    "type": "Microsoft.Web/sites",
    "name": "[parameters('siteName')]",
    "location": "[resourceGroup().location]",
    "tags": {
      "environment": "test",
      "team": "Web"
    },
    "dependsOn": [
      "[concat(parameters('hostingPlanName'))]"
    ],
    "properties": {
      "name": "[parameters('siteName')]",
      "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]"
    },
    "resources": [
      {
        "apiVersion": "2015-08-01",
        "type": "extensions",
        "name": "MSDeploy",
        "dependsOn": [
          "[concat('Microsoft.Web/sites/', parameters('siteName'))]"
        ],
        "properties": {
          "packageUri": "https://auxmktplceprod.blob.core.windows.net/packages/StarterSite-modified.zip",
          "dbType": "None",
          "connectionString": "",
          "setParameters": {
            "Application Path": "[parameters('siteName')]"
          }
        }
      }
    ]
  }
]

出力

[出力] セクションではデプロイから返される値を指定します。 たとえば、デプロイされたリソースにアクセスするための URI を返すことができます。

次の例では、出力の定義の構造を示します。

"outputs": {
   "<outputName>" : {
     "type" : "<type-of-output-value>",
     "value": "<output-value-expression>"
   }
}

| 要素名

必須 説明
outputName はい
type はい
はい

次の例では、outputs セクションで返される値を示します。

"outputs": {
   "siteUri" : {
     "type" : "string",
     "value": "[concat('http://',reference(resourceId('Microsoft.Web/sites', parameters('siteName'))).hostNames[0])]"
   }
}

出力を操作する方法の詳細については、「 Azure Resource Manager のテンプレートでの状態の共有」をご覧ください。

次のステップ