チュートリアル:ARM テンプレートを使用して SQL BACPAC ファイルをインポートする

Azure SQL Database 拡張機能を使用して Azure Resource Manager テンプレート (ARM テンプレート) テンプレートで BACPAC ファイルをインポートする方法について説明します。 デプロイの成果物は、デプロイを完了するために必要なメイン テンプレート ファイルに加えたすべてのファイルです。 この BACPAC ファイルが成果物です。

このチュートリアルでは、テンプレートを作成して論理 SQL サーバーと単一データベースをデプロイし、BACPAC ファイルをインポートします。 ARM テンプレートを使用して Azure 仮想マシン拡張機能をデプロイする方法については、「チュートリアル: ARM テンプレートを使用して仮想マシン拡張機能をデプロイする」を参照してください。

このチュートリアルに含まれるタスクは次のとおりです。

  • BACPAC ファイルを準備する。
  • クイックスタート テンプレートを開く。
  • テンプレートを編集する。
  • テンプレートをデプロイします。
  • デプロイを検証する。

Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。

前提条件

この記事を完了するには、以下が必要です。

BACPAC ファイルを準備する

BACPAC ファイルは、GitHub で共有されています。 独自のものを作成するには、Azure SQL Database から BACPAC ファイルへのデータベースのエクスポートに関する記事を参照してください。 ファイルを独自の場所に発行する場合は、チュートリアルの後半でテンプレートを更新する必要があります。

BACPAC ファイルは、ARM テンプレートを使用してインポートする前に、Azure Storage アカウントに格納されている必要があります。 以下の PowerShell スクリプトは、次の手順で BACPAC ファイルを準備します。

  • BACPAC ファイルをダウンロードします。
  • Azure ストレージ アカウントを作成します。
  • ストレージ アカウントに BLOB コンテナーを作成します。
  • BACPAC ファイルをコンテナーにアップロードします。
  • ストレージ アカウント キー、BLOB の URL、リソース グループ名、および場所を表示します。
  1. [使ってみる] を選択すると、Cloud Shell が開きます。 次の PowerShell スクリプトをコピーし、シェル ウィンドウに貼り付けます。

    $projectName = Read-Host -Prompt "Enter a project name that is used to generate Azure resource names"
    $location = Read-Host -Prompt "Enter the location (i.e. centralus)"
    
    $resourceGroupName = "${projectName}rg"
    $storageAccountName = "${projectName}store"
    $containerName = "bacpacfiles"
    $bacpacFileName = "SQLDatabaseExtension.bacpac"
    $bacpacUrl = "https://github.com/Azure/azure-docs-json-samples/raw/master/tutorial-sql-extension/SQLDatabaseExtension.bacpac"
    
    # Download the bacpac file
    Invoke-WebRequest -Uri $bacpacUrl -OutFile "$HOME/$bacpacFileName"
    
    # Create a resource group
    New-AzResourceGroup -Name $resourceGroupName -Location $location
    
    # Create a storage account
    $storageAccount = New-AzStorageAccount -ResourceGroupName $resourceGroupName `
                                           -Name $storageAccountName `
                                           -SkuName Standard_LRS `
                                           -Location $location
    $storageAccountKey = (Get-AzStorageAccountKey -ResourceGroupName $resourceGroupName `
                                                  -Name $storageAccountName).Value[0]
    
    # Create a container
    New-AzStorageContainer -Name $containerName -Context $storageAccount.Context
    
    # Upload the BACPAC file to the container
    Set-AzStorageBlobContent -File $HOME/$bacpacFileName `
                             -Container $containerName `
                             -Blob $bacpacFileName `
                             -Context $storageAccount.Context
    
    Write-Host "The project name:        $projectName `
      The location:            $location `
      The storage account key: $storageAccountKey `
      The BACPAC file URL:     https://$storageAccountName.blob.core.windows.net/$containerName/$bacpacFileName `
      "
    
    Write-Host "Press [ENTER] to continue ..."
    
  2. ストレージ アカウント キー、BACPAC ファイルの URL、プロジェクト名、および場所を保存します。 それらの値は、このチュートリアルの後半でテンプレートをデプロイするときに使用します。

クイック スタート テンプレートを開く

このチュートリアルで使用されているテンプレートは、GitHub に保存されています。

  1. Visual Studio Code から、 [ファイル]>[ファイルを開く] を選択します。

  2. [ファイル名] に以下の URL を貼り付けます。

    https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/tutorial-sql-extension/azuredeploy.json
    
  3. [開く] を選択して、ファイルを開きます。

    テンプレートで定義されている 2 つのリソースがあります。

  4. [ファイル]>[Save As](名前を付けて保存) を選択し、このファイルのコピーを azuredeploy.json という名前でローカル コンピューターに保存します。

