Vývoj pro Azure NetApp Files pomocí rozhraní REST API pomocí PowerShellu
Rozhraní REST API pro službu Azure NetApp Files definuje operace HTTP s prostředky, jako je účet NetApp, fond kapacity, svazky a snímky. Tento článek vám pomůže začít používat rozhraní REST API služby Azure NetApp Files pomocí PowerShellu.
Specifikace rozhraní REST API služby Azure NetApp Files
Specifikace rozhraní REST API pro Azure NetApp Files se publikuje prostřednictvím GitHubu:
https://github.com/Azure/azure-rest-api-specs/tree/main/specification/netapp/resource-manager
Přístup k rozhraní REST API služby Azure NetApp Files
Ve svém ID Microsoft Entra vytvořte instanční objekt:
Ověřte, že máte dostatečná oprávnění.
Do Azure CLI zadejte následující příkaz:
$RBAC_SP = az ad sp create-for-rbac --name <YOURSPNAMEGOESHERE> --role Contributor --scopes /subscriptions/<subscription-id> | ConvertFrom-Json
Pokud chcete zobrazit informace instančního objektu, zadejte
$RBAC_SP
a stiskněte Enter.appId : appID displays here displayName : displayName name : http://SP_Name password : super secret password tenant : your tenant shows here
Výstup je uložen v objektu
$RBAC_SP
proměnné . Použijeme$RBAC_SP.appId
hodnotu ,$RBAC_SP.password
a$RBAC_SP.tenant
hodnoty.
Vyžádání přístupového tokenu OAuth:
Příklady v tomto článku používají PowerShell. Můžete také použít různé nástroje rozhraní API, jako je Postman, Insomnia a Paw.
$RBAC_SP
Pomocí proměnné teď získáme nosný token.$body = "grant_type=client_credentials&client_id=$($RBAC_SP.appId)&client_secret=$($RBAC_SP.password)&resource=https://management.azure.com/" $BearerToken = Invoke-RestMethod -Method Post -body $body -Uri https://login.microsoftonline.com/$($RBAC_SP.tenant)/oauth2/token
Výstup poskytuje nosný token objekt. Přístupový token můžete zobrazit zadáním
$BearerToken.access_token
. Vypadá podobně jako v následujícím příkladu:eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Im5iQ3dXMTF3M1hrQi14VWFYd0tSU0xqTUhHUSIsImtpZCI6Im5iQ3dXMTF3M1hrQi14VWFYd0tSU0xqTUhHUSJ9
Zobrazený token je platný po dobu 3600 sekund. Potom musíte požádat o nový token. Token se uloží do proměnné a použije se v dalším kroku.
headers
Vytvořte objekt:$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.Add("Authorization", "Bearer $($BearerToken.access_token)") $headers.Add("Content-Type", "application/json")
Odešlete testovací volání a zahrňte token, který ověří váš přístup k rozhraní REST API:
$SubId = (Get-AzContext).Subscription.Id Invoke-RestMethod -Method Get -Headers $headers -Uri https://management.azure.com/subscriptions/$SubId/providers/Microsoft.Web/sites?api-version=2022-05-01
Příklady použití rozhraní API
Tento článek používá následující adresu URL pro směrný plán požadavků. Tato adresa URL odkazuje na kořen oboru názvů Služby Azure NetApp Files.
https://management.azure.com/subscriptions/$SUBID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.NetApp/netAppAccounts?api-version=2022-05-01
Před spuštěním následujících příkladů s vlastními hodnotami byste měli přiřadit hodnoty proměnných.
K proměnným PowerShellu se přistupuje zadáním $variablename
.
Proměnné PowerShellu se přiřazují pomocí .$variablename = “value”
$Region = “westus2"
$ResourceGroup = “MYTest-RG-63"
$ANFvnetname = “NetAppFilesVnet-63"
$ANFvnetCIDR = “10.63.64.0/18"
$ANFsubnet = “NetAppFilesSubnet-63"
$ANFsubnetCIDR = “10.63.120.0/28"
$ANFsubnetID = “/subscriptions/$SubID/resourceGroups/$ResourceGroup/providers/Microsoft.Network/virtualNetworks/$ANFvnetname/subnets/$ANFSubnet"
$ANFAccount = “TestoftheAPI"
$ANFCapacityPool = “ANFTestPool"
$ANFServicelevel = “Standard"
$ANFVolume = “ANFTestVolume"
$ANFVolumeShareName = “Share-TEST"
$ANFVolumesize = 100GB
$ANFSnapshot = “ANFTestSnapshot"
Příklady požadavků PUT
Požadavek PUT použijete k vytvoření nových objektů ve službě Azure NetApp Files, jak ukazuje následující příklady. Text požadavku PUT obsahuje data ve formátu JSON pro změny. Musí být součástí příkazu PowerShellu jako text nebo odkazovaný jako soubor. Pokud chcete odkazovat na tělo jako soubor, uložte příklad JSON do souboru a přidejte -body (Get-Content @<filename>)
ho do příkazu PowerShellu.
#create a NetApp account
$body = "{
`"name`": `"$ANFAccount`",
`"type`": `"Microsoft.NetApp/netAppAccounts`",
`"location`": `"$Region`",
`"properties`": {
`"name`": `"$ANFAccount`"
}
} "
$api_version = "2020-02-01"
Invoke-RestMethod -Method 'PUT' -Headers $headers -Body $body "https://management.azure.com/subscriptions/$SubID/resourceGroups/$ResourceGroup/providers/Microsoft.NetApp/netAppAccounts/$ANFAccount`?api-version=$api_version"
#create a capacity pool
$body = "{
`"location`": `"$Region`",
`"properties`": {
`"size`": " + 4TB + ",
`"serviceLevel`": `"Standard`"
}
}"
$api_version = "2020-02-01"
Invoke-RestMethod -Method 'PUT' -Headers $headers -Body $body "https://management.azure.com/subscriptions/$SubID/resourceGroups/$ResourceGroup/providers/Microsoft.NetApp/netAppAccounts/$ANFAccount/capacityPools/$ANFCapacityPool`?api-version=$api_version"
#create a volume
$body = "{
`"name`": `"$ANFVolume`",
`"type`": `"Microsoft.NetApp/netAppAccounts/capacityPools/volumes`",
`"location`": `"$Region`",
`"properties`": {
`"serviceLevel`": `"$ANFServicelevel`",
`"usageThreshold`": `"$ANFVolumesize`",
`"creationToken`": `"$ANFVolumeShareName`",
`"snapshotId`": `"`",
`"subnetId`": `"$ANFSubnetID`"
}
}"
$api_version = "2020-02-01"
Invoke-RestMethod -Method 'PUT' -Headers $headers -Body $body "https://management.azure.com/subscriptions/$SubID/resourceGroups/$ResourceGroup/providers/Microsoft.NetApp/netAppAccounts/$ANFAccount/capacityPools/$ANFCapacityPool/volumes/$ANFVolume`?api-version=$api_version"
#create a volume snapshot
$body = "{
`"name`": `"$ANFAccount/$ANFCapacityPool/$ANFVolume/$ANFSnapshot`",
`"type`": `"Microsoft.NetApp/netAppAccounts/capacityPools/Volumes/Snapshots`",
`"location`": `"$Region`",
`"properties`": {
`"name`": `"$ANFSnapshot`",
`"fileSystemId`": `"$FileSystemID`"
}
}"
$api_version = '2020-02-01'
Invoke-RestMethod -Method 'PUT' -Headers $headers -Body $body "https://management.azure.com/subscriptions/$SubID/resourceGroups/$ResourceGroup/providers/Microsoft.NetApp/netAppAccounts/$ANFAccount/capacityPools/$ANFCapacityPool/volumes/$ANFVolume/Snapshots/$ANFSnapshot`?api-version=$api_version"
Příklady JSON
Následující příklad ukazuje, jak vytvořit účet NetApp:
{
"name": "MYNETAPPACCOUNT",
"type": "Microsoft.NetApp/netAppAccounts",
"location": "westus2",
"properties": {
"name": "MYNETAPPACCOUNT"
}
}
Následující příklad ukazuje, jak vytvořit fond kapacity:
{
"name": "MYNETAPPACCOUNT/POOLNAME",
"type": "Microsoft.NetApp/netAppAccounts/capacityPools",
"location": "westus2",
"properties": {
"name": "POOLNAME",
"size": "4398046511104",
"serviceLevel": "Premium"
}
}
Následující příklad ukazuje, jak vytvořit nový svazek. (Výchozí protokol svazku je NFSV3.)
{
"name": "MYNEWVOLUME",
"type": "Microsoft.NetApp/netAppAccounts/capacityPools/volumes",
"location": "westus2",
"properties": {
"serviceLevel": "Premium",
"usageThreshold": "322122547200",
"creationToken": "MY-FILEPATH",
"snapshotId": "",
"subnetId": "/subscriptions/$SUBID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.Network/virtualNetworks/VNETGOESHERE/subnets/MYDELEGATEDSUBNET.sn"
}
}
Následující příklad ukazuje, jak vytvořit snímek svazku:
{
"name": "apitest2/apiPool01/apiVol01/snap02",
"type": "Microsoft.NetApp/netAppAccounts/capacityPools/Volumes/Snapshots",
"location": "westus2",
"properties": {
"name": "snap02",
"fileSystemId": "0168704a-bbec-da81-2c29-503825fe7420"
}
}
Poznámka:
Je potřeba zadat fileSystemId
pro vytvoření snímku. Hodnotu můžete získat fileSystemId
pomocí požadavku GET na svazek.
Příklady požadavků GET
Pokud prostředek neexistuje, dojde k chybě. Požadavek GET použijete k dotazování objektů služby Azure NetApp Files v předplatném, jak ukazuje následující příklady:
#get NetApp accounts
Invoke-RestMethod -Method Get -Headers $headers -Uri https://management.azure.com/subscriptions/$SUBID/resourceGroups/$ResourceGroup/providers/Microsoft.NetApp/netAppAccounts?api-version=2022-05-01 | ConvertTo-Json
#get capacity pools for NetApp account
Invoke-RestMethod -Method Get -Headers $headers -Uri https://management.azure.com/subscriptions/$SUBID/resourceGroups/$ResourceGroup/providers/Microsoft.NetApp/netAppAccounts/$ANFACCOUNT/capacityPools?api-version=2022-05-01 | ConvertTo-Json
#get volumes in NetApp account & capacity pool
Invoke-RestMethod -Method Get -Headers $headers -Uri https://management.azure.com/subscriptions/$SUBID/resourceGroups/$ResourceGroup/providers/Microsoft.NetApp/netAppAccounts/$ANFACCOUNT/capacityPools/$ANFCAPACITYPOOL/volumes?api-version=2022-05-01 | ConvertTo-Json
#get snapshots for a volume
Invoke-RestMethod -Method Get -Headers $headers -Uri https://management.azure.com/subscriptions/$SUBID/resourceGroups/$ResourceGroup/providers/Microsoft.NetApp/netAppAccounts/$ANFACCOUNT/capacityPools/$ANFCAPACITYPOOL/volumes/$ANFVOLUME/snapshots?api-version=2022-05-01 | ConvertTo-Json
Dokončení skriptů PowerShellu
Tato část ukazuje ukázkové skripty pro PowerShell.
<#
Disclaimer
The sample scripts are not supported under any Microsoft standard support program or service. The sample scripts are provided AS IS without warranty of any kind. Microsoft further disclaims all implied warranties including, without limitation, any implied warranties of merchantability or of fitness for a particular purpose. The entire risk arising out of the use or performance of the sample scripts and documentation remains with you. In no event shall Microsoft, its authors, or anyone else involved in the creation, production, or delivery of the scripts be liable for any damages whatsoever (including, without limitation, damages for loss of business profits, business interruption, loss of business information, or other pecuniary loss) arising out of the use of or inability to use the sample scripts or documentation, even if Microsoft has been advised of the possibility of such damages.
#>
$Region = "westus2"
$SubID = (Get-AzureRmContext).Subscription.Id
$MyRandomID = Get-Random -Minimum 100 -Maximum 999
$ResourceGroup = "MYTest-RG-" + $MyRandomID
$ANFAccount = "ANFTestAccount-$Region-" + $MyRandomID
$ANFCapacityPool = "ANFTestPool-$Region-" + $MyRandomID
$ANFVolume = "ANFTestVolume-$Region-" + $MyRandomID
$ANFVolumesize = 100GB
$ANFVolumeShareName = "Share-" + $MyRandomID
$ANFSnapshot = "ANFTestSnapshot-$Region-" + $MyRandomID
$ANFServicelevel = "Standard"
$Octet2 = Get-Random -Minimum 1 -Maximum 254
$ANFvnetname = "NetAppFilesVnet-$Octet2-$Region-" + $MyRandomID
$ANFvnetCIDR = "10.$Octet2.64.0/18"
$ANFsubnet = "NetAppFilesSubnet-$Octet2-$Region-" + $MyRandomID
$ANFsubnetCIDR = "10.$Octet2.120.0/28"
$vmsubnet = "VM-subnet-$Octet2-$Region-" + $MyRandomID
$vmsubnetCIDR = "10.$Octet2.121.0/24"
$BearerToken = (az account get-access-token | ConvertFrom-Json).accessToken
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Authorization", "Bearer $BearerToken")
$headers.Add("Content-Type", "application/json")
" ** Creating Resource Group $ResourceGroup *************"
$api_version = "2020-01-01"
$body = " {
`"location`": `"$Region`",
`"name`": `"$ResourceGroup`"
},"
$response = Invoke-RestMethod -Method 'PUT' -Headers $headers -Body $body -Uri "https://management.azure.com/subscriptions/$SubID/resourcegroups/$ResourceGroup`?api-version=$api_version"
While ($response.properties.provisioningState -notmatch "Succeeded") {
$response.properties.provisioningState
sleep 5
$response = Invoke-RestMethod -Method ‘GET’ -Headers $headers -Uri "https://management.azure.com/subscriptions/$SubID/resourceGroups/$ResourceGroup`?api-version=$api_version"
}
" ** Creating Virtual Network $ANFvnetname *************"
$body = "{
`"properties`": {
`"addressSpace`": {
`"addressPrefixes`": [
`"$ANFvnetCIDR`"
]
},
`"subnets`": [
{
`"name`": `"$ANFsubnet`",
`"properties`": {
`"addressPrefix`": `"$ANFsubnetCIDR`",
`"delegations`": [
{
`"name`": `"Microsoft.NetApp`",
`"properties`": {
`"serviceName`": `"Microsoft.NetApp/volumes`"
}
}
]
}
},
{
`"name`": `"$vmsubnet`",
`"properties`": {
`"addressPrefix`": `"$vmsubnetCIDR`"
}
}
]
},
`"location`": `"$Region`"
}"
$api_version = "2020-03-01"
$response = Invoke-RestMethod -Method 'PUT' -Headers $headers -Body $body -Uri "https://management.azure.com/subscriptions/$SubID/resourceGroups/$ResourceGroup/providers/Microsoft.Network/virtualNetworks/$ANFvnetname`?api-version=$api_version"
While ($response.properties.provisioningState -notmatch "Succeeded") {
sleep 5
$response = Invoke-RestMethod -Method ‘GET’ -Headers $headers -Uri "https://management.azure.com/subscriptions/$SubID/resourceGroups/$ResourceGroup/providers/Microsoft.Network/virtualNetworks/$ANFvnetname`?api-version=$api_version"
$response.properties.provisioningState
}
$ANFsubnetID = $response.properties.subnets.id[0]
" ** Creating ANF Account $ANFAccount *************"
$body = "{
`"name`": `"$ANFAccount`",
`"type`": `"Microsoft.NetApp/netAppAccounts`",
`"location`": `"$Region`",
`"properties`": {
`"name`": `"$ANFAccount`"
}
} "
$api_version = "2020-02-01"
$response = Invoke-RestMethod -Method 'PUT' -Headers $headers -Body $body -Uri "https://management.azure.com/subscriptions/$SubID/resourceGroups/$ResourceGroup/providers/Microsoft.NetApp/netAppAccounts/$ANFAccount`?api-version=$api_version"
$response.properties.provisioningState
While ($response.properties.provisioningState -notmatch "Succeeded") {
$response.properties.provisioningState
sleep 5
$response = Invoke-RestMethod -Method ‘GET’ -Headers $headers -Uri "https://management.azure.com/subscriptions/$SubID/resourceGroups/$ResourceGroup/providers/Microsoft.NetApp/netAppAccounts/$ANFAccount`?api-version=$api_version"
}
" ** Creating Capacity Pool $ANFCapacityPool *************"
$body = "{
`"location`": `"$Region`",
`"properties`": {
`"size`": " + 4TB + ",
`"serviceLevel`": `"Standard`"
}
}"
$api_version = "2020-02-01"
$response = Invoke-RestMethod -Method 'PUT' -Headers $headers -Body $body -Uri "https://management.azure.com/subscriptions/$SubID/resourceGroups/$ResourceGroup/providers/Microsoft.NetApp/netAppAccounts/$ANFAccount/capacityPools/$ANFCapacityPool`?api-version=$api_version"
$response.properties.provisioningState
While ($response.properties.provisioningState -notmatch "Succeeded") {
$response.properties.provisioningState
sleep 5
$response = Invoke-RestMethod -Method ‘GET’ -Headers $headers -Uri "https://management.azure.com/subscriptions/$SubID/resourceGroups/$ResourceGroup/providers/Microsoft.NetApp/netAppAccounts/$ANFAccount`?api-version=$api_version"
}
" ** Creating ANF Volume $ANFVolume *************"
$body = "{
`"name`": `"$ANFVolume`",
`"type`": `"Microsoft.NetApp/netAppAccounts/capacityPools/volumes`",
`"location`": `"$Region`",
`"properties`": {
`"serviceLevel`": `"$ANFServicelevel`",
`"usageThreshold`": `"$ANFVolumesize`",
`"creationToken`": `"$ANFVolumeShareName`",
`"snapshotId`": `"`",
`"subnetId`": `"$ANFSubnetID`"
}
}"
$api_version = "2020-02-01"
$response = Invoke-RestMethod -Method 'PUT' -Headers $headers -Body $body -Uri "https://management.azure.com/subscriptions/$SubID/resourceGroups/$ResourceGroup/providers/Microsoft.NetApp/netAppAccounts/$ANFAccount/capacityPools/$ANFCapacityPool/volumes/$ANFVolume`?api-version=$api_version"
While ($response.properties.provisioningState -notmatch "Succeeded") {
$response.properties.provisioningState
sleep 15
$response = Invoke-RestMethod -Method ‘GET’ -Headers $headers -Uri "https://management.azure.com/subscriptions/$SubID/resourceGroups/$ResourceGroup/providers/Microsoft.NetApp/netAppAccounts/$ANFAccount/capacityPools/$ANFCapacityPool/volumes/$ANFVolume`?api-version=$api_version"
}
$Volume = $response
$FileSystemID = $response.properties.fileSystemId
" ** Creating ANF Volume Snapshot $ANFSnapshot *************"
$body = "{
`"name`": `"$ANFAccount/$ANFCapacityPool/$ANFVolume/$ANFSnapshot`",
`"type`": `"Microsoft.NetApp/netAppAccounts/capacityPools/Volumes/Snapshots`",
`"location`": `"$Region`",
`"properties`": {
`"name`": `"$ANFSnapshot`",
`"fileSystemId`": `"$FileSystemID`"
}
}"
$api_version = '2020-02-01'
$response = Invoke-RestMethod -Method 'PUT' -Headers $headers -Body $body -Uri "https://management.azure.com/subscriptions/$SubID/resourceGroups/$ResourceGroup/providers/Microsoft.NetApp/netAppAccounts/$ANFAccount/capacityPools/$ANFCapacityPool/volumes/$ANFVolume/Snapshots/$ANFSnapshot`?api-version=$api_version"
While ($response.properties.provisioningState -notmatch "Succeeded") {
$response.properties.provisioningState
sleep 5
$response = Invoke-RestMethod -Method ‘GET’ -Headers $headers -Uri "https://management.azure.com/subscriptions/$SubID/resourceGroups/$ResourceGroup/providers/Microsoft.NetApp/netAppAccounts/$ANFAccount/capacityPools/$ANFCapacityPool/volumes/$ANFVolume/Snapshots/$ANFSnapshot`?api-version=$api_version"
}
Další kroky
Viz referenční informace k rozhraní REST API služby Azure NetApp Files