Resource Manager テンプレートと Azure PowerShell を使用したリソースのデプロイDeploy resources with Resource Manager templates and Azure PowerShell

このトピックでは、Azure PowerShell と Resource Manager テンプレートを使用して Azure にリソースをデプロイする方法について説明します。This topic explains how to use Azure PowerShell with Resource Manager templates to deploy your resources to Azure. Azure ソリューションのデプロイと管理に関する概念に精通していない場合は、「Azure Resource Manager の概要」を参照してください。If you are not familiar with the concepts of deploying and managing your Azure solutions, see Azure Resource Manager overview.

デプロイする Resource Manager テンプレートとして、コンピューター上のローカル ファイル、または GitHub などのリポジトリに配置した外部ファイルを使用できます。The Resource Manager template you deploy can either be a local file on your machine, or an external file that is located in a repository like GitHub. この記事でデプロイするテンプレートは、「サンプル テンプレート」セクションから、または GitHub のストレージ アカウントのテンプレートとして入手できます。The template you deploy in this article is available in the Sample template section, or as storage account template in GitHub.

必要に応じて、Azure PowerShell ガイドの手順に従って Azure PowerShell モジュールをインストールし、Login-AzureRmAccount を実行して、Azure との接続を作成します。If needed, install the Azure PowerShell module using the instructions found in the Azure PowerShell guide, and then run Login-AzureRmAccount to create a connection with Azure. また、id_rsa.pub という名前の SSH 公開キーがユーザー プロファイルの .ssh ディレクトリに必要です。Also, you need to have an SSH public key named id_rsa.pub in the .ssh directory of your user profile.

ローカル コンピューターからテンプレートをデプロイするDeploy a template from your local machine

リソースを Azure にデプロイするときは、以下の手順に従います。When deploying resources to Azure, you:

  1. Azure アカウントへのログインLog in to your Azure account
  2. デプロイ済みのリソースのコンテナーとして機能するリソース グループを作成します。Create a resource group that serves as the container for the deployed resources. リソース グループ名には、英数字、ピリオド、アンダースコア、ハイフン、かっこのみを含めることができます。The name of the resource group can only include alphanumeric characters, periods, underscores, hyphens, and parenthesis. 最大長は 90 文字です。It can be up to 90 characters. 末尾をピリオドにすることはできません。It cannot end in a period.
  3. 作成するリソースを定義するテンプレートをリソース グループにデプロイするDeploy to the resource group the template that defines the resources to create

テンプレートには、デプロイをカスタマイズできるパラメーターを含めることができます。A template can include parameters that enable you to customize the deployment. たとえば、特定の環境 (開発、テスト、運用など) 向けにカスタマイズした値を指定できます。For example, you can provide values that are tailored for a particular environment (such as dev, test, and production). サンプル テンプレートでは、ストレージ アカウント SKU のパラメーターを定義します。The sample template defines a parameter for the storage account SKU.

次の例では、リソース グループを作成し、ローカル コンピューターからテンプレートをデプロイします。The following example creates a resource group, and deploys a template from your local machine:

Login-AzureRmAccount

Select-AzureRmSubscription -SubscriptionName <yourSubscriptionName>

