ARM テンプレートから環境を作成する

Azure DevTest Labs環境を利用して、複数の仮想マシン(VM)やPaaS(プラットフォーム・アズ・ア・サービス)リソースでラボを簡単かつ一貫してプロビジョニングできます。 この記事では、 Azure Resource Manager (ARM) テンプレートから DevTest Labs 環境を作成する方法について説明します。 このアプローチを使って、SQLデータベースバックエンドを持つウェブアプリのような多層的なウェブアプリケーションのラボを作成します。

DevTest Labs 環境のリソースは、同じライフサイクルを共有します。 それらを一緒に管理し、個々の VM のコストを追跡するのと同じように、ラボ環境内の個々の PaaS リソースのコストを追跡できます。

パブリックまたはプライベートの Git テンプレート リポジトリから ARM 環境テンプレートを使用するようにラボを構成できます。 次の図は、DevTest Labs がパブリック リポジトリまたはプライベート リポジトリの ARM テンプレートを使用して、VM やその他のリソースを含む環境をデプロイする方法を示しています。

Git リポジトリから ARM テンプレートを取得し、それらを使用して PaaS リソースを使用して環境をデプロイする方法を示す図。

前提条件

  • ラボのテンプレート リポジトリを追加または構成するには、少なくともラボの 共同作成者 アクセス許可。
  • 利用可能なARMテンプレートからDevTest Labs環境を作成するには、少なくともLab内の DevTestユーザー 権限が必要です。
  • 環境の作成の自動化で PowerShell スクリプトを実行するには、Az.Resources モジュールがインストールされた Azure PowerShell。

テンプレート展開のためのサブスクリプション権限を割り当てる

組織がテンプレート管理にサブスクリプションスコープ権限が必要な場合は、サブスクリプションスコープにAzure Lab Services Contributorの役割を割り当ててください。

Important

DevTest Labsの環境作成においても、Labユーザーは最低でもLabに対して DevTestユーザー 権限が必要です。 Azure Lab Services Contributorの役割はDevTest Labsのラボレベルの権限を置き換えるものではありません。

  1. Azureポータルでサブスクリプションを開きます。
  2. アクセス制御 (IAM)>を選択し、追加>ロールの割り当てを追加します。
  3. Azure Lab Services Contributorを検索して選択してください。
  4. 「次」を選択し、ユーザー、グループ、またはサービスプリンシパルを選択し、レビュー+割り当てを選択します。

最小権限アクセスを実現するには、広範なサブスクリプション全体の権限ではなく、テンプレートとラボのワークフローに必要な権限のみを含むカスタム ロールを使用してください。

以下のカスタムロールの例は、DevTest Labsの環境作成およびデプロイ可視性へのアクセスを制限します。 テンプレートで必要なアクションだけを追加してください。

{
    "Name": "DevTest Labs Environment Template Deployer",
    "Description": "Create and read DevTest Labs environments from approved ARM templates.",
    "Actions": [
        "Microsoft.Authorization/*/read",
        "Microsoft.DevTestLab/labs/read",
        "Microsoft.DevTestLab/labs/EnsureCurrentUserProfile/action",
        "Microsoft.DevTestLab/labs/CreateEnvironment/action",
        "Microsoft.DevTestLab/labs/artifactSources/armTemplates/read",
        "Microsoft.DevTestLab/labs/policySets/EvaluatePolicies/action",
        "Microsoft.DevTestLab/labs/users/environments/read",
        "Microsoft.DevTestLab/labs/users/environments/write",
        "Microsoft.Resources/deployments/read",
        "Microsoft.Resources/deployments/operations/read",
        "Microsoft.Resources/subscriptions/resourceGroups/read"
    ],
    "NotActions": [],
    "DataActions": [],
    "NotDataActions": [],
    "AssignableScopes": [
        "/subscriptions/<subscription-id>"
    ]
}

制限事項

DevTest Labs の ARM 環境テンプレートから作成された環境には、次の制限があります。

  • VM の 自動シャットダウン機能 はサポートされていません。

  • 次のラボ ポリシーは適用も評価もされません。

    • ラボ ユーザーあたりの VM 数
    • ユーザーあたりの Premium VM 数
    • ユーザーあたりの Premium ディスクの数

    たとえば、ラボ ポリシーで各ユーザーが最大 5 つの VM を作成することしか許可されていない場合でも、ユーザーは多数の VM を作成する ARM 環境テンプレートをデプロイできます。

