【Azure Developer】如何透過Azure Portal快速獲取到對應操作的API並轉換為Python程式碼

路边两盏灯發表於2024-05-15

問題描述

對於Azure資源進行配置操作,門戶上可以正常操作。但是想透過Python程式碼實現,這樣可以批次處理。那麼在沒有SDK的情況下,是否有快速辦法呢?

【Azure Developer】如何透過Azure Portal快速獲取到對應操作的API並轉換為Python程式碼

問題解答

當然可以,Azure Portal上操作的所有資源都是透過REST API來實現的,所以只要找到正確的API,就可以透過瀏覽器中抓取到的請求Body/Header來實現轉換為Python程式碼。

第一步:開啟瀏覽器開發者模式(F12), 檢視操作所傳送的API請求

比如在操作對Resource group 進行Tags修改的時候,抓取到傳送的請求為:https://management.chinacloudapi.cn/batch?api-version=2020-06-01, 所以把它的URL, Authorization,Payload內容都複製到文字編輯器中。

【Azure Developer】如何透過Azure Portal快速獲取到對應操作的API並轉換為Python程式碼

第二步:複製請求的Body/Header,特別是Authorization

從第一步發出的請求中複製的內容示例:

Host URL: https://management.chinacloudapi.cn/batch?api-version=2020-06-01
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6InpfMk...........
Payload:
{"requests":[{"content":{"operation":"Replace","properties":{"tags":{"test":"test","test1":"test2"}}},
"httpMethod":"PATCH","name":"xxxx-xx8","requestHeaderDetails":{"commandName":"HubsExtension.ArmTags.patchResourceTags"},
"url":"/subscriptions/xxxxxxxxxxxxx/resourceGroups/adls-rg/providers/Microsoft.Resources/tags/default?api-version=2019-10-01"}]}

複製好請求的Body,Header等資訊後,組合成可以正確使用的URL, Authorization,Request Body。

  • URL 為 host + payload中的url ,拼接後的正確值是 :https://management.chinacloudapi.cn/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxx/resourceGroups/<resource group name>/providers/Microsoft.Resources/tags/default?api-version=2019-10-01
  • Body 內容為Payload中的content資訊,所以是:{"operation":"Replace","properties":{"tags":{"test":"test","test1":"test2"}}}

第三步:在Postman等傳送API的工具中測試請求是否成功,本處使用 VS Code 外掛 Thunder Client

把第二步中的內容,填入到傳送REST API的工具中驗證,結果顯示 200,修改成功。

【Azure Developer】如何透過Azure Portal快速獲取到對應操作的API並轉換為Python程式碼

第四步:轉換為Python程式碼,並測試執行是否成功

在Thunder Client的Response視窗點選“{ }” 按鈕,並選擇Python 語言,複製示例程式碼。

【Azure Developer】如何透過Azure Portal快速獲取到對應操作的API並轉換為Python程式碼

Python示例程式碼(替換為正確的Access Token 和 SubscriptionID , Resource Group名稱後,程式碼正常執行):

import http.client
import json

conn = http.client.HTTPSConnection("management.chinacloudapi.cn")

headersList = {
 "Accept": "*/*",
 "User-Agent": "Thunder Client (https://www.thunderclient.com)",
 "Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJ.......",
 "Content-Type": "application/json" 
}

payload = json.dumps({
  "operation": "Replace",
  "properties": {
    "tags": {
      "test": "test",
      "test1": "test2"
    }
  }
})

conn.request("PATCH", "/subscriptions/xxxxxxxxx/resourceGroups/xxxx/providers/Microsoft.Resources/tags/default?api-version=2019-10-01", payload, headersList)
response = conn.getresponse()
result = response.read()

print(result.decode("utf-8"))

第五步:用Python Code替換 hardcode Authorization

使用azure.identity來完成認證和顯示獲取AccessToken

from azure.identity import DefaultAzureCredential 

##get access token
credential = DefaultAzureCredential()
accessToken = credential.get_token("https://management.chinacloudapi.cn/.default")
print(accessToken.token)

在結合第四步的Python程式碼後,就可以實現實時獲取Access Token,並Python程式碼傳送REST API.

【Azure Developer】如何透過Azure Portal快速獲取到對應操作的API並轉換為Python程式碼

完整示例程式碼:

import http.client
import json
from azure.identity import DefaultAzureCredential 

##get access token
credential = DefaultAzureCredential()

accessToken = credential.get_token("https://management.chinacloudapi.cn/.default")

#print(accessToken.token)

## Send API
conn = http.client.HTTPSConnection("management.chinacloudapi.cn")

headersList = {
 "Accept": "*/*",
 "User-Agent": "Thunder Client (https://www.thunderclient.com)",
 "Authorization": "Bearer " +accessToken.token,
 "Content-Type": "application/json" 
}

payload = json.dumps({
  "operation": "Replace",
  "properties": {
    "tags": {
      "test": "test",
      "test1": "test2"
    }
  }
})

conn.request("PATCH", "/subscriptions/xxxxxxxxxxxxxx/resourceGroups/xxxxxxxx/providers/Microsoft.Resources/tags/default?api-version=2019-10-01", payload, headersList)
response = conn.getresponse()
result = response.read()

print(result.decode("utf-8"))

參考資料

Thunder Client for VS Code : https://www.thunderclient.com/

相關文章