Invoke-AzRest を使って Azure の API を直接叩く
azure
Published: 2020-07-25

はじめに

Az モジュールに Azure の API を直接叩くための Invoke-AzRest コマンドが実装されました。

公式アナウンス:How to manage Azure resources with the new PowerShell Invoke-AzRestMethod cmdlet

Azure CLI が以前からサポートしてた az rest と同等の機能を持つコマンドです。このコマンド を利用すれば、PowerShell で API を直接叩く際に Get-AzContex 内のトークンを抽出するような前処理が不要になります。

試してみた

Invoke-AzRest コマンド は v4.4.0 で実装されました。Cloud Shell で Invoke-AzRest コマンドを利用できたので、 Azure Stack HCI のクラスタの情報を GET してみました。Invoke-AzRest に Path パラメータで API バージョン付きの URL を渡すだけです。超シンプル。

> Invoke-AzRest -Path "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-c5bd3103e127/resourceGroups/azshci-registration/providers/Microsoft.AzureStackHCI/clusters/azshciclus?api-version=2020-03-01-preview" -Method GET

Headers    : {[Cache-Control, System.String[]], [Pragma, System.String[]], [x-ms-ratelimit-remaining-subscription-reads, System.String[]], [x-ms-request-id,
             System.String[]]}
Version    : 1.1
StatusCode : 200
Method     : GET
Content    : {"id":"/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-c5bd3103e127/resourceGroups/azshci-registration/providers/Microsoft.AzureStackHCI/clusters/azshciclus","name":"azshciclus","type":"Microsoft.AzureStackHCI/clusters","location":"eastus","tags":{},"properties":{"provisioningState":"Succeeded","status":"Disconnected","cloudId":"xxxxxxxx-xxxx-xxxx-xxxx-524c347f2450","aadClientId":"xxxxxxxx-xxxx-xxxx-xxxx-fb5ffca293be","aadTenantId":"xxxxxxxx-xxxx-xxxx-xxxx-d69fad0f2565","reportedProperties":{"clusterName":"AZSHCICLUS","clusterId":"70244155-6423-4b03-bc01-0bfa88df252c","clusterVersion":"10.0.17784","nodes":[{"name":"AZSHCINODE01","id":1,"manufacturer":"Microsoft Corporation","model":"Virtual Machine","osName":"Azure Stack HCI","osVersion":"10.0.17784.1068","serialNumber":"1844-8425-4411-3410-9623-0336-66","coreCount":2,"memoryInGiB":4},{"name":"AZSHCINODE02","id":2,"manufacturer":"Microsoft Corporation","model":"VirtualMachine","osName":"Azure Stack HCI","osVersion":"10.0.17784.1068","serialNumber":"4452-2741-5854-6413-1790-0626-37","coreCount":2,"memoryInGiB":4}],"lastUpdated":"2020-07-23T04:00:00.3896307Z"},"trialDaysRemaining":28,"billingModel":"Trial"}}

API を直接たたいているので JSON の文字列が返ってきます。返ってきた文字列を ConvertFrom-Json してあげれば PowerShell で扱える形式になります。

> $res = Invoke-AzRest -Path "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-c5bd3103e127/resourceGroups/azshci-registration/providers/Microsoft.AzureStackHCI/clusters/azshciclus?api-version=2020-03-01-preview" -Method GET
> $res.Content | ConvertFrom-Json -Depth 100

id         : /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-c5bd3103e127/resourceGroups/azshci-registration/providers/Microsoft.AzureStackHCI/clusters/azshciclus
name       : azshciclus
type       : Microsoft.AzureStackHCI/clusters
location   : eastus
tags       :
properties : @{provisioningState=Succeeded; status=Disconnected; cloudId=xxxxxxxx-xxxx-xxxx-xxxx-524c347f2450; aadClientId=xxxxxxxx-xxxx-xxxx-xxxx-fb5ffca293be;aadTenantId=xxxxxxxx-xxxx-xxxx-xxxx-d69fad0f2565; reportedProperties=; trialDaysRemaining=28; billingModel=Trial}

GET ではなく PUT や POST を実行する場合は、更新したい内容を記載した JSON 文字列を payload パラメータで投げます。

参考:How to manage Azure resources with the new PowerShell Invoke-AzRestMethod cmdlet

振り返り

Az モジュールの v4.4.0 で実装された Invoke-AzRest を試しました。PowerShell で API を直接たたく方法がよりシンプルになりました。ありがたい。