New-AzureRmResourceGroup -Name ExampleResourceGroup -Location "South Central US"
New-AzureRmResourceGroupDeployment -Name ExampleDeployment -ResourceGroupName ExampleResourceGroup `
  -TemplateFile c:\MyTemplates\storage.json -storageAccountType Standard_GRS

デプロイが完了するまでに数分かかる場合があります。The deployment can take a few minutes to complete. デプロイが完了すると、次のような結果を含むメッセージが表示されます。When it finishes, you see a message that includes the result:

ProvisioningState       : Succeeded

外部ソースからテンプレートをデプロイするDeploy a template from an external source

Resource Manager テンプレートは、ローカル コンピューターに格納する代わりに、外部の場所に格納することもできます。Instead of storing Resource Manager templates on your local machine, you may prefer to store them in an external location. ソース管理リポジトリ (GitHub など) にテンプレートを格納できます。You can store templates in a source control repository (such as GitHub). または、組織内の共有アクセス用の Azure ストレージ アカウントに格納することができます。Or, you can store them in an Azure storage account for shared access in your organization.

外部テンプレートをデプロイするには、TemplateUri パラメーターを使用します。To deploy an external template, use the TemplateUri parameter. この例の URI を使用して、GitHub のサンプル テンプレートをデプロイします。Use the URI in the example to deploy the sample template from GitHub.

New-AzureRmResourceGroupDeployment -Name ExampleDeployment -ResourceGroupName ExampleResourceGroup `
  -TemplateUri https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/101-storage-account-create/azuredeploy.json `
  -storageAccountType Standard_GRS

前の例では、テンプレートにはパブリックにアクセスできる URI が必要になります。テンプレートに機密データを含めてはいけないため、この方法は多くの場合に利用できます。The preceding example requires a publicly accessible URI for the template, which works for most scenarios because your template should not include sensitive data. 機密データ (管理者パスワードなど) を指定する必要がある場合は、セキュリティで保護されたパラメーターとしてその値を渡します。If you need to specify sensitive data (like an admin password), pass that value as a secure parameter. ただし、テンプレートを一般からアクセス可能にしない場合は、プライベートなストレージ コンテナーに格納することで保護できます。However, if you do not want your template to be publicly accessible, you can protect it by storing it in a private storage container. Shared Access Signature (SAS) トークンを必要とするテンプレートをデプロイする方法については、SAS トークンを使用したプライベート テンプレートのデプロイに関するページをご覧ください。For information about deploying a template that requires a shared access signature (SAS) token, see Deploy private template with SAS token.

パラメーター ファイルParameter files

スクリプト内のインライン値としてパラメーターを渡すよりも、パラメーター値を含む JSON ファイルを使用するほうが簡単な場合もあります。Rather than passing parameters as inline values in your script, you may find it easier to use a JSON file that contains the parameter values. パラメーター ファイルは次の形式にする必要があります。The parameter file must be in the following format:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
     "storageAccountType": {
         "value": "Standard_GRS"
     }
  }
}

parameters セクションに、テンプレートで定義したパラメーター (storageAccountType) に一致するパラメーター名が含まれていることに注目してください。Notice that the parameters section includes a parameter name that matches the parameter defined in your template (storageAccountType). パラメーター ファイルに、このパラメーターの値が含まれます。The parameter file contains a value for the parameter. この値は、デプロイの際に、テンプレートに自動的に渡されます。This value is automatically passed to the template during deployment. さまざまなデプロイ シナリオに合わせて複数のパラメーター ファイルを作成し、適切なパラメーター ファイルを渡すことができます。You can create multiple parameter files for different deployment scenarios, and then pass in the appropriate parameter file.

前の例をコピーし、storage.parameters.json という名前のファイルとして保存します。Copy the preceding example and save it as a file named storage.parameters.json.

ローカル パラメーター ファイルを渡すには、TemplateParameterFile パラメーターを使用します。To pass a local parameter file, use the TemplateParameterFile parameter:

New-AzureRmResourceGroupDeployment -Name ExampleDeployment -ResourceGroupName ExampleResourceGroup `
  -TemplateFile c:\MyTemplates\storage.json `
  -TemplateParameterFile c:\MyTemplates\storage.parameters.json

外部パラメーター ファイルを渡すには、TemplateParameterUri パラメーターを使用します。To pass an external parameter file, use the TemplateParameterUri parameter:

New-AzureRmResourceGroupDeployment -Name ExampleDeployment -ResourceGroupName ExampleResourceGroup `
  -TemplateUri https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/101-storage-account-create/azuredeploy.json `
  -TemplateParameterUri https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/101-storage-account-create/azuredeploy.parameters.json

同じデプロイ操作で、インライン パラメーターとローカル パラメーター ファイルを使用することができます。You can use inline parameters and a local parameter file in the same deployment operation. たとえば、一部の値をローカル パラメーター ファイルで指定し、その他の値をデプロイ中にインラインで追加します。For example, you can specify some values in the local parameter file and add other values inline during deployment. ローカル パラメーター ファイルとインラインの両方でパラメーターの値を指定すると、インラインの値が優先されます。If you provide values for a parameter in both the local parameter file and inline, the inline value takes precedence.

ただし、外部パラメーター ファイルを使用する場合、他の値をインラインまたはローカル ファイルから渡すことはできません。However, when you use an external parameter file, you cannot pass other values either inline or from a local file. TemplateParameterUri パラメーターでパラメーター ファイルを指定すると、すべてのインライン パラメーターが無視されます。When you specify a parameter file in the TemplateParameterUri parameter, all inline parameters are ignored. すべてのパラメーター値を外部ファイル内で指定します。Provide all parameter values in the external file. パラメーター ファイルに含めることができない機密性の高い値がテンプレートに含まれている場合は、その値をキー コンテナーに追加するか、すべてのパラメーター値をインラインで動的に指定してください。If your template includes a sensitive value that you cannot include in the parameter file, either add that value to a key vault, or dynamically provide all parameter values inline.

PowerShell コマンドのパラメーターのいずれかと名前が同じであるパラメーターがテンプレートに含まれている場合、PowerShell ではテンプレート内のパラメーター名の後ろに FromTemplate という文字を付加します。If your template includes a parameter with the same name as one of the parameters in the PowerShell command, PowerShell presents the parameter from your template with the postfix FromTemplate. たとえば、テンプレート内の ResourceGroupName という名前のパラメーターは、New-AzureRmResourceGroupDeployment コマンドレットの ResourceGroupName パラメーターと競合します。For example, a parameter named ResourceGroupName in your template conflicts with the ResourceGroupName parameter in the New-AzureRmResourceGroupDeployment cmdlet. ResourceGroupNameFromTemplate に値を指定するように求められます。You are prompted to provide a value for ResourceGroupNameFromTemplate. 一般的に、このような混乱を防ぐために、デプロイ処理に使用したパラメーターと同じ名前をパラメーターに付けないことが推奨されます。In general, you should avoid this confusion by not naming parameters with the same name as parameters used for deployment operations.

テンプレートのデプロイをテストするTest a template deployment

リソースを実際にデプロイすることなく、テンプレートとパラメーターの値をテストするには、Test-AzureRmResourceGroupDeployment を使用します。To test your template and parameter values without actually deploying any resources, use Test-AzureRmResourceGroupDeployment.

Test-AzureRmResourceGroupDeployment -Name ExampleDeployment -ResourceGroupName ExampleResourceGroup `
  -TemplateFile c:\MyTemplates\storage.json -storageAccountType Standard_GRS

