依存関係を指定することによりデプロイの順序を制御する

完了

たとえば、別のリソースが既にデプロイされている場合にだけ、あるリソースのセットを Azure にデプロイしたいとします。 その場合、あるリソースが別のリソースに依存していることを、テンプレートで伝える必要があります。

考慮すべきいくつかの点を次に示します。

  • 何かをデプロイするには、その前に別のものが存在している必要がある。

    たとえば、仮想マシン (VM) に読み込む必要のあるシークレットをフェッチするために、Azure Key Vault にキー コンテナーが必要であるとします。 キー コンテナーをデプロイするときに、同じテンプレート内でそのシークレットを同時にデプロイできます。 しかし、そのシークレットより前にキー コンテナーがデプロイされる必要があります。 そのため、シークレットは、キー コンテナーが存在することに "依存します"。 キー コンテナーとシークレットは、依存関係のために、キー コンテナーから先に順番に 1 つずつデプロイされます。

  • Azure Resource Manager での処理方法に依存することはできるか

    別のリソースが存在するかどうかを確認する場合に最初に考えるのは、Azure PowerShell または Azure CLI を使用してリソースの存在を調べることです。 さらに自動化されたソリューションとしては、Resource Manager に組み込まれているべき等性を使用します。 Resource Manager により、クラウド内に既に存在するテンプレートで定義されているリソースが検出された場合、それは再デプロイされません。 これを有効な方法にするには、Resource Manager によってチェックが行われる方法を理解する必要があります。

    Note

    既存のリソース ID がテンプレートに定義されているものと一致した場合は、Azure Resource Manager によってプロパティが比較されます。 プロパティが完全に一致すると、リソースはそのまま残されます。 そうでない場合は、エンジンによって変更が行われ、リソースが再デプロイされる可能性があります。

  • リソースを別のリソース内に入れ子にすることができる。

    Azure Resource Manager テンプレートでは、リソースを別のリソース内に入れ子にすることができます。 リソースを入れ子にすることによって、入れ子にされたリソースと親リソースの間の関係を定義します。

Azure リソース間の依存関係を定義する方法

たとえば、あるリソース (ストレージ アカウントなど) が、それを必要とするリソースの前に確実にデプロイされるようにしたいとします。 依存ストレージ アカウントが存在するかどうかは、どうすれば確認できるでしょうか。

最初に、Azure PowerShell や Azure CLI のコマンドを実行してストレージ アカウントの存在を確認することにより、デプロイの現在の状態を調べることができます。 また、Resource Manager に同じチェックを実行できるコンストラクトがあるかどうかを確認することもできます。

Resource Manager テンプレートにはそのようなコンストラクトがあり、dependsOn と呼ばれます。 このコンストラクトを使用すると、指定したリソースのデプロイが完了するまで、リソースは待機するようになります。

dependsOn コンストラクトとは

キーと値のペアであり、リソース間のデプロイ順序を定義できます。 場合によっては、何かが他のものの前に必ず存在するようにする必要があります。 たとえば、アプリの前にデータベースが存在している必要がある場合や、キー コンテナーの前にシークレット リソースが存在している必要がある場合があります。

他のリソースが最初にデプロイされることに依存するリソースに、dependsOn コンストラクトを配置します。 1 つのリソースが複数のリソースに依存している可能性があるため、コンストラクトの値には依存リソースのリストが想定されています。

次の例は、ARM テンプレート内の JSON でこのような依存関係を表現する方法を示しています。

"resources": [
  {
    "name": "<name of resource that needs to exist first>"
  },
  {
    "name": "someResource",
    "dependsOn": [
      "<name of resource that needs to exist first>"
    ]
  }
]

この例では、リソースの名前を使用して、依存するリソースを指定しています。 しかし、多くのリソースが同じ名前を持つ場合があります。 この比較が確実に意図したとおりに行われるようにするには、代わりに resourceId() コンストラクトを使用して、一意のリソース識別子を取得できます。

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

上記の JSON コードを使用すると、名前空間、型、変数名の組み合わせによって、一意の ID が作成されます。 このようにして、正しい依存リソースが確実に指定されるようにします。

子リソースとは

子リソースは、別のリソースのコンテキスト内にのみ存在するリソースです。 たとえば、仮想マシン拡張機能は、仮想マシンがないと存在できません。

テンプレートでの親子関係の一般的なコードはこのようになります。

"resources": [
  {
    "name": "parent-resource",
    "resources": [{
      "name": "child-resource"
    }]
  }
]

この親子依存関係により、親がその子より前にデプロイされる依存関係が自動的に作成されることはありません。 依存関係を明示的に作成する必要があります。

そのため、そのような関係を表現するときは、次のように dependsOn コンストラクトを必ず追加してください。

"resources": [
  {
    "name": "parent-resource",
    "resources": [{
      "dependsOn": ["parent-resource"],
      "name": "child resource"
    }]
  }
]