Как сделать запросы Invoke-RestMethod GET и PUT в Azure табличное хранилище с помощью ключа SAS - PullRequest
0 голосов
/ 10 февраля 2020

Это вопрос из двух частей. Я нахожусь в процессе автоматизации задач, которые а) требуют информацию из моей таблицы Azure и б) необходимо обновить определенные c сущности в моей таблице Azure. В настоящее время я смог выполнить sh, используя любой из 2 предоставленных ключей доступа, но считаю, что это небезопасная практика, и хочу определить отдельные политики для разных групп и поэтому хочу перейти на использование сгенерированных ключей SAS.

a) В настоящее время я могу использовать политики SAS для извлечения всей таблицы и поиска необходимой мне информации, но я думаю, что лучшим способом является выполнение отдельного запроса, который извлекает только одну сущность, которая соответствует указанному c свойству I ищу (например, вытащить все свойства объекта, который совпадает с идентификатором клиента: "000000001"). Как я могу изменить свой код для выполнения sh this?

$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 или как go о любой из них. Вот что я пока основал на своих исследованиях.

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

1 Ответ

1 голос
/ 10 февраля 2020

Q1. Извлечь все свойства объекта, который соответствует идентификатору клиента

Ответ: Вы можете использовать $filter выражение запроса. Например, у меня есть 2 сущности в моем testTable:

enter image description here

Я могу получить сущность, чья Id равна 00001, сделав запрос выглядит следующим образом:

GET 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 

Результат:

enter image description here

Q2. Обновите одну и ту же сущность в таблице

Ответ: и Invoke-WebRequest, и 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

Результат:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...