Azure CLI で Azure Resource Manager (ARM) のデプロイ テンプレートを使用する方法

この記事では、Azure CLI と Azure Resource Manager テンプレート (ARM テンプレート) を使用して、Azure にリソースをデプロイする方法について説明します。 Azure ソリューションのデプロイと管理の概念について詳しくない場合、「テンプレートのデプロイの概要」をご覧ください。

デプロイ コマンドは Azure CLI バージョン 2.2.0 で変更されました。 この記事の例には、Azure CLI バージョン 2.20.0 以降が必要です。

このサンプルを実行するには、最新バージョンの Azure CLI をインストールします。 開始するには、az login を実行して、Azure との接続を作成します。

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

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

ヒント

ARM テンプレートと同じ機能を備え、構文も使いやすいため、Bicep をお勧めします。 詳細については、「Bicep と Azure コマンド ライン インターフェイスを使用してリソースをデプロイする方法」を参照してください。

必要なアクセス許可

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

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

デプロイのスコープ

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

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

ローカル テンプレートのデプロイ

ローカル コンピューターからの ARM テンプレートまたは外部に格納されているものをデプロイできます。 ここでは、ローカル テンプレートのデプロイについて説明します。

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

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

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

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

--template-file パラメーターの値は、Bicep ファイル、あるいは .json または .jsonc ファイルである必要があります。 ファイル拡張子が .jsonc であれば、ファイルに // スタイル コメントを含めることができます。 ARM システムは、.json ファイルで // コメントを受け入れます。 ファイル拡張子の違いによって影響は受けません。 コメントとメタデータの詳細については、「ARM テンプレートの構造と構文の詳細」を参照してください。

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

"provisioningState": "Succeeded",

リモート テンプレートのデプロイ

ARM テンプレートをローカル コンピューターに格納する代わりに、外部の場所に格納することもできます。 ソース管理リポジトリ (GitHub など) にテンプレートを格納できます。 または、組織内の共有アクセス用の Azure ストレージ アカウントに格納することができます。

Note

テンプレートをデプロイするか、プライベート GitHub リポジトリに格納されているリンクされたテンプレートを参照するには、「カスタムのセキュリティ保護された Azure Portal オファリングの作成」に記載されているカスタム ソリューションを参照してください。 Azure Key Vault から GitHub トークンを取得する Azure 関数を作成できます。

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

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

外部テンプレートをデプロイするには、template-uri パラメーターを使用します。

az deployment group create \
  --name ExampleDeployment \
  --resource-group ExampleGroup \
  --template-uri "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.storage/storage-account-create/azuredeploy.json" \
  --parameters storageAccountType=Standard_GRS

前の例では、テンプレートにはパブリックにアクセスできる URI が必要になります。テンプレートに機密データを含めてはいけないため、この方法は多くの場合に利用できます。 機密データ (管理者パスワードなど) を指定する必要がある場合は、セキュリティで保護されたパラメーターとしてその値を渡します。 ただし、テンプレートへのアクセスを管理する場合は、テンプレート スペックを使用することを検討してください。

離れた場所にあり、リンクされているテンプレートを、ストレージ アカウントに格納されている相対パスでデプロイするには、query-string を使用して SAS トークンを指定します。

az deployment group create \
  --name linkedTemplateWithRelativePath \
  --resource-group myResourceGroup \
  --template-uri "https://stage20210126.blob.core.windows.net/template-staging/mainTemplate.json" \
  --query-string $sasToken

詳細については、リンクされているテンプレートの相対パスを使用する方法に関するページを参照してください。

Azure デプロイ テンプレート名

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

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

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

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

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

テンプレート スペックのデプロイ

ローカルまたはリモートのテンプレートをデプロイする代わりに、テンプレート スペックを作成できます。テンプレート スペックは、ARM テンプレートが含まれる Azure サブスクリプションのリソースです。 これにより、組織内のユーザーとテンプレートを安全に共有することが容易になります。 テンプレート スペックへのアクセス権を付与するには、Azure ロールベースのアクセス制御 (Azure RBAC) を使用します。現在、この機能はプレビュー段階にあります。

次の例では、テンプレート スペックの作成とデプロイの方法を示します。

まず、ARM テンプレートを指定して、テンプレート スペックを作成します。

az ts create \
  --name storageSpec \
  --version "1.0" \
  --resource-group templateSpecRG \
  --location "westus2" \
  --template-file "./mainTemplate.json"

次に、テンプレート スペックの ID を取得して、デプロイします。

id = $(az ts show --name storageSpec --resource-group templateSpecRG --version "1.0" --query "id")

az deployment group create \
  --resource-group demoRG \
  --template-spec $id

詳細については、「Azure Resource Manager テンプレート スペック」を参照してください。

変更のプレビュー

ARM テンプレートをデプロイする前に、テンプレートが環境に加える変更をプレビューできます。 what-if 操作を使用して、テンプレートによって必要な変更が行われるかどうかを確認します。 What-if はまた、テンプレートのエラーも検証します。

パラメーター

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

インライン パラメーター

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

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

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

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

[
  "value1",
  "value2"
]

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

"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 $templateFile \
--parameters resourceName=abcdef4556 resourceTags="$tags"

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

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

params="prefix=start suffix=end"

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

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

JSON パラメーター ファイル

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

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

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

Bicep パラメーター ファイル

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

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

パラメータ ファイルはローカル ファイルである必要があります。 外部パラメーター ファイルは、Azure CLI ではサポートされていません。 パラメーター ファイルの詳細については、「Resource Manager パラメーター ファイルを作成する」をご覧ください。

コメントと拡張 JSON 形式

パラメーター ファイルに // スタイル コメントを含めることができますが、このファイルの拡張子を .jsonc にする必要があります。

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

コメントとメタデータの詳細については、「ARM テンプレートの構造と構文について」を参照してください。

バージョン 2.3.0 以下の Azure CLI を使用している場合は、--handle-extended-json-format スイッチを使用して、複数行の文字列またはコメントを含むテンプレートをデプロイする必要があります。 次に例を示します。

{
  "type": "Microsoft.Compute/virtualMachines",
  "apiVersion": "2018-10-01",
  "name": "[variables('vmName')]", // to customize name, change it in variables
  "location": "[
    parameters('location')
    ]", //defaults to resource group location
  /*
    storage account and network interface
    must be deployed first
  */
  "dependsOn": [
    "[resourceId('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))]",
    "[resourceId('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
  ],

次のステップ