ラボのテンプレート リポジトリを構成する

DevTest Labs パブリック ARM テンプレート リポジトリおよび他のパブリックまたはプライベート Git リポジトリから ARM 環境テンプレートを使用するようにラボを構成できます。 テンプレートリポジトリへのアクセスをラボに許可すると、ラボユーザーはAzureポータルでテンプレートを選択して迅速に環境を作成できます。

DevTest Labsの公開ARMテンプレートリポジトリには、Web App with SQL DatabaseやAzure Service Fabricクラスタサンプルなどの事前作成済み環境テンプレートが含まれています。 PaaS リソースでスムーズに作業を開始できるように、テンプレートには最小限の入力パラメーターがあります。

パブリック環境テンプレートをそのまま使用するか、ニーズに合わせてカスタマイズすることができます。 GitHub パブリック テンプレート リポジトリに対して pull request を送信することで、パブリック テンプレートの修正や追加を提案することもできます。

環境テンプレートを他のパブリックまたはプライベート Git リポジトリに格納し、それらのリポジトリをラボに追加して、すべてのラボ ユーザーがテンプレートを使用できるようにすることもできます。 手順については、「 Git リポジトリに ARM テンプレートを格納する 」および「 テンプレート リポジトリをラボに追加する」を参照してください。

パブリック環境設定を構成する

新規または既存のラボの DevTest Labs パブリック テンプレート リポジトリ へのラボ アクセスを有効にすることができます。 リポジトリへのアクセスを有効にすると、ラボ ユーザーが使用できるようにする環境テンプレートを選択できます。

新しいラボのパブリック環境アクセスを構成する

新しいラボを作成するときにパブリック環境リポジトリへのアクセスを構成するには、[基本設定] タブで [パブリック環境] オプションを [オン] または [オフ] に設定します。 このオプションは既定で [オン] に設定されています。

ラボ作成プロセス中にラボのパブリック環境リポジトリを有効にする方法を示すスクリーンショット。

既存のラボのパブリック環境アクセスを構成する

既存のラボのパブリック環境リポジトリアクセスを有効または無効にするには:

  1. ラボの Azure portal[概要] ページで、左側のナビゲーション メニューの [設定][構成とポリシー] を選択します。

  2. [ 構成とポリシー] ページで、左側のメニューの [仮想マシン ベース ] を展開し、[ パブリック環境] を選択します。

  3. [ パブリック環境 ] ページで、[ このラボのパブリック環境を有効にする] オプションを [はい ] または [いいえ] に設定します。

    既存のラボ リソース対してすべてのパブリック環境リポジトリを有効にする方法を示すスクリーンショット。

  4. [保存] を選択します。

使用可能なパブリック環境テンプレートを選択する

ラボのパブリック環境リポジトリを有効にすると、リポジトリ内のすべての環境テンプレートがラボ ユーザーが既定で使用できるようになります。 選択したテンプレートへのアクセスを無効にすることもできます。 無効になっているテンプレートは、ユーザーが作成できる環境の一覧に表示されなくなります。

特定の環境テンプレートへのアクセスを禁止するには:

  1. ラボの Azure portal の [構成とポリシー>仮想マシン ベース>パブリック環境 ] ページで、無効にする環境の横にあるチェック ボックスをオフにします。

  2. [保存] を選択します。

ユーザーがアクセスできなくなるように、ラボのパブリック環境リポジトリの選択を解除する方法を示すスクリーンショット。

環境ユーザーのアクセス許可を構成する

デフォルトでは、ラボユーザーは作成した環境で リーダー の役割が割り当てられます。 閲覧者は、SQL サーバーやデータベースなどの環境リソースを停止、開始、または変更することはできません。 ラボユーザーが自分の環境内のリソースを編集できるようにするために、その環境のリソースグループ内で 貢献者 の役割を付与します。

  1. ラボの Azure portal[概要] ページで、左側のナビゲーション メニューの [設定][構成とポリシー] を選択します。

  2. [ 構成とポリシー ] ページで、左側のメニューの [設定] を展開し、[ ラボの設定] を選択します。

  3. [ ラボの設定] ページの [ 環境アクセス] で、[ リソース グループのユーザー権限 ] オプションを [共同作成者] に設定します。

  4. [保存] を選択します。

