この記事では、Azure PowerShell と Azure Resource Manager テンプレート (ARM テンプレート) を使用して Azure にリソースをデプロイする方法について説明します。 Azure ソリューションのデプロイと管理の概念について詳しくない場合、「テンプレートのデプロイの概要」をご覧ください。
ヒント
ARM テンプレートと同じ機能を備え、構文も使いやすいため、Bicep をお勧めします。 詳細については、「Bicep と Azure PowerShell を使用してリソースをデプロイする」を参照してください。
前提条件
デプロイするテンプレートが必要です。 デプロイするテンプレートがない場合は、Azure クイック スタート テンプレート リポジトリからサンプル テンプレートを保存します。 この記事で使用されているローカル ファイル名は、C:\MyTemplates\azuredeploy.json です。
Azure PowerShell をインストールし、Azure に接続する必要があります。
- ローカル コンピューターに Azure PowerShell コマンドレットをインストールします。 詳細については、Azure PowerShell の概要に関するページを参照してください。
- Connect-AZAccount を使用して、Azure に接続します。 Azure サブスクリプションが複数ある場合は、Set-AzContext を実行する必要が生じることもあります。 詳しくは、「Use multiple Azure subscriptions (複数の Azure サブスクリプションを使用する)」をご覧ください。
PowerShell がインストールされていない場合は、Azure Cloud Shell を使用できます。 詳細については、「Azure Cloud Shell から ARM テンプレートをデプロイする」を参照してください。
必要なアクセス許可
Bicep ファイルまたは ARM テンプレートをデプロイするには、デプロイしているリソースに対する書き込みアクセス権が必要であり、また、Microsoft.Resources/デプロイ リソース タイプにあらゆる操作を実行するアクセス権かの゛必要です。 たとえば、仮想マシンをデプロイするには、Microsoft.Compute/virtualMachines/write
および Microsoft.Resources/deployments/*
アクセス許可が必要です。 What-If 操作のアクセス許可要件も同じです。
ロールとアクセス許可の一覧については、Azure の組み込みロールに関するページを参照してください。
デプロイのスコープ
リソース グループ、サブスクリプション、管理グループ、またはテナントをデプロイのターゲットにすることができます。 使用するコマンドは、デプロイのスコープに応じて異なります。
リソース グループにデプロイするには、New-AzResourceGroupDeployment を使用します。
New-AzResourceGroupDeployment -ResourceGroupName <resource-group-name> -TemplateFile <path-to-template>
サブスクリプションにデプロイするには、 コマンドレットの別名である
New-AzDeployment
を使用します。New-AzSubscriptionDeployment -Location <___location> -TemplateFile <path-to-template>
サブスクリプション レベルでのデプロイの詳細については、「サブスクリプション レベルでリソース グループとリソースを作成する」を参照してください。
管理グループにデプロイするには、新しい AzManagementGroupDeploymentを使用します。
New-AzManagementGroupDeployment -Location <___location> -TemplateFile <path-to-template>
管理グループ レベルでのデプロイの詳細については、「管理グループ レベルでリソースを作成する」を参照してください。
テナントにデプロイするには、新しい AzTenantDeployment を使用します。
New-AzTenantDeployment -Location <___location> -TemplateFile <path-to-template>
テナント レベルでのデプロイの詳細については、「テナント レベルでリソースを作成する」を参照してください。
各スコープに対して、テンプレートをデプロイするユーザーにはリソースを作成するためのアクセス許可が必要です。
デプロイ名
ARM テンプレートをデプロイするときに、デプロイに名前を付けることができます。 この名前は、デプロイ履歴からデプロイを取得するのに役立ちます。 デプロイの名前を指定しない場合は、テンプレート ファイルの名前が使用されます。 たとえば、azuredeploy.json
という名前のテンプレートをデプロイするときにデプロイ名を指定しなかった場合、デプロイの名前は azuredeploy
になります。
デプロイを実行するたびに、リソース グループのデプロイ履歴にデプロイ名のエントリが追加されます。 別のデプロイを実行するときに同じ名前を付けると、現在のデプロイによって前のエントリが置き換えられます。 デプロイ履歴に一意のエントリを保持する場合は、デプロイごとに一意の名前を付けます。
一意の名前を作成するために、ランダムな数値を割り当てることができます。
$suffix = Get-Random -Maximum 1000
$deploymentName = "ExampleDeployment" + $suffix
または、日付の値を追加します。
$today=Get-Date -Format "MM-dd-yyyy"
$deploymentName="ExampleDeployment"+"$today"
同じリソース グループに対して同じ名前のデプロイを同時に実行した場合は、最後のデプロイのみが完了します。 完了していない同じ名前のデプロイは、最後のデプロイによって置き換えられます。 たとえば、newStorage
という名前のストレージ アカウントをデプロイする storage1
という名前のデプロイを実行し、newStorage
という名前のストレージ アカウントをデプロイする storage2
という名前の別のデプロイを同時に実行した場合は、1 つのストレージ アカウントのみがデプロイされます。 結果のストレージ アカウントの名前は storage2
になります。
ただし、newStorage
という名前のストレージ アカウントをデプロイする storage1
という名前のデプロイを実行し、その完了直後に、newStorage
という名前のストレージ アカウントをデプロイする storage2
という名前の別のデプロイを実行した場合は、ストレージ アカウントは 2 つになります。 1 つは storage1
という名前に、もう 1 つは storage2
という名前になります。 ただし、デプロイ履歴にはエントリが 1 つだけ存在します。
デプロイごとに一意の名前を指定すると、競合なしでそれらを同時に実行できます。
newStorage1
という名前のストレージ アカウントをデプロイする storage1
という名前のデプロイを実行し、newStorage2
という名前のストレージ アカウントをデプロイする storage2
という名前の別のデプロイを同時に実行した場合は、2 つのストレージ アカウントがデプロイされ、デプロイ履歴には 2 つのエントリが存在します。
同時デプロイによる競合を回避し、デプロイ履歴に一意のエントリが確実に存在するようにするには、各デプロイに一意の名前を付けます。
ローカル テンプレートのデプロイ
ローカル コンピューターから、または外部に格納されているテンプレートを使用して、テンプレートをデプロイできます。 ここでは、ローカル テンプレートのデプロイについて説明します。
存在しないリソース グループにデプロイする場合、リソース グループを作成する必要があります。 リソース グループ名には、英数字、ピリオド、アンダースコア、ハイフン、かっこのみを含めることができます。 最大長は 90 文字です。 名前の末尾をピリオドにすることはできません。
New-AzResourceGroup -Name ExampleGroup -Location "Central US"
ローカル テンプレートをデプロイするには、デプロイ コマンドで -TemplateFile
パラメーターを使用します。 次の例では、テンプレートから取得したパラメーター値を設定する方法も示しています。
New-AzResourceGroupDeployment `
-Name ExampleDeployment `
-ResourceGroupName ExampleGroup `
-TemplateFile <path-to-template>
デプロイが完了するまでに数分かかる場合があります。
リモート テンプレートのデプロイ
ARM テンプレートをローカル コンピューターに格納する代わりに、外部の場所に格納することもできます。 ソース管理リポジトリ (GitHub など) にテンプレートを格納できます。 または、組織内の共有アクセス用の Azure ストレージ アカウントに格納することができます。
注
テンプレートをデプロイするか、プライベート GitHub リポジトリに格納されているリンクされたテンプレートを参照するには、「カスタムのセキュリティ保護された Azure Portal オファリングの作成」に記載されているカスタム ソリューションを参照してください。 Azure Key Vault から GitHub トークンを取得する Azure 関数を作成できます。
存在しないリソース グループにデプロイする場合、リソース グループを作成する必要があります。 リソース グループ名には、英数字、ピリオド、アンダースコア、ハイフン、かっこのみを含めることができます。 最大長は 90 文字です。 名前の末尾をピリオドにすることはできません。
New-AzResourceGroup -Name ExampleGroup -Location "Central US"
外部テンプレートをデプロイするには、-TemplateUri
パラメーターを使用します。
New-AzResourceGroupDeployment `
-Name remoteTemplateDeployment `
-ResourceGroupName ExampleGroup `
-TemplateUri https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.storage/storage-account-create/azuredeploy.json
前の例では、テンプレートにはパブリックにアクセスできる URI が必要になります。テンプレートに機密データを含めてはいけないため、この方法は多くの場合に利用できます。 機密データ (管理者パスワードなど) を指定する必要がある場合は、セキュリティで保護されたパラメーターとしてその値を渡します。 ただし、テンプレートへのアクセスを管理する場合は、テンプレート スペックを使用することを検討してください。
離れた場所にあり、リンクされているテンプレートを、ストレージ アカウントに格納されている相対パスでデプロイするには、QueryString
を使用して SAS トークンを指定します。
New-AzResourceGroupDeployment `
-Name linkedTemplateWithRelativePath `
-ResourceGroupName "myResourceGroup" `
-TemplateUri "https://stage20210126.blob.core.windows.net/template-staging/mainTemplate.json" `
-QueryString "$sasToken"
詳細については、「リンクされたテンプレートの相対パスを使用する」を参照してください。
テンプレート スペックのデプロイ
ローカルまたはリモートのテンプレートをデプロイする代わりに、テンプレート スペックを作成できます。テンプレート スペックは、ARM テンプレートが含まれる Azure サブスクリプションのリソースです。 これにより、組織内のユーザーとテンプレートを安全に共有することが容易になります。 テンプレート スペックへのアクセス権を付与するには、Azure ロールベースのアクセス制御 (Azure RBAC) を使用します。現在、この機能はプレビュー段階にあります。
次の例では、テンプレート スペックの作成とデプロイの方法を示します。
まず、ARM テンプレートを指定して、テンプレート スペックを作成します。
New-AzTemplateSpec `
-Name storageSpec `
-Version 1.0 `
-ResourceGroupName templateSpecsRg `
-Location westus2 `
-TemplateJsonFile ./mainTemplate.json
次に、テンプレート スペックの ID を取得して、デプロイします。
$id = (Get-AzTemplateSpec -Name storageSpec -ResourceGroupName templateSpecsRg -Version 1.0).Versions.Id
New-AzResourceGroupDeployment `
-ResourceGroupName demoRG `
-TemplateSpecId $id
詳細については、「Azure Resource Manager テンプレート スペック」を参照してください。
変更のプレビュー
テンプレートをデプロイする前に、テンプレートが環境に与える変更をプレビューすることができます。 what-if 操作を使用して、テンプレートによって必要な変更が行われるかどうかを確認します。 What-if はまた、テンプレートのエラーも検証します。
パラメーター値を渡す
パラメーター値を渡すには、インライン パラメーターまたはパラメーター ファイルのいずれかを使用できます。 パラメーター ファイルには、Bicep パラメーター ファイルまたは JSON パラメーター ファイルを指定できます。
インライン パラメーター
インライン パラメーターを渡すには、New-AzResourceGroupDeployment
コマンドでパラメーターの名前を指定します。 たとえば、文字列と配列をテンプレートに渡すには、以下を使用します。
$arrayParam = "value1", "value2"
New-AzResourceGroupDeployment -ResourceGroupName testgroup `
-TemplateFile <path-to-template> `
-exampleString "inline string" `
-exampleArray $arrayParam
TemplateParameterObject
パラメーターを使用すると、テンプレートのパラメーターを含むハッシュテーブルを通過できます。
$params = @{
exampleString = "inline string"
exampleArray = "value1", "value2"
}
New-AzResourceGroupDeployment -ResourceGroupName testgroup `
-TemplateFile <path-to-bicep> `
-TemplateParameterObject $params
ファイルの内容を取得し、その内容をインライン パラメーターとして提供することもできます。
$arrayParam = "value1", "value2"
New-AzResourceGroupDeployment -ResourceGroupName testgroup `
-TemplateFile <path-to-template> `
-exampleString $(Get-Content -Path c:\MyTemplates\stringcontent.txt -Raw) `
-exampleArray $arrayParam
ファイルからのパラメーター値の取得は、構成値を指定する必要がある場合に便利です。 たとえば、Linux 仮想マシン用の cloud-init の値を指定できます。
オブジェクトの配列を渡す必要がある場合、PowerShell でハッシュ テーブルを作成し、そのテーブルを配列に追加します。 デプロイの際に、その配列をパラメーターとして渡します。
$hash1 = @{ Name = "firstSubnet"; AddressPrefix = "10.0.0.0/24"}
$hash2 = @{ Name = "secondSubnet"; AddressPrefix = "10.0.1.0/24"}
$subnetArray = $hash1, $hash2
New-AzResourceGroupDeployment -ResourceGroupName testgroup `
-TemplateFile <path-to-template> `
-exampleArray $subnetArray
JSON パラメーター ファイル
スクリプト内のインライン値としてパラメーターを渡すよりも、パラメーター値を含む JSON ファイルを使用するほうが簡単な場合もあります。 パラメーター ファイルは、ローカル ファイルでも、アクセス可能な URI を持つ外部ファイルでもかまいません。
パラメーター ファイルの詳細については、「Resource Manager パラメーター ファイルを作成する」を参照してください。
ローカル パラメーター ファイルを渡すには、TemplateParameterFile
パラメーターを使用します。
New-AzResourceGroupDeployment `
-Name ExampleDeployment `
-ResourceGroupName ExampleResourceGroup `
-TemplateFile <path-to-template> `
-TemplateParameterFile c:\MyTemplates\storage.parameters.json
外部パラメーター ファイルを渡すには、TemplateParameterUri
パラメーターを使用します。
New-AzResourceGroupDeployment `
-Name ExampleDeployment `
-ResourceGroupName ExampleResourceGroup `
-TemplateUri https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.storage/storage-account-create/azuredeploy.json `
-TemplateParameterUri https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.storage/storage-account-create/azuredeploy.parameters.json
パラメーター ファイルの詳細については、「Resource Manager パラメーター ファイルを作成する」をご覧ください。
Bicep パラメーター ファイル
Azure PowerShell バージョン 10.4.0 以降と Bicep CLI バージョン 0.22.6 以降では、Bicep パラメーター ファイルを使用して ARM テンプレート ファイルをデプロイできます。 Bicep パラメーター ファイル内の using
ステートメントを使用すると、-TemplateFile
スイッチの Bicep パラメーター ファイルを指定するときに -TemplateParameterFile
スイッチを指定する必要はありません。
次の例は、storage.bicepparam という名前のパラメータ ファイルを示しています。 ファイルは、このコマンドを実行するのと同じディレクトリにあります。
New-AzResourceGroupDeployment `
-Name ExampleDeployment `
-ResourceGroupName ExampleResourceGroup `
-TemplateParameterFile storage.bicepparam
Bicep パラメーターの詳細については、「Bicep パラメーター ファイル」を参照してください。.
次のステップ
- エラーが発生したときに正常なデプロイにロールバックするには、「エラー発生時に正常なデプロイにロールバックする」を参照してください。
- リソース グループに存在するが、テンプレートで定義されていないリソースの処理方法を指定するには、「Azure Resource Manager のデプロイ モード」を参照してください。
- テンプレートでパラメーターを定義する方法については、「Azure Resource Manager テンプレートの構造と構文の詳細」を参照してください。
- SAS トークンを必要とするテンプレートをデプロイする方法については、「SAS トークンを使用してプライベート ARM テンプレートをデプロイする」を参照してください。