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

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

前提条件

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

Azure CLI、および Azure に接続されていることが必要です。

  • ご利用のローカル コンピューターに Azure CLI コマンドをインストールします。 Bicep ファイルをデプロイするには、Azure CLI バージョン 2.20.0 以降が必要です。
  • az login を使用して Azure に接続します。 Azure サブスクリプションが複数ある場合は、az account set を実行する必要が生じることもあります。

Azure CLI のサンプルは、bash シェル用に記述されています。 このサンプルを Windows PowerShell またはコマンド プロンプトで実行するには、スクリプトの要素の変更が必要な場合があります。

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

必要なアクセス許可

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

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

デプロイのスコープ

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

各スコープに対して、Bicep ファイルをデプロイするユーザーにはリソースを作成するために必要なアクセス許可が付与されていなければなりません。

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

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

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

az group create --name ExampleGroup --location "Central US"

ローカル Bicep ファイルをデプロイするには、デプロイメント コマンドで --template-file スイッチを使用します。 次の例では、パラメーター値を設定する方法も示しています。

az deployment group create \
  --name ExampleDeployment \
  --resource-group ExampleGroup \
  --template-file <path-to-bicep> \
  --parameters storageAccountType=Standard_GRS

デプロイが完了するまでに数分かかる場合があります。 デプロイが完了すると、次のような結果を含むメッセージが表示されます。

"provisioningState": "Succeeded",

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

現在、Azure CLI ではリモート Bicep ファイルのデプロイはサポートされていません。 Bicep CLI を使用して、Bicep ファイルを JSON テンプレートにビルドし、その JSON ファイルをリモートの場所に読み込みます。 詳細については、リモート ARM JSON テンプレートのデプロイに関する記事を参照してください。

パラメーター

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

インライン パラメーター

インライン パラメーターを渡すには、parameters に値を指定します。 たとえば、Bash シェルで文字列と配列を Bicep ファイルに渡すには、以下を使用します。

az deployment group create \
  --resource-group testgroup \
  --template-file <path-to-bicep> \
  --parameters exampleString='inline string' exampleArray='["value1", "value2"]'

Windows コマンド プロンプト (CMD) または PowerShell で Azure CLI を使用している場合は、exampleArray="['value1','value2']" という形式で配列を渡します。

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

az deployment group create \
  --resource-group testgroup \
  --template-file <path-to-bicep> \
  --parameters exampleString=@stringContent.txt exampleArray=@arrayContent.json

ファイルからのパラメーター値の取得は、構成値を指定する必要がある場合に便利です。 たとえば、Linux 仮想マシン用の cloud-init の値を指定できます。

arrayContent.json 形式は次のようになります。

[
  "value1",
  "value2"
]

タグの設定などを目的にオブジェクトを渡すには、JSON を使用します。 たとえば、Bicep ファイルには、次のようなパラメーターを含めることができます。

"resourceTags": {
  "type": "object",
  "defaultValue": {
    "Cost Center": "IT Department"
  }
}

この場合は、次の Bash スクリプトに示すように、JSON 文字列を渡してパラメーターを設定できます。

tags='{"Owner":"Contoso","Cost Center":"2345-324"}'
az deployment group create --name addstorage  --resource-group myResourceGroup \
--template-file $bicepFile \
--parameters resourceName=abcdef4556 resourceTags="$tags"

オブジェクトに渡す JSON を二重引用符で囲みます。

Windows コマンド プロンプト (CMD) または PowerShell で Azure CLI を使用している場合は、次の形式でオブジェクトを渡します。

$tags="{'Owner':'Contoso','Cost Center':'2345-324'}"
az deployment group create --name addstorage  --resource-group myResourceGroup \
--template-file $bicepFile \
--parameters resourceName=abcdef4556 resourceTags=$tags

変数を使用してパラメーター値を格納できます。 Bash では、変数をすべてのパラメーター値に設定し、それをデプロイ コマンドに追加します。

