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 つのプロパティを定義します。
roleDefinitionId
、principalId
、scope
が必要です。
ロールの定義
ロールの定義 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
を使用します。
Get-AzureRMADUser、Get-AzureRMADGroup、または Get-AzureRMADServicePrincipal PowerShell コマンドレットを使用することで、ObjectId を取得できます。 これらのコマンドレットによって、ID プロパティがある Active Directory オブジェクトが 1 つまたはその一覧が返されます。これが必要なオブジェクト ID です。 次の例では、会社の単一ユーザーのオブジェクト ID を取得する方法を示します。
$userObjectId = (Get-AzureRmADUser -UserPrincipalName 'email@company.com').Id
Get-MgUser、Get-MgGroup、Get-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-AzureRmResourceGroupDeployment PowerShell コマンドレットを使用して、Resource Manager テンプレートをデプロイします。 次の例のコマンドでは、ユーザー、グループ、またはサービス プリンシパルをラボに対する DevTest Labs ユーザー ロールに割り当てます。
New-AzureRmResourceGroupDeployment -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-AzureRmResourceGroupDeployment -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-AzureRMRoleAssignment コマンドレットを使用してこれを行います。 このコマンドレットには、柔軟性のために多くの省略可能なパラメーターがあります。
ObjectId
、SigninName
、または ServicePrincipalName
は、アクセス許可を付与されているオブジェクトとして指定できます。
指定されたラボで DevTest Labs ユーザー ロールにユーザーを追加する、サンプルの Azure PowerShell コマンドは次のとおりです。
New-AzureRmRoleAssignment -UserPrincipalName <email@company.com> -RoleDefinitionName 'DevTest Labs User' -ResourceName '<Lab Name>' -ResourceGroupName '<Resource Group Name>' -ResourceType 'Microsoft.DevTestLab/labs'
アクセス許可が付与されているリソースを指定するには、ResourceName
、ResourceType
、ResourceGroup
の組み合わせ、または scope
パラメーターによって指定できます。 どのパラメーターの組み合わせが使用されていても、Active Directory オブジェクト (ユーザー、グループ、またはサービス プリンシパル)、スコープ (リソース グループまたはリソース)、ロールの定義を一意に識別するために、コマンドレットに十分な情報を提供します。
Azure CLI の使用
Azure CLI で、az role assignment create
コマンドを使用して、ラボ ユーザーをラボに追加します。 Azure CLI コマンドレットの詳細については、「Azure CLI を使用して Azure でのロールの割り当てを追加または削除する」を参照してください。
アクセス権が付与されているオブジェクトは、objectId
、signInName
、spn
パラメーターによって指定できます。 オブジェクトにアクセス権が付与されているラボは、scope
URL または resource-name
、resource-type
、resource-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>
次のステップ
次の記事をご覧ください。