エラーが検出されなかった場合は、コマンドが応答なしで終了します。If no errors are detected, the command finishes without a response. エラーが検出された場合は、エラー メッセージが返されます。If an error is detected, the command returns an error message. たとえば、ストレージ アカウント SKU について間違った値を渡そうとした場合は、次のエラーが返されます。For example, attempting to pass an incorrect value for the storage account SKU, returns the following error:

Test-AzureRmResourceGroupDeployment -ResourceGroupName testgroup `
  -TemplateFile c:\MyTemplates\storage.json -storageAccountType badSku

Code    : InvalidTemplate
Message : Deployment template validation failed: 'The provided value 'badSku' for the template parameter 'storageAccountType'
          at line '15' and column '24' is not valid. The parameter value is not part of the allowed value(s):
          'Standard_LRS,Standard_ZRS,Standard_GRS,Standard_RAGRS,Premium_LRS'.'.
Details :

テンプレートに構文エラーがある場合は、テンプレートを解析できなかったことを示すエラー メッセージが返されます。If your template has a syntax error, the command returns an error indicating it could not parse the template. このメッセージには、解析エラーの行番号と位置が表示されます。The message indicates the line number and position of the parsing error.

Test-AzureRmResourceGroupDeployment : After parsing a value an unexpected character was encountered: 
  ". Path 'variables', line 31, position 3.

増分デプロイと完全デプロイIncremental and complete deployments

リソースをデプロイするときには、デプロイが増分更新と完全更新のどちらであるかを指定する必要があります。When deploying your resources, you specify that the deployment is either an incremental update or a complete update. これら 2 つのモードの主な違いは、テンプレートにないリソース グループの既存のリソースを Resource Manager が処理する方法にあります。The primary difference between these two modes is how Resource Manager handles existing resources in the resource group that are not in the template:

  • 完全モードでは、Resource Manager はリソース グループに存在するがテンプレートに指定されていないリソースを削除しますIn complete mode, Resource Manager deletes resources that exist in the resource group but are not specified in the template.
  • 増分モードでは、Resource Manager はリソース グループに存在するが、テンプレートに指定されていないリソースを変更せず、そのまま残しますIn incremental mode, Resource Manager leaves unchanged resources that exist in the resource group but are not specified in the template.

いずれのモードでも、Resource Manager はテンプレートで指定されたすべてのリソースのプロビジョニングを試みます。For both modes, Resource Manager attempts to provision all resources specified in the template. リソースが既にリソース グループに存在しており、その設定が変更されていない場合、操作の結果に変わりはありません。If the resource already exists in the resource group and its settings are unchanged, the operation results in no change. リソースの設定を変更した場合、リソースはそれらの新しい設定でプロビジョニングされます。If you change the settings for a resource, the resource is provisioned with those new settings. 既存のリソースの場所または種類を更新しようとすると、デプロイがエラーで失敗します。If you attempt to update the location or type of an existing resource, the deployment fails with an error. その代わり、必要な場所または種類で新しいリソースをデプロイできます。Instead, deploy a new resource with the location or type that you need.

既定では、Resource Manager は増分モードを使用します。By default, Resource Manager uses the incremental mode.

増分モードと完全モードの違いを説明するために、次のシナリオについて考えます。To illustrate the difference between incremental and complete modes, consider the following scenario.

既存のリソース グループには、次が含まれています。Existing Resource Group contains:

  • リソース AResource A
  • リソース BResource B
  • リソース CResource C

テンプレートでは、次が定義されています。Template defines:

  • リソース AResource A
  • リソース BResource B
  • リソース DResource D

増分モードでデプロイすると、リソース グループには次が含まれます。When deployed in incremental mode, the resource group contains:

  • リソース AResource A
  • リソース BResource B
  • リソース CResource C
  • リソース DResource D

完全モードでデプロイすると、リソース C が削除されます。When deployed in complete mode, Resource C is deleted. リソース グループには、次が含まれます。The resource group contains:

  • リソース AResource A
  • リソース BResource B
  • リソース DResource D

完全モードを使用するには、Mode パラメーターを使用します。To use complete mode, use the Mode parameter:

New-AzureRmResourceGroupDeployment -Mode Complete -Name ExampleDeployment `
  -ResourceGroupName ExampleResourceGroup -TemplateFile c:\MyTemplates\storage.json 

サンプル テンプレートSample template

次のテンプレートをこのトピックの例として使用します。The following template is used for the examples in this topic. このテンプレートをコピーして、storage.json という名前のファイルとして保存します。Copy and save it as a file named storage.json. このテンプレートを作成する方法にについては、「初めての Azure Resource Manager テンプレートを作成する」を参照してください。To understand how to create this template, see Create your first Azure Resource Manager template.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageAccountType": {
      "type": "string",
      "defaultValue": "Standard_LRS",
      "allowedValues": [
        "Standard_LRS",
        "Standard_GRS",
        "Standard_ZRS",
        "Premium_LRS"
      ],
      "metadata": {
        "description": "Storage Account type"
      }
    }
  },
  "variables": {
    "storageAccountName": "[concat(uniquestring(resourceGroup().id), 'standardsa')]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "name": "[variables('storageAccountName')]",
      "apiVersion": "2016-01-01",
      "location": "[resourceGroup().location]",
      "sku": {
          "name": "[parameters('storageAccountType')]"
      },
      "kind": "Storage", 
      "properties": {
      }
    }
  ],
  "outputs": {
      "storageAccountName": {
          "type": "string",
          "value": "[variables('storageAccountName')]"
      }
  }
}

次のステップNext steps