簡體   English   中英

如何使用 SAS 密鑰向 Azure 表存儲發出 Invoke-RestMethod GET 和 PUT 請求

[英]How to make Invoke-RestMethod GET and PUT requests to Azure table storage using SAS key

這是一個由兩部分組成的問題。 我正在自動化以下任務:a) 需要來自我的 Azure 表的信息和 b) 需要更新我的 Azure 表中的特定實體。 我目前已經能夠通過使用提供的 2 個訪問密鑰中的任何一個來實現這一點,但認為這是一種不安全的做法,並且想要為不同的組定義單獨的策略,因此想要過渡到使用生成的 SAS 密鑰。

a) 我目前可以使用 SAS 策略來檢索整個表並找到我需要的信息,但我認為更好的方法是執行一個單獨的查詢,該查詢只提取與我正在尋找的特定屬性匹配的單個實體(例如 pull與客戶 ID 匹配的實體的所有屬性:“000000001”)。 如何更改我的代碼以完成此操作?

$tableName = "accountTD"
$sasReadToken = '<SAS token here>'
$tableUri = "https://$storageAccount.table.core.windows.net/$tableName$sasReadToken"

$GMTTime = (Get-Date).ToUniversalTime().toString('R')
$header = @{
    'x-ms-date' = $GMTTime;
    Accept = 'application/json;odata=nometadata'
}

$finalResult = Invoke-WebRequest -Uri $tableUri -Headers $header -UseBasicParsing
$finalResult = $finalResult.Content | ConvertFrom-Json
$finalResult.value 

b) 我還需要更新表中的相同實體,但似乎無法弄清楚如何使用我生成的 SAS 密鑰對其進行授權。 我不確定是否使用 Invoke-WebRequest 或 Invoke-RestMethod 或如何處理它們中的任何一個。 這是我迄今為止根據我的研究所做的。

function addUpdateEntity ($tableName, $PartitionKey, $RowKey, $entity){

    $sasReadToken = '<SAS token here>'
    $resource = "$tableName(PartitionKey='$PartitionKey',RowKey='$Rowkey')"
    $tableUri = "https://$storageAccount.table.core.windows.net/$tableName$sasReadToken"

    $GMTTime = (Get-Date).ToUniversalTime().toString('R')
    $header = @{
        'x-ms-date' = $GMTTime;
        Accept = 'application/json;odata=nometadata'
    }

    $body = $entity | ConvertTo-Json
    $item = Invoke-RestMethod -Method PUT -Uri $tableUri -Headers $headers -Body $body -ContentType application/json
}

$mBody = @{
    PartitionKey = "MPS02000"
    RowKey = "2019-000101"
    appUpdateMode = "1"
    m_CustID = "000000001"
}

addUpdateEntity -TableName "atdMachines" -PartitionKey $mBody.PartitionKey -RowKey $mBody.RowKey -entity $mBody

一季度。 拉取與客戶 ID 匹配的實體的所有屬性

答:您可以使用$filter查詢表達式。 例如,我的testTable有 2 個實體:

在此處輸入圖片說明

我可以通過發出如下請求來獲取Id等於00001的實體:

獲取https://storagetest789.table.core.windows.net/testTable?{sastoken}&$filter=(Id eq '00001')

$storageAccount = "storagetest789"
$tableName = "testTable"
$sasReadToken = "?sv=2019-02-02&ss=t&sr***************D"
$filter = "`$filter=(Id eq '00001')"
$tableUri = "https://$storageAccount.table.core.windows.net/$tableName$sasReadToken&$filter"

$GMTTime = (Get-Date).ToUniversalTime().toString('R')
$header = @{
    'x-ms-date' = $GMTTime;
    Accept = 'application/json;odata=nometadata'
}

$finalResult = Invoke-WebRequest -Uri $tableUri -Headers $header -UseBasicParsing
$finalResult = $finalResult.Content | ConvertFrom-Json
$finalResult.value 

結果:

在此處輸入圖片說明

Q2。 更新表中的同一實體

答: Invoke-WebRequestInvoke-RestMethod都適合在這里Invoke-RestMethod HTTP 請求。 我在您的腳本中發現了一些錯誤,這是已修復的錯誤:

function addUpdateEntity ($tableName, $PartitionKey, $RowKey, $entity){
    $storageAccount = "storagetest789"
    $tableName = "testTable"

    # Need write access 
    $sasWriteToken = "?sv=2019-02-02&ss=t&s*****************************D"

    $resource = "$tableName(PartitionKey='$PartitionKey',RowKey='$Rowkey')"

    # should use $resource, not $tableNmae
    $tableUri = "https://$storageAccount.table.core.windows.net/$resource$sasWriteToken"

    # should be headers, because you use headers in Invoke-RestMethod
    $headers = @{
        Accept = 'application/json;odata=nometadata'
    }

    $body = $entity | ConvertTo-Json
    $item = Invoke-RestMethod -Method PUT -Uri $tableUri -Headers $headers -Body $body -ContentType application/json
}

$mBody = @{
    PartitionKey = "p1"
    RowKey = "r1"
    Id = "00001"
    Value = "new value"
}

addUpdateEntity -TableName "atdMachines" -PartitionKey $mBody.PartitionKey -RowKey $mBody.RowKey -entity $mBody

結果:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM