Azure Resource Manager テンプレートでのリソース デプロイ順序の定義Define the order for deploying resources in Azure Resource Manager Templates

リソースによっては、デプロイする前に、他のリソースが存在している必要がある場合があります。For a given resource, there can be other resources that must exist before the resource is deployed. たとえば、SQL データベースをデプロイするには、先に SQL Server が存在している必要があります。For example, a SQL server must exist before attempting to deploy a SQL database. このリレーションシップは、一方のリソースがもう一方のリソースに依存しているとマークすることで定義します。You define this relationship by marking one resource as dependent on the other resource. 依存関係を定義するには、dependsOn 要素または reference 関数を使用します。You define a dependency with the dependsOn element, or by using the reference function.

Resource Manager により、リソース間の依存関係が評価され、リソースは依存する順にデプロイされます。Resource Manager evaluates the dependencies between resources, and deploys them in their dependent order. 相互依存していないリソースは、平行してデプロイされます。When resources aren't dependent on each other, Resource Manager deploys them in parallel. 同じテンプレートでデプロイされるリソースの依存関係だけを定義する必要があります。You only need to define dependencies for resources that are deployed in the same template.

チュートリアルについては、「チュートリアル: 依存リソースを含む Azure Resource Manager テンプレートを作成する」を参照してください。For a tutorial, see Tutorial: create Azure Resource Manager templates with dependent resources.

dependsOndependsOn

テンプレート内で dependsOn 要素を使用すると、1 つのリソースが 1 つ以上のリソースに依存していることを定義できます。Within your template, the dependsOn element enables you to define one resource as a dependent on one or more resources. その値には、リソース名のコンマ区切りリストを指定できます。Its value can be a comma-separated list of resource names.

次の例では、ロード バランサー、仮想ネットワーク、および複数のストレージ アカウントを作成するループに依存する仮想マシン スケール セットを示します。The following example shows a virtual machine scale set that depends on a load balancer, virtual network, and a loop that creates multiple storage accounts. こうした他のリソースは、次の例には示されていませんが、テンプレートの他の場所に存在する必要があります。These other resources aren't shown in the following example, but they would need to exist elsewhere in the template.

{
  "type": "Microsoft.Compute/virtualMachineScaleSets",
  "name": "[variables('namingInfix')]",
  "location": "[variables('location')]",
  "apiVersion": "2016-03-30",
  "tags": {
    "displayName": "VMScaleSet"
  },
  "dependsOn": [
    "[variables('loadBalancerName')]",
    "[variables('virtualNetworkName')]",
    "storageLoop",
  ],
  ...
}

前の例では、依存関係は storageLoop という名前のコピー ループを通じて作成されたリソースにのみ含まれます。In the preceding example, a dependency is included on the resources that are created through a copy loop named storageLoop. 例が必要であれば、「 Azure リソース マネージャーでリソースの複数のインスタンスを作成する」を参照してください。For an example, see Create multiple instances of resources in Azure Resource Manager.

依存関係を定義するときに、あいまいにならないように、リソースプロバイダーの名前空間とリソースの種類を含めることができます。When defining dependencies, you can include the resource provider namespace and resource type to avoid ambiguity. たとえば、他のリソースと同じ名前を持つロード バランサーと仮想ネットワークを明確にするには、次の形式を使用します。For example, to clarify a load balancer and virtual network that may have the same names as other resources, use the following format:

"dependsOn": [
  "[resourceId('Microsoft.Network/loadBalancers', variables('loadBalancerName'))]",
  "[resourceId('Microsoft.Network/virtualNetworks', variables('virtualNetworkName'))]"
]

dependsOn を使用してリソース間のリレーションシップをマップする傾向があるものの、重要なのは、その操作を行う理由を理解することです。While you may be inclined to use dependsOn to map relationships between your resources, it's important to understand why you're doing it. たとえば、リソースが相互にどのように接続されているかをドキュメント化するには、dependsOn は適切な方法ではありません。For example, to document how resources are interconnected, dependsOn isn't the right approach. どのリソースが dependsOn 要素で定義されたかを、デプロイ後に照会することはできません。You can't query which resources were defined in the dependsOn element after deployment. Resource Manager では、依存関係のある 2 つのリソースが並列でデプロイされないため、dependsOn を使用すると、デプロイ時間に影響を及ぼす可能性があります。By using dependsOn, you potentially impact deployment time because Resource Manager doesn't deploy in parallel two resources that have a dependency.

子リソースChild resources

resources プロパティを使用すると、定義されているリソースに関連する子リソースを指定できます。The resources property allows you to specify child resources that are related to the resource being defined. 子リソースの定義の深さは 5 レベルまでです。Child resources can only be defined five levels deep. 重要なのは、子リソースと親リソースの間に暗黙的なデプロイの依存関係を作成しないことです。It's important to note that an implicit deployment dependency isn't created between a child resource and the parent resource. 親リソースの後に子リソースをデプロイする必要がある場合は、dependsOn プロパティを使用してその依存関係を明示的に指定する必要があります。If you need the child resource to be deployed after the parent resource, you must explicitly state that dependency with the dependsOn property.

各親リソースは、子リソースとして特定のリソースの種類のみを受け取ります。Each parent resource accepts only certain resource types as child resources. 許容されるリソースの種類は、親リソースのテンプレート スキーマで指定されます。The accepted resource types are specified in the template schema of the parent resource. 子リソースの種類の名前には、親リソースの種類の名前 (Microsoft.Web/sites/configMicrosoft.Web/sites/extensions など。これは両方とも Microsoft.Web/sites の子リソース)。The name of child resource type includes the name of the parent resource type, such as Microsoft.Web/sites/config and Microsoft.Web/sites/extensions are both child resources of the Microsoft.Web/sites.

