チュートリアル:ローカル ARM テンプレートをデプロイする

ローカル マシンから Azure Resource Manager テンプレート (ARM テンプレート) をデプロイする方法について説明します。 所要時間は約 8 分です。

これは、シリーズの最初のチュートリアルです。 このシリーズに取り組む過程で、リンク済みテンプレートを作成してテンプレートをモジュール化し、リンク済みテンプレートをストレージ アカウントに保存します。また、SAS トークンを使用して、リンク済みテンプレートをセキュリティで保護します。テンプレートをデプロイするための DevOps パイプラインを作成する方法も学びます。 このシリーズでは、テンプレートのデプロイについて重点的に説明します。 テンプレートの開発について知りたい方は、初心者向けチュートリアルを参照してください。

ツールを入手する

まず、テンプレートをデプロイするために必要なツールがあることを確認していきましょう。

コマンド ライン デプロイ

テンプレートをデプロイするには、Azure PowerShell または Azure CLI が必要です。 インストール手順については、以下を参照してください。

Azure PowerShell または Azure CLI をインストールした後で、初回サインインを行います。 ヘルプ情報については、PowerShell でのサインインまたは Azure CLI でのサインインに関するセクションを参照してください。

エディター (省略可能)

テンプレートは JSON ファイルです。 テンプレートを確認または編集するには、適切な JSON エディターが必要です。 Visual Studio Code と Resource Manager Tools 拡張機能をお勧めします。 これらのツールをインストールする必要がある場合は、「クイックスタート: Visual Studio Code を使用して ARM テンプレートを作成する」を参照してください。

テンプレートを確認する

このテンプレートは、ストレージ アカウント、App Service プラン、Web アプリをデプロイするものです。 テンプレートの作成に興味がある場合は、クイックスタート テンプレートのチュートリアルを参照してください。 ただし、このチュートリアルに取り組むうえで必須というわけではありません。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "projectName": {
      "type": "string",
      "minLength": 3,
      "maxLength": 11,
      "metadata": {
        "description": "Specify a project name that is used to generate resource names."
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Specify a location for the resources."
      }
    },
    "storageSKU": {
      "type": "string",
      "defaultValue": "Standard_LRS",
      "allowedValues": [
        "Standard_LRS",
        "Standard_GRS",
        "Standard_RAGRS",
        "Standard_ZRS",
        "Premium_LRS",
        "Premium_ZRS",
        "Standard_GZRS",
        "Standard_RAGZRS"
      ],
      "metadata": {
        "description": "Specify the storage account type."
      }
    },
    "linuxFxVersion": {
      "type": "string",
      "defaultValue": "php|7.0",
      "metadata": {
        "description": "Specify the Runtime stack of current web app"
      }
    }
  },
  "variables": {
    "storageAccountName": "[format('{0}{1}', parameters('projectName'), uniqueString(resourceGroup().id))]",
    "webAppName": "[format('{0}WebApp', parameters('projectName'))]",
    "appServicePlanName": "[format('{0}Plan', parameters('projectName'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2023-01-01",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[parameters('storageSKU')]"
      },
      "kind": "StorageV2",
      "properties": {
        "supportsHttpsTrafficOnly": true
      }
    },
    {
      "type": "Microsoft.Web/serverfarms",
      "apiVersion": "2022-09-01",
      "name": "[variables('appServicePlanName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "B1",
        "tier": "Basic",
        "size": "B1",
        "family": "B",
        "capacity": 1
      },
      "kind": "linux",
      "properties": {
        "perSiteScaling": false,
        "reserved": true,
        "targetWorkerCount": 0,
        "targetWorkerSizeId": 0
      }
    },
    {
      "type": "Microsoft.Web/sites",
      "apiVersion": "2022-09-01",
      "name": "[variables('webAppName')]",
      "location": "[parameters('location')]",
      "kind": "app",
      "properties": {
        "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName'))]",
        "siteConfig": {
          "linuxFxVersion": "[parameters('linuxFxVersion')]"
        }
      },
      "dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms', variables('appServicePlanName'))]"
      ]
    }
  ],
  "outputs": {
    "storageEndpoint": {
      "type": "object",
      "value": "[reference(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2023-01-01').primaryEndpoints]"
    }
  }
}

重要

ストレージ アカウント名は、一意で、長さが 3 から 24 文字で、数字小文字のみを使用する必要があります。 サンプル テンプレートの storageAccountName 変数では、projectName パラメーターの最大 11 文字と、13 文字の uniqueString が結合されています。

テンプレートのコピーに .json という拡張子を付けてローカル コンピューターに保存します (例: azuredeploy.json)。 このテンプレートは、後でこのチュートリアルの中でデプロイします。

Azure へのサインイン

Azure PowerShell または Azure CLI を使用して、テンプレートのデプロイを開始するには、Azure の資格情報を使用してサインインします。

Connect-AzAccount

複数の Azure サブスクリプションがある場合は、使用するサブスクリプションを選択します。 [SubscriptionID/SubscriptionName] と角かっこ [] を実際のサブスクリプション情報に置き換えます。

Set-AzContext [SubscriptionID/SubscriptionName]

リソース グループの作成

テンプレートをデプロイするときは、リソースを格納するリソース グループを指定します。 デプロイ コマンドを実行する前に、Azure CLI または Azure PowerShell を使用してリソース グループを作成します。 次のコード セクションのタブを選択し、Azure PowerShell または Azure CLI を選択してください。 この記事の CLI の例は、Bash シェルを対象として記述されています。

$projectName = Read-Host -Prompt "Enter a project name that is used to generate resource and resource group names"
$resourceGroupName = "${projectName}rg"

New-AzResourceGroup `
  -Name $resourceGroupName `
  -Location "Central US"

テンプレートのデプロイ

一方または両方のデプロイ オプションを使用してテンプレートをデプロイします。

$projectName = Read-Host -Prompt "Enter the same project name"
$templateFile = Read-Host -Prompt "Enter the template file path and file name"
$resourceGroupName = "${projectName}rg"

New-AzResourceGroupDeployment `
  -Name DeployLocalTemplate `
  -ResourceGroupName $resourceGroupName `
  -TemplateFile $templateFile `
  -projectName $projectName `
  -verbose

Azure PowerShell を使用してテンプレートをデプロイする方法の詳細については、「ARM テンプレートと Azure PowerShell を使用したリソースのデプロイ」をご覧ください。

リソースをクリーンアップする

リソース グループを削除して、デプロイしたリソースをクリーンアップします。

  1. Azure portal で、左側のメニューから [リソース グループ] を選択します。
  2. [名前でフィルター] フィールドに、リソース グループ名を入力します。
  3. リソース グループ名を選択します。
  4. トップ メニューから [リソース グループの削除] を選択します。

次のステップ

ローカル テンプレートをデプロイする方法について説明しました。 次のチュートリアルでは、テンプレートをメイン テンプレートとリンク済みテンプレートに分けたうえで、リンク済みテンプレートを保存してセキュリティを確保する方法について説明します。