テンプレートをモジュール化する

完了

Azure Resource Manager テンプレートを使用する場合は、それらを個々のコンポーネントに分割してモジュール化することをお勧めします。

これを使用する主な方法として、リンクされたテンプレートを使います。

これにより、ソリューションをターゲット コンポーネントに分割し、さまざまなデプロイでそれらのいろいろな要素を再利用できます。

リンク済みテンプレート

あるテンプレートを別のテンプレートにリンクするには、デプロイ リソースをメイン テンプレートに追加します。

"resources": [
  {
      "apiVersion": "2017-05-10",
      "name": "linkedTemplate",
      "type": "Microsoft.Resources/deployments",
      "properties": {
          "mode": "Incremental",
          <link-to-external-template>
      }
  }
]


入れ子になったテンプレート

また、テンプレートをメイン テンプレート内に入れ子にし、テンプレート プロパティを使用して、テンプレートの構文を指定することもできます。

これは、モジュール化に役立ちますが、さまざまなコンポーネントを分割すると、すべての要素が 1 つのファイル内にあるため、メイン ファイルのサイズが大きくなります。

"resources": [
  {
    "apiVersion": "2017-05-10",
    "name": "nestedTemplate",
    "type": "Microsoft.Resources/deployments",
    "properties": {
      "mode": "Incremental",
      "template": {
        "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
        "contentVersion": "1.0.0.0",
        "resources": [
          {
            "type": "Microsoft.Storage/storageAccounts",
            "name": "[variables('storageName')]",
            "apiVersion": "2015-06-15",
            "location": "West US",
            "properties": {
              "accountType": "Standard_LRS"
            }
          }
        ]
      }
    }
  }
]

Note

入れ子になったテンプレートの場合、入れ子になったテンプレート自体で定義されているパラメーターや変数は使用できません。 メイン テンプレートからのパラメーターと変数のみを使用できます。

デプロイ リソースに提供するプロパティは、外部テンプレートへのリンクか、またはメイン テンプレート内のインライン テンプレートの入れ子かによって異なります。

配置モード

テンプレートを使用してリソースをデプロイする場合、次の 3 つの選択肢があります。

  • 検証。 このオプションは、テンプレートをコンパイルし、デプロイを検証して、テンプレートが機能していること (たとえば、循環依存の関係がないこと)、および、正しい構文であることを保証します。
  • 増分モード (既定)。 このオプションでは、テンプレートに定義されているものだけがデプロイされます。 テンプレートで定義されていないリソースは削除または変更されません。 たとえば、テンプレートを使用して VM をデプロイし、テンプレート内で VM の名前を変更した場合、テンプレートの再実行後も、最初にデプロイされた VM はそのまま残ります。 これは既定のモードです。
  • 完全モード: Resource Manager は、リソース グループに存在するがテンプレートで指定されていないリソースを削除します。 たとえば、テンプレートをデプロイした後、テンプレートで定義されたリソースのみがリソース グループに存在します。 ベスト プラクティスとして、運用環境でこのモードを使用して、展開テンプレートでべき等を実現します。

PowerShell を使用してデプロイする場合、配置モードを設定するには、このトピックで前述した入れ子になったテンプレートの例に従って、Mode パラメーターを使用します。

Note

ベスト プラクティスとして、デプロイごとに 1 つのリソース グループを使用します。

Note

リンクされたテンプレートと入れ子になっているテンプレートの両方で使用できるのは、incremental デプロイ モードのみです。

外部テンプレートと外部パラメーター

外部のテンプレートおよびパラメーター ファイルにリンクするには、templateLinkparametersLink を使用します。

テンプレートにリンクするときは、Resource Manager サービスがそのテンプレートに確実にアクセスできるようにします。

たとえば、ローカル ファイルまたはローカル ネットワーク上でのみ使用可能なファイルを指定することはできません。

HTTP または HTTPS を含む Uniform Resource Identifier (URI) 値のみを指定できます。

1 つの選択肢として、リンクされているテンプレートをストレージ アカウントに配置し、その項目の URI を使用する方法があります。

インラインでパラメーターを指定することもできます。 ただし、インライン パラメーターとパラメーター ファイルへのリンクの両方を使用することはできません。

次の例では、templateLink パラメーターを使用します。

  "resources": [
    {
      "name": "linkedTemplate",
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2018-05-01",
      "properties": {
          "mode": "Incremental",
          "templateLink": {
              "uri":"https://linkedtemplateek1store.blob.core.windows.net/linkedtemplates/linkedStorageAccount.json?sv=2018-03-28&sr=b&sig=dO9p7XnbhGq56BO%2BSW3o9tX7E2WUdIk%2BpF1MTK2eFfs%3D&se=2018-12-31T14%3A32%3A29Z&sp=r"
          },
          "parameters": {
              "storageAccountName":{"value": "[variables('storageAccountName')]"},
              "location":{"value": "[parameters('location')]"}
          }
      }
    },


外部テンプレートのセキュリティ保護

リンクされているテンプレートは外部で使用できる必要がありますが、一般に公開する必要はありません。

代わりに、ストレージ アカウント所有者のみがアクセスできるプライベート ストレージ アカウントにテンプレートを追加し、デプロイ時にアクセスを有効にするための Shared Access Signature (SAS) トークンを作成することができます。

リンクされたテンプレートの URI に SAS トークンを追加します。

トークンがセキュリティで保護された文字列として渡される場合でも、SAS トークンを含むリンクされているテンプレートの URI は、デプロイ操作でログに記録されます。

公開を制限するために、トークンの有効期限を設定することもできます。