ARM テンプレートと Azure PowerShell を使用したリソースのデプロイ
この記事では、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 を使用します。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"
同じリソース グループに対して同じ名前のデプロイを同時に実行した場合は、最後のデプロイのみが完了します。 完了していない同じ名前のデプロイは、最後のデプロイによって置き換えられます。 たとえば、storage1
という名前のストレージ アカウントをデプロイする newStorage
という名前のデプロイを実行し、storage2
という名前のストレージ アカウントをデプロイする newStorage
という名前の別のデプロイを同時に実行した場合は、1 つのストレージ アカウントのみがデプロイされます。 結果のストレージ アカウントの名前は storage2
になります。
ただし、storage1
という名前のストレージ アカウントをデプロイする newStorage
という名前のデプロイを実行し、その完了直後に、storage2
という名前のストレージ アカウントをデプロイする newStorage
という名前の別のデプロイを実行した場合は、ストレージ アカウントは 2 つになります。 1 つは storage1
という名前に、もう 1 つは storage2
という名前になります。 ただし、デプロイ履歴にはエントリが 1 つだけ存在します。
デプロイごとに一意の名前を指定すると、競合なしでそれらを同時に実行できます。 storage1
という名前のストレージ アカウントをデプロイする newStorage1
という名前のデプロイを実行し、storage2
という名前のストレージ アカウントをデプロイする newStorage2
という名前の別のデプロイを同時に実行した場合は、2 つのストレージ アカウントがデプロイされ、デプロイ履歴には 2 つのエントリが存在します。
同時デプロイによる競合を回避し、デプロイ履歴に一意のエントリが確実に存在するようにするには、各デプロイに一意の名前を付けます。
ローカル テンプレートのデプロイ
ローカル コンピューターから、または外部に格納されているテンプレートを使用して、テンプレートをデプロイできます。 ここでは、ローカル テンプレートのデプロイについて説明します。
存在しないリソース グループにデプロイする場合、リソース グループを作成する必要があります。 リソース グループ名には、英数字、ピリオド、アンダースコア、ハイフン、かっこのみを含めることができます。 最大長は 90 文字です。 名前の末尾をピリオドにすることはできません。
New-AzResourceGroup -Name ExampleGroup -Location "Central US"
ローカル テンプレートをデプロイするには、デプロイ コマンドで -TemplateFile
パラメーターを使用します。 次の例では、テンプレートから取得したパラメーター値を設定する方法も示しています。
New-AzResourceGroupDeployment `
-Name ExampleDeployment `
-ResourceGroupName ExampleGroup `
-TemplateFile <path-to-template>
デプロイが完了するまでに数分かかる場合があります。
リモート テンプレートのデプロイ
ARM テンプレートをローカル コンピューターに格納する代わりに、外部の場所に格納することもできます。 ソース管理リポジトリ (GitHub など) にテンプレートを格納できます。 または、組織内の共有アクセス用の Azure ストレージ アカウントに格納することができます。
Note
テンプレートをデプロイするか、プライベート 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
ステートメントを使用すると、-TemplateParameterFile
スイッチの Bicep パラメーター ファイルを指定するときに -TemplateFile
スイッチを指定する必要はありません。
次の例は、storage.bicepparam という名前のパラメータ ファイルを示しています。 ファイルは、このコマンドを実行するのと同じディレクトリにあります。
New-AzResourceGroupDeployment `
-Name ExampleDeployment `
-ResourceGroupName ExampleResourceGroup `
-TemplateParameterFile storage.bicepparam
Bicep パラメーターの詳細については、「Bicep パラメーター ファイル」を参照してください。.
次のステップ
- エラーが発生したときに正常なデプロイにロールバックするには、「エラー発生時に正常なデプロイにロールバックする」を参照してください。
- リソース グループに存在するが、テンプレートで定義されていないリソースの処理方法を指定するには、「Azure Resource Manager のデプロイ モード」を参照してください。
- テンプレートでパラメーターを定義する方法については、「Azure Resource Manager テンプレートの構造と構文の詳細」を参照してください。
- SAS トークンを必要とするテンプレートをデプロイする方法については、「SAS トークンを使用してプライベート ARM テンプレートをデプロイする」を参照してください。