DevTest Labs でラボ ユーザーに共同作成者ロールのアクセス許可を設定する方法を示すスクリーンショット。

テンプレートから環境を作成する

ラボを公開またはプライベートテンプレートリポジトリに設定すれば、利用可能なARMテンプレートを選択して環境を作成できます。 テンプレートから環境を作成するには、次の手順に従います。

  1. ラボの Azure portalの [概要] ページで、左側のナビゲーション メニューの [マイ ラボ] の下にある [マイ環境] を選択します。

  2. [ マイ環境 ] ページで、[ 追加] を選択します。

  3. Baseを選択する 」ページで 「SQL Database付きのWebアプリ」を選択してください。

    Azure DevTest Labsで利用可能な環境テンプレートから選択したSQL Database付きのWebAppのスクリーンショットです。

  4. 「追加」ペインで環境名を入力し、ウェブアプリやSQLデータベースリソースの他のパラメータ設定を設定します。

    Azure DevTest LabsでWeb AppをSQLデータベースで選択し、環境設定を入力する様子を示すスクリーンショットです。

    • 各 ARM 環境テンプレートには、一意のパラメーターが含まれています。 環境を追加するときは、赤いアスタリスクで示される、すべての必須パラメーターの値を入力する必要があります。
    • azuredeploy.parameters.json ARM テンプレート ファイルの一部のパラメーター値では、[追加] ウィンドウに既定値のない空白の設定フィールドが生成されます。 これらの値には、 GEN-UNIQUEGEN-UNIQUE-[N]GEN-SSH-PUB-KEY、および GEN-PASSWORDが含まれます。
    • パスワードなどの セキュリティで保護された文字列 パラメーターには、Azure Key Vault のシークレットを使用できます。 詳細については、「 Azure Key Vault にシークレットを格納する」を参照してください。
  5. [] を選択し、[] を追加します。 環境のプロビジョニングがすぐに開始されます。

環境をプロビジョニングするプロセスには長い時間がかかる場合があります。 合計時間は、DevTest Labs によってラボ環境の一部として作成されるサービス インスタンス、VM、その他のリソース数によって変わります。

[ マイ環境 ] ページでプロビジョニングの状態を監視できます。 ツール バーの [更新 ] を選択してページ ビューを更新し、現在の状態を確認します。 プロビジョニングの進行中は、環境の状態が "作成中" になります。 プロビジョニングが完了すると、状態は "準備完了" に変わります。

ラボ環境のプロビジョニング状態を確認する方法を示すスクリーンショット。

デプロイでは、ARM テンプレートが定義したすべての環境リソースをプロビジョニングする新しいリソース グループが作成されます。 [ マイ環境 ] ボックスの一覧で環境を選択すると、テンプレートによって作成されたすべてのリソースグループとリソースが表示されます。

リストからリソースを選択してプロパティや利用可能なアクションを確認してください。

環境の作成を自動化する

開発またはテストシナリオ用に複数の環境を作成する必要がある場合は、Azure PowerShell または Azure CLI を使用して、ARM テンプレートから環境のデプロイを自動化できます。 次の手順では、Azure PowerShell New-AzResource コマンドを使用して ARM 環境テンプレートのデプロイを自動化する方法を示します。

