Просмотр очереди сообщений лазурного хранилища завершается сбоем с помощью python, но работает через портал

Я пытаюсь программно получить доступ к очереди хранилища с помощью 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 и не имеет специальной конфигурации.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
247
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В соответствии с предоставленным вами кодом вы хотите использовать токен Azure AD для просмотра сообщений из хранилища очередей Azure. Если это так, вам необходимо назначить специальную роль Azure RABC (участник данных очереди хранилища, считыватель данных очереди хранилища и обработчик сообщений данных очереди хранилища) пользователю или субъекту-службе, который вы используете для входа в Azure CLI. Для получения более подробной информации, пожалуйста, обратитесь к здесь и здесь.

Например

  1. Назначьте роль 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>"
  1. Выйдите из системы и снова войдите в нее с помощью Azure CLI.
az logout
az login
az account set -s '<your subscription Id >'
  1. код
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)

Другие вопросы по теме

AzureStorage: серверу не удалось аутентифицировать запрос. Убедитесь, что значение заголовка Authorization сформировано правильно, включая подпись
Как скопировать всю структуру между учетными записями хранения в python
Как отфильтровать определенные значения в хранилище таблиц Azure в столбце?
Azure SDK IoT Storage без ключа учетной записи в той же среде в агенте
Проблема с получением большого двоичного объекта из хранилища Azure: Spring Boot
Не удается запросить хранилище таблиц Azure с помощью Azure CLI
Можно ли откатить транзакции таблицы хранилища Azure, чтобы не потерять данные?
Время от времени сбой запроса хранилища таблиц Azure из-за ошибки проверки подлинности (получено: запрещено)
Не удается получить доступ к созданной Pulumi таблице хранилища Azure — доступ запрещен (403)
У меня нет контейнера azure-webjobs-hosts в обозревателе хранилища azure, поэтому мое приложение-функция azure не запускается