У меня есть существующая учетная запись хранения/контейнер, в котором я могу перечислить все большие двоичные объекты с помощью AZ CLI:
[ ~ ]$ az storage blob list --account-name storageaccount20122022 --container-name test
There are no credentials provided in your command and environment, we will query for account key for your storage account.
It is recommended to provide --connection-string, --account-key or --sas-token in your command as credentials.
You also can add `--auth-mode login` in your command to use Azure Active Directory (Azure AD) for authorization if your login account is assigned required RBAC roles.
For more information about RBAC roles in storage, visit https://docs.microsoft.com/azure/storage/common/storage-auth-aad-rbac-cli.
In addition, setting the corresponding environment variables can avoid inputting credentials in your command. Please use --help to get more information about environment variable usage.
[
{
"container": "test",
"content": "",
...
}
]
Я хочу сделать то же самое с Python, это мой скрипт:
import sys
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient
def list_blobs_using_cli_credential(account_name, container_name):
credential = DefaultAzureCredential() # Also tried AzureCliCredential()
blob_service_client = BlobServiceClient(
account_url=f"https://{account_name}.blob.core.windows.net",
credential=credential
)
container_client = blob_service_client.get_container_client(container_name)
print(f"Listing blobs in {account_name}/{container_name} ...")
try:
blobs = container_client.list_blobs()
for blob in blobs:
print(blob.name)
except Exception as e:
print(f"Error listing blobs: {e}")
if __name__ == "__main__":
account_name = sys.argv[1]
container_name = sys.argv[2]
list_blobs_using_cli_credential(account_name, container_name)
Однако когда я запускаю это в той же оболочке, я получаю сообщение об ошибке:
[ ~ ]$ python list-blobs.py storageaccount20122022 test
Listing blobs in storageaccount20122022/test ...
Error listing blobs: This request is not authorized to perform this operation using this permission.
RequestId:466b2647-201e-0022-13fd-918e18000000
Time:2024-04-19T01:59:22.6413231Z
ErrorCode:AuthorizationPermissionMismatch
Content: <?xml version = "1.0" encoding = "utf-8"?><Error><Code>AuthorizationPermissionMismatch</Code><Message>This request is not authorized to perform this operation using this permission.
RequestId:466b2647-201e-0022-13fd-918e18000000
Time:2024-04-19T01:59:22.6413231Z</Message></Error>
Я могу перечислить учетные записи хранения и контейнер в каждой учетной записи из Python, но когда дело доходит до работы с большими двоичными объектами (список, удаление, загрузка), я не могу ничего сделать из Python, в то время как те же операции выполняются из AZ CLI.
Пробовал в двух разных аккаунтах Azure, совершенно не связанных между собой, в одном из них я владелец, но все равно то же самое.
Что делает AZ CLI, какие еще разрешения или роли он автоматически получает для выполнения операций с Blob? И как я могу сделать то же самое в своем коде Python?
Получение ErrorCode:AuthorizationPermissionMismatch при перечислении больших двоичных объектов из Python, когда интерфейс командной строки AZ работает с теми же учетными данными.
Команды Azure CLI
будут работать с доступом владельца для вывода списка больших двоичных объектов в учетной записи хранения, но при использовании Python для успешного выполнения операции может потребоваться определенная роль, например участник данных BLOB-объектов хранилища.
У меня есть роль владельца на уровне подписки. Я могу перечислить капли, используя Azure CLI
, но не Python
.
Результат команды Azure CLI
Результат кода Python
После назначения роли участника данных Storage Blob я могу перечислить все blobs
в container
.
Результат кода Python после назначения роли.
Кстати, ваши изображения не отображаются.
Вы можете обратиться к этой клиентской библиотеке хранилища BLOB-объектов Azure для Python для перечисления больших двоичных объектов в контейнерах и проблеме Git Hub по той же проблеме.
Пожалуйста, измените свою сеть на мобильную точку доступа или любую личную сеть. Иногда корпоративные сети блокируют изображения с imgur.
Спасибо, это хорошее начало. Однако как AZ CLI предполагает доступ владельца? Может ли Python сделать что-то подобное?