Bicep と Azure PowerShell を使用してリソースをデプロイする

この記事では、Azure PowerShell と Bicep ファイルを使用して、Azure にリソースをデプロイする方法について説明します。 Azure ソリューションのデプロイと管理の概念について詳しくない場合は、Bicep 概要に関する記事を参照してください。

前提条件

デプロイする Bicep ファイルが必要です。 ファイルはローカルである必要があります。

Azure PowerShell と、Azure に接続されている必要があります。

PowerShell がインストールされていない場合は、Azure Cloud Shell を使用できます。 詳細については、「Azure Cloud Shell から Bicep ファイルをデプロイする」を参照してください。

必要なアクセス許可

Bicep ファイルまたは ARM テンプレートをデプロイするには、デプロイしているリソースに対する書き込みアクセス権が必要であり、また、Microsoft.Resources/デプロイ リソース タイプにあらゆる操作を実行するアクセス権かの゛必要です。 たとえば、仮想マシンをデプロイするには、Microsoft.Compute/virtualMachines/write および Microsoft.Resources/deployments/* アクセス許可が必要です。 What-If 操作のアクセス許可要件も同じです。

ロールとアクセス許可の一覧については、Azure の組み込みロールに関するページを参照してください。

デプロイのスコープ

リソース グループ、サブスクリプション、管理グループ、またはテナントをデプロイのターゲットにすることができます。 使用するコマンドは、デプロイのスコープに応じて異なります。

各スコープに対して、テンプレートをデプロイするユーザーにはリソースを作成するためのアクセス許可が必要です。

ローカルの Bicep ファイルをデプロイする

ローカル コンピューターの Bicep ファイル、または外部に格納されているものをデプロイできます。 このセクションでは、ローカルの Bicep ファイルのデプロイについて説明します。

存在しないリソース グループにデプロイする場合、リソース グループを作成する必要があります。 リソース グループ名には、英数字、ピリオド、アンダースコア、ハイフン、かっこのみを含めることができます。 最大長は 90 文字です。 名前の末尾をピリオドにすることはできません。

New-AzResourceGroup -Name ExampleGroup -Location "Central US"

ローカル Bicep ファイルをデプロイするには、デプロイメント コマンドで -TemplateFile スイッチを使用します。

New-AzResourceGroupDeployment `
  -Name ExampleDeployment `
  -ResourceGroupName ExampleGroup `
  -TemplateFile <path-to-bicep>

デプロイが完了するまでに数分かかる場合があります。

リモートの Bicep ファイルをデプロイする

現在、Azure PowerShell ではリモート Bicep ファイルのデプロイはサポートされていません。 Bicep CLI を使用して、Bicep ファイルを JSON テンプレートにビルドし、その JSON ファイルをリモートの場所に読み込みます。

パラメーター

パラメーター値を渡すには、インライン パラメーターまたはパラメーター ファイルのいずれかを使用できます。 パラメーター ファイルは、Bicep パラメーター ファイルまたは JSON パラメーター ファイルのどちらかにできます。

インライン パラメーター

インライン パラメーターを渡すには、New-AzResourceGroupDeployment コマンドでパラメーターの名前を指定します。 たとえば、文字列と配列を Bicep ファイルに渡すには、以下を使用します。

$arrayParam = "value1", "value2"
New-AzResourceGroupDeployment -ResourceGroupName testgroup `
  -TemplateFile <path-to-bicep> `
  -exampleString "inline string" `
  -exampleArray $arrayParam

ファイルの内容を取得し、その内容をインライン パラメーターとして提供することもできます。

$arrayParam = "value1", "value2"
New-AzResourceGroupDeployment -ResourceGroupName testgroup `
  -TemplateFile <path-to-bicep> `
  -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-bicep> `
  -exampleArray $subnetArray

Bicep パラメーター ファイル

スクリプトでパラメーターをインライン値として渡すのではなく、パラメーター値を含むパラメーター ファイル (.bicepparam ファイルまたは JSON パラメーター ファイル) を使用する方が簡単な場合があります。 Bicep パラメーター ファイルはローカル ファイルである必要があります。

Azure PowerShell バージョン 10.4.0 以降と Bicep CLI バージョン 0.22.X 以上では、Bicep パラメーター ファイルを利用して Bicep ファイルをデプロイできます。 Bicep パラメーター ファイル内の using ステートメントを使用すると、-TemplateParameterFile スイッチの Bicep パラメーター ファイルを指定するときに -TemplateFile スイッチを指定する必要はありません。

次の例は、storage.bicepparam という名前のパラメータ ファイルを示しています。 ファイルは、このコマンドを実行するのと同じディレクトリにあります。

New-AzResourceGroupDeployment `
  -Name ExampleDeployment `
  -ResourceGroupName ExampleResourceGroup `
  -TemplateParameterFile storage.bicepparam

パラメーター ファイルの詳細については、「Resource Manager パラメーター ファイルを作成する」をご覧ください。

JSON パラメーター ファイル

JSON パラメーター ファイルは、ローカル ファイルまたはアクセス可能な URI を持つ外部ファイルにすることができます。 パラメーター ファイルの詳細については、「Resource Manager パラメーター ファイルを作成する」をご覧ください。

ローカル パラメーター ファイルを渡すには、次のように JSON パラメーター ファイルで TemplateParameterFile スイッチを使用します。

New-AzResourceGroupDeployment `
  -Name ExampleDeployment `
  -ResourceGroupName ExampleResourceGroup `
  -TemplateFile c:\BicepFiles\storage.bicep `
  -TemplateParameterFile c:\BicepFiles\storage.parameters.json

外部パラメータ ファイルを渡すには、TemplateParameterUri パラメータを使用します。

New-AzResourceGroupDeployment `
  -Name ExampleDeployment `
  -ResourceGroupName ExampleResourceGroup `
  -TemplateFile c:\BicepFiles\storage.bicep `
  -TemplateParameterUri https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.storage/storage-account-create/azuredeploy.parameters.json

TemplateParameterUri パラメータは .bicepparam ファイルをサポートせず、JSON パラメータ ファイルのみをサポートします。

同じデプロイ操作で、インライン パラメーターと場所パラメータ ファイルを使用できます。 詳細については、「パラメーターの優先順位」を参照してください。

変更のプレビュー

Bicep ファイルをデプロイする前に、Bicep ファイルが環境に与える変更をプレビューすることができます。 what-if 操作を使用して、必要な変更が Bicep ファイルによって行われるかどうかを確認します。 また、Bicep ファイルのエラーも what-if で検証されます。

テンプレート スペックをデプロイする

現在、Azure PowerShell では、Bicep ファイルを指定してテンプレート スペックを作成することはサポートされていません。 ただし、Microsoft.Resources/templateSpecs リソースを使用して Bicep ファイルを作成し、テンプレート スペックをデプロイできます。Bicep ファイルでテンプレート スペックを作成する方法については、テンプレート スペックの作成サンプルを参照してください。 また、Bicep CLI を使用して Bicep ファイルを JSON に組み込み、JSON テンプレートを使用してテンプレート スペックを作成することもできます。

デプロイ名

Bicep ファイルをデプロイするときに、デプロイに名前を付けることができます。 この名前は、デプロイ履歴からデプロイを取得するのに役立ちます。 デプロイの名前を指定しない場合は、Bicep ファイルの名前が使用されます。 たとえば、main.bicep という名前の Bicep をデプロイし、デプロイ名を指定しなかった場合、デプロイは main という名前になります。

デプロイを実行するたびに、リソース グループのデプロイ履歴にデプロイ名のエントリが追加されます。 別のデプロイを実行するときに同じ名前を付けると、現在のデプロイによって前のエントリが置き換えられます。 デプロイ履歴に一意のエントリを保持する場合は、デプロイごとに一意の名前を付けます。

一意の名前を作成するために、ランダムな数値を割り当てることができます。

$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 つのエントリが存在します。

同時デプロイによる競合を回避し、デプロイ履歴に一意のエントリが確実に存在するようにするには、各デプロイに一意の名前を付けます。

次のステップ