テンプレートの編集

  1. parameters セクションの末尾に 2 つのパラメーターを追加して、ストレージ アカウント キーと BACPAC URL を設定します。

        "storageAccountKey": {
          "type":"string",
          "metadata":{
            "description": "Specifies the key of the storage account where the BACPAC file is stored."
          }
        },
        "bacpacUrl": {
          "type":"string",
          "metadata":{
            "description": "Specifies the URL of the BACPAC file."
          }
        }
    

    adminPassword プロパティの閉じ中かっこ (}) の後に、コンマを追加します。 Visual Studio Code から JSON ファイルの形式を設定するには、Shift + Alt + F キーを押します。

  2. テンプレートに 2 つのリソースを追加します。

    • SQL Database 拡張機能で BACPAC ファイルをインポートできるようにするには、Azure サービスからのトラフィックを許可する必要があります。 SQL サーバーがデプロイされると、ファイアウォール ルールによって、 [Azure サービスおよびリソースにこのサーバーへのアクセスを許可する] の設定が有効になります。

      次のファイアウォール規則をサーバー定義の下に追加します。

      "resources": [
        {
          "type": "firewallrules",
          "apiVersion": "2021-02-01-preview",
          "name": "AllowAllAzureIps",
          "location": "[parameters('location')]",
          "dependsOn": [
            "[parameters('databaseServerName')]"
          ],
          "properties": {
            "startIpAddress": "0.0.0.0",
            "endIpAddress": "0.0.0.0"
          }
        }
      ]
      

      次の例は、更新後のテンプレートを示しています。

      ファイアウォール定義を含むテンプレートのスクリーンショット。

    • 次の JSON を使用して、SQL データベース拡張機能リソースをデータベース定義に追加します。

      "resources": [
        {
          "type": "extensions",
          "apiVersion": "2014-04-01",
          "name": "Import",
          "dependsOn": [
            "[resourceId('Microsoft.Sql/servers/databases', parameters('databaseServerName'), parameters('databaseName'))]"
          ],
          "properties": {
            "storageKeyType": "StorageAccessKey",
            "storageKey": "[parameters('storageAccountKey')]",
            "storageUri": "[parameters('bacpacUrl')]",
            "administratorLogin": "[parameters('adminUser')]",
            "administratorLoginPassword": "[parameters('adminPassword')]",
            "operationMode": "Import"
          }
        }
      ]
      

      次の例は、更新後のテンプレートを示しています。

      SQL Database 拡張機能を含むテンプレートのスクリーンショット。

      リソース定義を理解するには、API バージョンの SQL Database 拡張機能のリファレンスに関するページを参照してください。 以下にいくつかの重要な要素を示します。

      • dependsOn:拡張機能リソースは、データベースが作成された後に作成される必要があります。
      • storageKeyType:使用するストレージ キーの種類を指定します。 値は StorageAccessKeySharedAccessKey のいずれかにできます。 このチュートリアルでは StorageAccessKey を使用します。
      • storageKey:BACPAC ファイルが格納されているストレージ アカウントのキーを指定します。 ストレージ キーの種類が SharedAccessKey の場合、その前に "?" を付ける必要があります。
      • storageUri:ストレージ アカウントに格納されている BACPAC ファイルの URL を指定します。
      • administratorLogin: SQL 管理者のアカウント名。
      • administratorLoginPassword: SQL 管理者のパスワード。 生成されたパスワードを使用するには、「前提条件」を参照してください。