params="prefix=start suffix=end"

az deployment group create \
  --resource-group testgroup \
  --template-file <path-to-bicep> \
  --parameters $params

しかし、Windows コマンド プロンプト (CMD) または PowerShell で Azure CLI を使用する場合は、変数を JSON 文字列に設定します。 引用符をエスケープします ($params = '{ \"prefix\": {\"value\":\"start\"}, \"suffix\": {\"value\":\"end\"} }')。

パラメーターの評価は順序に従って行われます。つまり、値が複数回割り当てられた場合、最後に割り当てられた値のみが使用されます。 パラメータを適切に割り当てるには、最初にパラメータ ファイルを指定し、KEY=VALUE 構文を使用して特定のパラメータを選択的にオーバーライドすることをお勧めします。 bicepparam パラメータ ファイルを指定する場合、この引数は 1 回だけ使用できることに注意してください。

Bicep パラメーター ファイル

スクリプトでパラメーターをインライン値として渡すのではなく、パラメーター値を含むパラメーター ファイル (Bicep パラメーター ファイルまたは JSON パラメーター ファイル) を使用する方が簡単な場合があります。 パラメータ ファイルはローカル ファイルである必要があります。 外部パラメーター ファイルは、Azure CLI ではサポートされていません。 パラメーター ファイルの詳細については、「Resource Manager パラメーター ファイルを作成する」をご覧ください。

Azure CLI バージョン 2.53.0 以降と Bicep CLI バージョン 0.22.X 以降では、Bicep パラメーター ファイルを使用して Bicep ファイルをデプロイできます。 Bicep パラメーター ファイル内の using ステートメントを使用すると、--parameters スイッチの Bicep パラメーター ファイルを指定するときに --template-file スイッチを指定する必要はありません。 --template-file スイッチを含めると、".bicepparam ファイルを使用できるのは .bicep テンプレートのみです" というエラーが発生します。

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

az deployment group create \
  --name ExampleDeployment \
  --resource-group ExampleGroup \
  --parameters storage.bicepparam

JSON パラメーター ファイル

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

az deployment group create \
  --name ExampleDeployment \
  --resource-group ExampleGroup \
  --template-file storage.bicep \
  --parameters '@storage.parameters.json'

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

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

変更のプレビュー

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

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

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

デプロイ名

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

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

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

deploymentName='ExampleDeployment'$RANDOM

または、日付の値を追加します。

deploymentName='ExampleDeployment'$(date +"%d-%b-%Y")

同じリソース グループに対して同じ名前のデプロイを同時に実行した場合は、最後のデプロイのみが完了します。 完了していない同じ名前のデプロイは、最後のデプロイによって置き換えられます。 たとえば、storage1 という名前のストレージ アカウントをデプロイする newStorage という名前のデプロイを実行し、storage2 という名前のストレージ アカウントをデプロイする newStorage という名前の別のデプロイを同時に実行した場合は、1 つのストレージ アカウントのみがデプロイされます。 結果のストレージ アカウントの名前は storage2 になります。

ただし、storage1 という名前のストレージ アカウントをデプロイする newStorage という名前のデプロイを実行し、その完了直後に、storage2 という名前のストレージ アカウントをデプロイする newStorage という名前の別のデプロイを実行した場合は、ストレージ アカウントは 2 つになります。 1 つは storage1 という名前に、もう 1 つは storage2 という名前になります。 ただし、デプロイ履歴にはエントリが 1 つだけ存在します。

デプロイごとに一意の名前を指定すると、競合なしでそれらを同時に実行できます。 storage1 という名前のストレージ アカウントをデプロイする newStorage1 という名前のデプロイを実行し、storage2 という名前のストレージ アカウントをデプロイする newStorage2 という名前の別のデプロイを同時に実行した場合は、2 つのストレージ アカウントがデプロイされ、デプロイ履歴には 2 つのエントリが存在します。

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

次のステップ