Azure DevTest Labs でのラボへのラボ ユーザーの追加を自動化する

Azure DevTest Labs によって、Azure portal を使用することにより、セルフサービスの開発テスト環境をすばやく作成できます。 しかし、複数のチームがあり、いくつかの DevTest Labs インスタンスがある場合、作成プロセスの自動化によって時間を節約できます。 Azure Resource Manager テンプレートでは、ラボ、ラボ VM、カスタム イメージ、数式を作成し、自動でユーザーを追加できます。 この記事では、DevTest Labs インスタンスにユーザーを追加することに特に焦点を絞って説明します。

ユーザーをラボに追加するには、ラボに DevTest Labs ユーザー ロールを追加します。 この記事では、以下の方法のいずれかを使用して、ユーザーのラボへの追加を自動化する方法を示します。

  • Azure Resource Manager のテンプレート
  • Azure PowerShell コマンドレット
  • Azure CLI。

Azure リソース マネージャー テンプレートの使用

次のサンプルの Resource Manager テンプレートでは、ラボの DevTest Labs ユーザー ロールに追加されるユーザーを指定します。

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "principalId": {
      "type": "string",
      "metadata": {
        "description": "The objectId of the user, group, or service principal for the role."
      }
    },
    "labName": {
      "type": "string",
      "metadata": {
        "description": "The name of the lab instance to be created."
      }
    },
    "roleAssignmentGuid": {
      "type": "string",
      "metadata": {
        "description": "Guid to use as the name for the role assignment."
      }
    }
  },
  "variables": {
    "devTestLabUserRoleId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/111111111-0000-0000-11111111111111111')]",
    "fullDevTestLabUserRoleName": "[concat(parameters('labName'), '/Microsoft.Authorization/', parameters('roleAssignmentGuid'))]",
    "roleScope": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', resourceGroup().name, '/providers/Microsoft.DevTestLab/labs/', parameters('labName'))]"
  },
  "resources": [
    {
      "apiVersion": "2016-05-15",
      "type": "Microsoft.DevTestLab/labs",
      "name": "[parameters('labName')]",
      "location": "[resourceGroup().location]"
    },
    {
      "apiVersion": "2016-07-01",
      "type": "Microsoft.DevTestLab/labs/providers/roleAssignments",
      "name": "[variables('fullDevTestLabUserRoleName')]",
      "properties": {
        "roleDefinitionId": "[variables('devTestLabUserRoleId')]",
        "principalId": "[parameters('principalId')]",
        "scope": "[variables('roleScope')]"
      },
      "dependsOn": [
        "[resourceId('Microsoft.DevTestLab/labs', parameters('labName'))]"
      ]
    }
  ]
}

ラボを作成するのと同じテンプレートでロールを割り当てている場合、ロールの割り当てリソースとラボの間に依存関係を追加することを忘れないでください。 詳細については、Azure Resource Manager のテンプレートでの依存関係の定義に関するページを参照してください。

ロールの割り当てリソースに関する情報

ロールの割り当てリソースでは、種類と名前を指定する必要があります。

最初に注意することは、リソースの種類はリソース グループ用になる Microsoft.Authorization/roleAssignments ではないということです。 代わりに、リソースの種類はパターン {provider-namespace}/{resource-type}/providers/roleAssignments に従います。 この場合、リソースの種類は Microsoft.DevTestLab/labs/providers/roleAssignments になります。

ロールの割り当て名自体は、グローバルに一意である必要があります。 割り当ての名前には、パターン {labName}/Microsoft.Authorization/{newGuid} が使用されます。 newGuid はテンプレート用のパラメーター値です。 これによって、ロールの割り当てが一意であることが確認されます。 GUID を作成するためのテンプレート関数がないので、任意の GUID ジェネレーター ツールを使用することで、GUID 自体を生成する必要があります。

テンプレートで、ロールの割り当ての名前は fullDevTestLabUserRoleName 変数によって定義されます。 テンプレートからの正確な行は次のとおりです。

"fullDevTestLabUserRoleName": "[concat(parameters('labName'), '/Microsoft.Authorization/', parameters('roleAssignmentGuid'))]"

ロールの割り当てリソースのプロパティ

ロールの割り当て自体で 3 つのプロパティを定義します。 roleDefinitionIdprincipalIdscope が必要です。

ロールの定義

ロールの定義 ID は、既存のロールの定義に対する文字列 ID です。 このロール ID は /subscriptions/{subscription-id}/providers/Microsoft.Authorization/roleDefinitions/{role-definition-id} のフォームに含まれます。

サブスクリプション ID は、subscription().subscriptionId テンプレート関数を使用することによって取得されます。

DevTest Labs User 組み込みロールに対するロールの定義を取得する必要があります。 DevTest Labs ユーザー ロールの GUID を取得するには、Role Assignments REST API または Get-AzRoleDefinition コマンドレットを使用できます。

$dtlUserRoleDefId = (Get-AzRoleDefinition -Name "DevTest Labs User").Id

ロール ID は変数セクションで定義され、devTestLabUserRoleId という名前が付けられます。 テンプレートで、ロール ID は次のように設定されます: 111111111-0000-0000-11111111111111111。

"devTestLabUserRoleId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/111111111-0000-0000-11111111111111111')]",

プリンシパル ID

プリンシパル ID は、ラボにラボ ユーザーとして追加する必要がある Active Directory ユーザー、グループ、またはサービス プリンシパルのオブジェクト ID です。 テンプレートでは、パラメーターとして ObjectId を使用します。