次の例に、完成したテンプレートを示します。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "databaseServerName": {
      "type": "string",
      "defaultValue": "[concat('server-', uniqueString(resourceGroup().id, deployment().name))]",
      "metadata": {
        "description": "Specifies the name for the SQL server"
      }
    },
    "databaseName": {
      "type": "string",
      "defaultValue": "[concat('db-', uniqueString(resourceGroup().id, deployment().name), '-1')]",
      "metadata": {
        "description": "Specifies the name for the SQL database under the SQL server"
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Specifies the location for server and database"
      }
    },
    "adminUser": {
      "type": "string",
      "metadata": {
        "description": "Specifies the username for admin"
      }
    },
    "adminPassword": {
      "type": "securestring",
      "metadata": {
        "description": "Specifies the password for admin"
      }
    },
    "storageAccountKey": {
      "type": "string",
      "metadata": {
        "description": "Specifies the key of the storage account where the BACPAC file is stored."
      }
    },
    "bacpacUrl": {
      "type": "string",
      "metadata": {
        "description": "Specifies the URL of the BACPAC file."
      }
    }
  },
  "resources": [
    {
      "type": "Microsoft.Sql/servers",
      "apiVersion": "2021-02-01-preview",
      "name": "[parameters('databaseServerName')]",
      "location": "[parameters('location')]",
      "properties": {
        "administratorLogin": "[parameters('adminUser')]",
        "administratorLoginPassword": "[parameters('adminPassword')]",
        "version": "12.0"
      },
      "resources": [
        {
          "type": "firewallrules",
          "apiVersion": "2021-02-01-preview",
          "name": "AllowAllAzureIps",
          "location": "[parameters('location')]",
          "dependsOn": [
            "[parameters('databaseServerName')]"
          ],
          "properties": {
            "startIpAddress": "0.0.0.0",
            "endIpAddress": "0.0.0.0"
          }
        }
      ]
    },
    {
      "type": "Microsoft.Sql/servers/databases",
      "apiVersion": "2021-02-01-preview",
      "name": "[concat(string(parameters('databaseServerName')), '/', string(parameters('databaseName')))]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[concat('Microsoft.Sql/servers/', parameters('databaseServerName'))]"
      ],
      "resources": [
        {
          "type": "extensions",
          "apiVersion": "2014-04-01",
          "name": "Import",
          "dependsOn": [
            "[resourceId('Microsoft.Sql/servers/databases', parameters('databaseServerName'), parameters('databaseName'))]"
          ],
          "properties": {
            "storageKeyType": "StorageAccessKey",
            "storageKey": "[parameters('storageAccountKey')]",
            "storageUri": "[parameters('bacpacUrl')]",
            "administratorLogin": "[parameters('adminUser')]",
            "administratorLoginPassword": "[parameters('adminPassword')]",
            "operationMode": "Import"
          }
        }
      ]
    }
  ]
}

テンプレートのデプロイ

BACPAC ファイルを準備したときに使用したプロジェクトの名前と場所を使用します。 これにより、すべてのリソースが同じリソース グループに配置され、リソースを削除するときに役立ちます。

  1. Cloud Shell にサインインします。

  2. 左上隅から [PowerShell] を選択します。

    ファイルをアップロードするオプションを含む PowerShell の Azure Cloud Shell のスクリーンショット。

  3. [ファイルのアップロード/ダウンロード] を選択し、azuredeploy. json ファイルをアップロードします。

  4. テンプレートをデプロイするには、次のスクリプトをコピーし、シェル ウィンドウに貼り付けます。

    $projectName = Read-Host -Prompt "Enter the same project name that is used earlier"
    $adminUsername = Read-Host -Prompt "Enter the SQL admin username"
    $adminPassword = Read-Host -Prompt "Enter the admin password" -AsSecureString
    $storageAccountKey = Read-Host -Prompt "Enter the storage account key"
    $bacpacUrl = Read-Host -Prompt "Enter the URL of the BACPAC file"
    $resourceGroupName = "${projectName}rg"
    
    New-AzResourceGroupDeployment `
        -ResourceGroupName $resourceGroupName `
        -adminUser $adminUsername `
        -adminPassword $adminPassword `
        -TemplateFile "$HOME/azuredeploy.json" `
        -storageAccountKey $storageAccountKey `
        -bacpacUrl $bacpacUrl
    
    Write-Host "Press [ENTER] to continue ..."
    

デプロイを検証する

クライアント コンピューターからサーバーにアクセスするには、ファイアウォール規則を追加する必要があります。 クライアントの IP アドレスと、サーバーへの接続に使用される IP アドレスは、ネットワーク アドレス変換 (NAT) のために異なる場合があります。 詳細については、「IP ファイアウォール規則の作成および管理」を参照してください。

たとえば、クエリ エディターにサインインすると、IP アドレスが許可されていないことを示すメッセージが表示されます。 アドレスは、NAT のために、クライアントの IP アドレスと異なります。 メッセージのリンクを選択して、IP アドレスにファイアウォール規則を追加します。 完了したら、サーバーのファイアウォールと仮想ネットワークの設定から IP アドレスを削除できます。

Azure portal で、リソース グループからデータベースを選択します。 [クエリ エディター (プレビュー)] を選択し、管理者の資格情報を入力します。 データベースにインポートされた 2 つのテーブルが表示されます。

Azure portal のクエリ エディター (プレビュー) のスクリーンショット。

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

デプロイした Azure リソースが不要になったら、リソース グループを削除します。 リソース グループ、ストレージ アカウント、SQL サーバー、SQL データベースが削除されます。

  1. Azure portal で、検索ボックスに「リソース グループ」と入力します。
  2. [名前でフィルター] フィールドに、リソース グループ名を入力します。
  3. リソース グループ名を選択します。
  4. [リソース グループの削除] を選択します。
  5. 削除を確認するには、リソース グループ名を入力して [削除] を選択します。

次のステップ

このチュートリアルでは、サーバーとデータベースをデプロイして、BACPAC ファイルをインポートしました。 テンプレート デプロイのトラブルシューティング方法については、次のトピックを参照してください。