次の例では、SQL Server と SQL データベースを示します。The following example shows a SQL server and SQL database. データベースが SQL Server の子である場合でも、SQL データベースと SQL Server の間に明示的な依存関係が定義されることに注目してください。Notice that an explicit dependency is defined between the SQL database and SQL server, even though the database is a child of the server.

"resources": [
  {
    "name": "[variables('sqlserverName')]",
    "type": "Microsoft.Sql/servers",
    "location": "[resourceGroup().location]",
    "tags": {
      "displayName": "SqlServer"
    },
    "apiVersion": "2014-04-01-preview",
    "properties": {
      "administratorLogin": "[parameters('administratorLogin')]",
      "administratorLoginPassword": "[parameters('administratorLoginPassword')]"
    },
    "resources": [
      {
        "name": "[parameters('databaseName')]",
        "type": "databases",
        "location": "[resourceGroup().location]",
        "tags": {
          "displayName": "Database"
        },
        "apiVersion": "2014-04-01-preview",
        "dependsOn": [
          "[variables('sqlserverName')]"
        ],
        "properties": {
          "edition": "[parameters('edition')]",
          "collation": "[parameters('collation')]",
          "maxSizeBytes": "[parameters('maxSizeBytes')]",
          "requestedServiceObjectiveName": "[parameters('requestedServiceObjectiveName')]"
        }
      }
    ]
  }
]

reference 関数と list 関数reference and list functions

reference 関数 を使用すると、式では、他の JSON の名前と値のペアまたはランタイム リソースからその値を導出することができます。The reference function enables an expression to derive its value from other JSON name and value pairs or runtime resources. list* 関数はリスト操作からリソースの値を返します。The list* functions return values for a resource from a list operation. reference 式と list 式は、参照されているリソースが同じテンプレート内でデプロイされ、(リソース ID ではなく) 名前によって参照されていると、あるリソースが他のリソースに依存することを暗黙的に宣言します。Reference and list expressions implicitly declare that one resource depends on another, when the referenced resource is deployed in the same template and referred to by its name (not resource ID). reference 関数または list 関数にリソース ID を渡す場合は、暗黙的な参照は作成されません。If you pass the resource ID into the reference or list functions, an implicit reference isn't created.

reference 関数の一般的な形式は次のとおりです。The general format of the reference function is:

reference('resourceName').propertyPath

listKeys 関数の一般的な形式は次のとおりです。The general format of the listKeys function is:

listKeys('resourceName', 'yyyy-mm-dd')

次の例の CDN エンドポイントは CDN プロファイルに明示的に依存し、Web アプリに暗黙的に依存しています。In the following example, a CDN endpoint explicitly depends on the CDN profile, and implicitly depends on a web app.

{
    "name": "[variables('endpointName')]",
    "type": "endpoints",
    "location": "[resourceGroup().location]",
    "apiVersion": "2016-04-02",
    "dependsOn": [
            "[variables('profileName')]"
    ],
    "properties": {
        "originHostHeader": "[reference(variables('webAppName')).hostNames[0]]",
        ...
    }

この要素または dependsOn 要素のいずれかを使用して依存関係を指定できますが、同じ依存リソースに両方の要素を使用する必要はありません。You can use either this element or the dependsOn element to specify dependencies, but you don't need to use both for the same dependent resource. 不要な依存関係が追加されないように、できる限り、暗黙的な参照を使用してください。Whenever possible, use an implicit reference to avoid adding an unnecessary dependency.

詳細については、「 reference 関数」を参照してください。To learn more, see reference function.

循環依存関係Circular dependencies

Resource Manager では、テンプレートの検証中に循環依存関係を識別します。Resource Manager identifies circular dependencies during template validation. 循環依存関係が存在することを示すエラーが発生した場合は、テンプレートを評価して、削除できる不要な依存関係がないかどうかを確認します。If you receive an error stating that a circular dependency exists, evaluate your template to see if any dependencies aren't needed and can be removed. 依存関係を削除してもエラーが解消されない場合は、循環依存関係が含まれるリソースの後にデプロイされている子リソースに対するデプロイ操作を移動すると、循環依存関係を回避できることがあります。If removing dependencies doesn't work, you can avoid circular dependencies by moving some deployment operations into child resources that are deployed after the resources that have the circular dependency. たとえば、2 つの仮想マシンをデプロイする場合を考えてみます。それぞれ互いに参照するプロパティを設定する必要があるとします。For example, suppose you're deploying two virtual machines but you must set properties on each one that refer to the other. この仮想マシンは、次の順序でデプロイできます。You can deploy them in the following order:

  1. vm1vm1
  2. vm2vm2
  3. vm1 の拡張機能は vm1 と vm2 に依存します。Extension on vm1 depends on vm1 and vm2. 拡張機能は vm2 から取得した値を vm1 に設定します。The extension sets values on vm1 that it gets from vm2.
  4. vm2 の拡張機能は vm1 と vm2 に依存します。Extension on vm2 depends on vm1 and vm2. 拡張機能は vm1 から取得した値を vm2 に設定します。The extension sets values on vm2 that it gets from vm1.

デプロイ順序の評価と依存関係のエラーの解決については、「Azure Resource Manager を使用した Azure へのデプロイで発生する一般的なエラーのトラブルシューティング」を参照してください。For information about assessing the deployment order and resolving dependency errors, see Troubleshoot common Azure deployment errors with Azure Resource Manager.

次の手順Next steps