PowerShell コマンドレット Get-AzADUserGet-AzADGroup、または Get-AzADServicePrincipal を使って、ObjectId を取得できます。 これらのコマンドレットによって、ID プロパティがある Active Directory オブジェクトが 1 つまたはその一覧が返されます。これが必要なオブジェクト ID です。 次の例では、会社の単一ユーザーのオブジェクト ID を取得する方法を示します。

$userObjectId = (Get-AzADUser -UserPrincipalName 'email@company.com').Id

Get-MgUserGet-MgGroupGet-MgServicePrincipal を含む Microsoft Graph PowerShell コマンドレットを使用することもできます。

Scope

スコープでは、ロールの割り当てを適用する必要があるリソースまたはリソース グループを指定します。 リソースには、スコープは次のフォームに含まれます: /subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/{provider-namespace}/{resource-type}/{resource-name}。 テンプレートでは、subscription-id パーツに入力するための subscription().subscriptionId 関数および resource-group-name パーツに入力するための resourceGroup().name テンプレート関数を使用します。 これらの関数を使用することは、ロールを割り当てるラボが、現在のサブスクリプション、およびテンプレートのデプロイが行われる同じリソース グループに存在する必要があるということを意味します。 最後のパーツ resource-name は、ラボの名前です。 この値は、この例ではテンプレート パラメーターによって受け取ります。

テンプレートのロール スコープ

"roleScope": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', resourceGroup().name, '/providers/Microsoft.DevTestLab/labs/', parameters('labName'))]"

テンプレートのデプロイ

まず、Resource Manager テンプレートのパラメーターに値を渡す、パラメーター ファイル (例: azuredeploy.parameters.json) を作成します。

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "principalId": {
      "value": "aaaaaaaa-bbbb-cccc-1111-222222222222"
    },
    "labName": {
      "value": "MyLab"
    },
    "roleAssignmentGuid": {
      "value": "22222222-2222-2222-2222-222222222222"
    }
  }
}

次に、New-AzResourceGroupDeployment PowerShell コマンドレットを使って、Resource Manager テンプレートをデプロイします。 次の例のコマンドでは、ユーザー、グループ、またはサービス プリンシパルをラボに対する DevTest Labs ユーザー ロールに割り当てます。

New-AzResourceGroupDeployment -Name "MyLabResourceGroup-$(New-Guid)" -ResourceGroupName 'MyLabResourceGroup' -TemplateParameterFile .\azuredeploy.parameters.json -TemplateFile .\azuredeploy.json

注意

グループのデプロイ名とロールの割り当て GUID は、一意である必要があります。 一意ではない GUID を使用してリソースの割り当てをデプロイしようとすると、RoleAssignmentUpdateNotPermitted エラーが発生します。

いくつかの Active Directory オブジェクトを自分のラボに対する DevTest Labs ユーザー ロールに追加するために、テンプレートを数回使用する場合は、PowerShell コマンドで動的オブジェクトを使用することを検討してください。 次の例では、New-Guid コマンドレットを使用して、リソース グループのデプロイ名とロールの割り当て GUID を動的に指定します。

New-AzResourceGroupDeployment -Name "MyLabResourceGroup-$(New-Guid)" -ResourceGroupName 'MyLabResourceGroup' -TemplateFile .\azuredeploy.json -roleAssignmentGuid "$(New-Guid)" -labName "MyLab" -principalId "aaaaaaaa-bbbb-cccc-1111-222222222222"

Azure PowerShell の使用

概要で説明されているように、新しい Azure のロールの割り当てを作成して、ラボに対する DevTest Labs ユーザー ロールにユーザーを追加します。 PowerShell で、New-AzRoleAssignment コマンドレットを使ってそれを行います。 このコマンドレットには、柔軟性のために多くの省略可能なパラメーターがあります。 ObjectIdSigninName、または ServicePrincipalName は、アクセス許可を付与されているオブジェクトとして指定できます。

指定されたラボで DevTest Labs ユーザー ロールにユーザーを追加する、サンプルの Azure PowerShell コマンドは次のとおりです。

New-AzRoleAssignment -UserPrincipalName <email@company.com> -RoleDefinitionName 'DevTest Labs User' -ResourceName '<Lab Name>' -ResourceGroupName '<Resource Group Name>' -ResourceType 'Microsoft.DevTestLab/labs'

アクセス許可が付与されているリソースを指定するには、ResourceNameResourceTypeResourceGroup の組み合わせ、または scope パラメーターによって指定できます。 どのパラメーターの組み合わせが使用されていても、Active Directory オブジェクト (ユーザー、グループ、またはサービス プリンシパル)、スコープ (リソース グループまたはリソース)、ロールの定義を一意に識別するために、コマンドレットに十分な情報を提供します。

Azure CLI の使用

Azure CLI で、az role assignment create コマンドを使用して、ラボ ユーザーをラボに追加します。 Azure CLI コマンドレットの詳細については、「Azure CLI を使用して Azure でのロールの割り当てを追加または削除する」を参照してください。

アクセス権が付与されているオブジェクトは、objectIdsignInNamespn パラメーターによって指定できます。 オブジェクトにアクセス権が付与されているラボは、scope URL または resource-nameresource-typeresource-group パラメーターの組み合わせによって識別できます。

次の Azure CLI の例は、指定されたラボに対する DevTest Labs ユーザー ロールにユーザーを追加する方法を示します。

az role assignment create --roleName "DevTest Labs User" --signInName <email@company.com> -–resource-name "<Lab Name>" --resource-type "Microsoft.DevTestLab/labs" --resource-group "<Resource Group Name>" --role Contributor --scope /subscriptions/<SubscriptionID>/resourceGroups/<ResourceGroupName>

次のステップ

次の記事をご覧ください。