Azure可以拒绝随机生成的资源名称。是否有任何Powershell cmdlet来检查这些名称?
我知道有一个Test-AzureName。但它只适用于有限类型的资源。对我的用例来说还不够。 (存储,SQL,DNS,公共IP)
我知道有这个REST-API。但是当我通过Invoke-RestMethod调用它时,它会返回一个错误:{" error":{" code":" AuthenticationFailed"," message&# 34;:"身份验证失败。授权'标题丢失。"}}
我对Powershell不是很擅长,有人可以指出我使用Azure Powershell cmdlet执行此类任务或帮助我使REST-API工作吗?
谢谢!
答案 0 :(得分:5)
Invoke-RestMethod
与" Check resource name" REST API足以满足您的需求。但是,你需要做一些准备。
首先,您需要创建一个Active Directory应用程序。
有关此内容的详情,请参阅Create Active Directory application and service principal using portal
以下脚本将为您提供适当的REST API标头。
try{
$subscription = Get-AzureRmSubscription
}
catch{
Login-AzureRmAccount
$subscription = Get-AzureRmSubscription
}
$tenantId = $subscription.TenantId
#these are the client id and key you get from the above steps.
$clientId = "<your client id>"
$key = "<your key>"
$authUrl = "https://login.windows.net/${tenantId}"
$AuthContext = [Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext]$authUrl
$cred = New-Object Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential $clientId,$key
$result = $AuthContext.AcquireToken("https://management.core.windows.net/",$cred)
$authHeader = @{
'Content-Type'='application/json'
'Authorization'=$result.CreateAuthorizationHeader()
}
$URI = "https://management.azure.com/providers/microsoft.resources/checkresourcename?api-version=2014-01-01"
Invoke-RestMethod -Uri $URI -Method POST -Headers $authHeader -Body "{'Name':'<the name you want to test>','Type':'<the resource type you want to test>'}"
答案 1 :(得分:0)
问题的核心是如何为 Invoke-Rest 构建身份验证 http标头以满足Azure要求。您可以按照以下方式执行此操作
更多细节,您可以参考How to authenticate Azure Rest API with Azure Service Principal by Powershell获取完整的示例代码。
答案 2 :(得分:0)
如上所述,大多数提供程序都有一个名为checkNameAvailability(https://docs.microsoft.com/en-us/search/?search=checkNameAvailability&scope=REST)的API,您可以使用它来查看名称是否已被使用或在全球范围内是唯一的。我将其中一些包装在PowerShell函数中。参见https://secureinfra.blog/2019/11/07/test-azure-resource-name-availability/