Azure CLI az deployment group create コマンドを使用してデプロイを自動化することもできます。 詳細については、ARM テンプレートと Azure CLI を使用したソースのデプロイ方法に関する記事を参照してください。

  1. ARM 環境テンプレートを Git リポジトリに格納 し、 ラボにリポジトリを追加します。

  2. 次の PowerShell スクリプトを deployenv.ps1としてコンピューターに保存します。 このスクリプトでは、ARM テンプレートを呼び出して、ラボに環境を作成します。

    #Requires -Module Az.Resources
    
    [CmdletBinding()]
    
    param (
    # ID of the Azure subscription for the lab
    [string] [Parameter(Mandatory=$true)] $SubscriptionId,
    
    # Name of the lab in which to create the environment
    [string] [Parameter(Mandatory=$true)] $LabName,
    
    # Name of the template repository connected to the lab
    [string] [Parameter(Mandatory=$true)] $RepositoryName,
    
    # Name of the template (folder name in the GitHub repository)
    [string] [Parameter(Mandatory=$true)] $TemplateName,
    
    # Name of the environment to create in the lab
    [string] [Parameter(Mandatory=$true)] $EnvironmentName,
    
    # The parameters to pass to the template. Each parameter is prefixed with "-param_".
    # For example, if the template has a parameter named "TestVMName" with a value of "MyVMName",
    # the string in $Params is "-param_TestVMName MyVMName".
    # This convention allows the script to dynamically handle different templates.
    [Parameter(ValueFromRemainingArguments=$true)]
        $Params
    )
    
    # Sign in to Azure, or comment out this statement to completely automate environment creation.
    Connect-AzAccount
    
    # Select the subscription for your lab.  
    Set-AzContext -SubscriptionId $SubscriptionId | Out-Null
    
    # Get the user ID to use later in the script.
    $UserId = $((Get-AzADUser -UserPrincipalName ((Get-AzContext).Account).Id).Id)
    
    # Get the lab location.
    $lab = Get-AzResource -ResourceType "Microsoft.DevTestLab/labs" -Name $LabName
    if ($lab -eq $null) { throw "Unable to find lab $LabName in subscription $SubscriptionId." }
    
    # Get information about the repository connected to your lab.
    $repository = Get-AzResource -ResourceGroupName $lab.ResourceGroupName `
        -ResourceType 'Microsoft.DevTestLab/labs/artifactsources' `
        -ResourceName $LabName `
        -ApiVersion 2016-05-15 `
        | Where-Object { $RepositoryName -in ($_.Name, $_.Properties.displayName) } `
        | Select-Object -First 1
    if ($repository -eq $null) { throw "Unable to find repository $RepositoryName in lab $LabName." }
    
    # Get information about the ARM template base for the environment.
    $template = Get-AzResource -ResourceGroupName $lab.ResourceGroupName `
        -ResourceType "Microsoft.DevTestLab/labs/artifactSources/armTemplates" `
        -ResourceName "$LabName/$($repository.Name)" `
        -ApiVersion 2016-05-15 `
        | Where-Object { $TemplateName -in ($_.Name, $_.Properties.displayName) } `
        | Select-Object -First 1
    if ($template -eq $null) { throw "Unable to find template $TemplateName in lab $LabName." }
    
    # Build the template parameters by using parameter names and values.
    $parameters = Get-Member -InputObject $template.Properties.contents.parameters -MemberType NoteProperty | Select-Object -ExpandProperty Name
    $templateParameters = @()
    
    # Extract the custom parameters from $Params and format them as name/value pairs.
    $Params | ForEach-Object {
        if ($_ -match '^-param_(.*)' -and $Matches[1] -in $parameters) {
            $name = $Matches[1]                
        } elseif ( $name ) {
            $templateParameters += @{ "name" = "$name"; "value" = "$_" }
            $name = $null #reset name variable
        }
    }
    
    # Create an object to hold the necessary template properties.
    $templateProperties = @{ "deploymentProperties" = @{ "armTemplateId" = "$($template.ResourceId)"; "parameters" = $templateParameters }; }
    
    # Deploy the environment in your lab by using the New-AzResource command.
    New-AzResource -Location $Lab.Location `
        -ResourceGroupName $lab.ResourceGroupName `
        -Properties $templateProperties `
        -ResourceType 'Microsoft.DevTestLab/labs/users/environments' `
        -ResourceName "$LabName/$UserId/$EnvironmentName" `
        -ApiVersion '2016-05-15' -Force
    
    Write-Output "Environment $EnvironmentName completed."
    
  3. スクリプトを使用するには、次のコマンドを実行します。 コマンド内のプレースホルダーを独自のラボ値で更新します。

    .\DeployLabEnvironment.ps1 `
        -SubscriptionId "<Subscription ID>" `
        -LabName "<LabName>" `
        -ResourceGroupName "<LabResourceGroupName>" `
        -RepositoryName "<TemplateRepoName>" `
        -TemplateName "<TemplateFolderName>" `
        -EnvironmentName "<EnvironmentName>"