Я пытаюсь программно получить доступ к очереди хранилища с помощью python, но просмотр сообщений завершается с ошибкой аутентификации:
azure.core.exceptions.HttpResponseError: This request is not authorized to perform this operation using this permission.
RequestId:xxxx
Time:2020-12-10T08:03:46.1919000Z
ErrorCode:AuthorizationPermissionMismatch
Error:None
Мой код выглядит так:
from azure.storage.queue import (
QueueClient, TextBase64DecodePolicy
)
from azure.identity import AzureCliCredential
credential = AzureCliCredential()
DEFAULT_SUBSCRIPTION_ID = "xxx"
DEFAULT_POISON_QUEUE_NAME = "webjobs-blobtrigger-poison"
storage_account_name = "stxxx"
url = f"https://{storage_account_name}.queue.core.windows.net/{DEFAULT_POISON_QUEUE_NAME}"
client = QueueClient.from_queue_url(url, credential, message_decode_policy=TextBase64DecodePolicy())
properties = queue_client.get_queue_properties()
count = properties.approximate_message_count # works?!?
messages = queue_client.peek_messages(count) # exception
Обратите внимание, что учетная запись хранения была создана с помощью terraform и не имеет специальной конфигурации.
В соответствии с предоставленным вами кодом вы хотите использовать токен Azure AD для просмотра сообщений из хранилища очередей Azure. Если это так, вам необходимо назначить специальную роль Azure RABC (участник данных очереди хранилища, считыватель данных очереди хранилища и обработчик сообщений данных очереди хранилища) пользователю или субъекту-службе, который вы используете для входа в Azure CLI. Для получения более подробной информации, пожалуйста, обратитесь к здесь и здесь.
Например
Storage Queue Data Reader
пользователю или субъекту-службе.az role assignment create \
--role "Storage Queue Data Reader" \
--assignee <email> \
--scope "/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>"
az logout
az login
az account set -s '<your subscription Id >'
from azure.storage.queue import QueueClient, TextBase64DecodePolicy
from azure.identity import AzureCliCredential
credential = AzureCliCredential()
DEFAULT_POISON_QUEUE_NAME = "myqueue"
storage_account_name = "andyprivate"
url = f"https://{storage_account_name}.queue.core.windows.net/{DEFAULT_POISON_QUEUE_NAME}"
client = QueueClient.from_queue_url(
url, credential, message_decode_policy=TextBase64DecodePolicy())
properties = client .get_queue_properties()
count = properties.approximate_message_count
print(count)
messages = client.peek_messages(count)
for message in messages:
print("Message: " + message.content)