Azure: создать учетную запись хранения с контейнером и загрузить в него BLOB-объект в Python - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь создать учетную запись хранения в Azure и загрузить в нее большой двоичный объект, используя их python SDK. Мне удалось создать такую ​​учетную запись:

client = get_client_from_auth_file(StorageManagementClient)
storage_account = client.storage_accounts.create(
        resourceGroup,
        name,
        StorageAccountCreateParameters(
            sku=Sku(name=SkuName.standard_ragrs),
            enable_https_traffic_only=True,
            kind=Kind.storage,
            location=region)).result()

Проблема в том, что позже я пытаюсь создать контейнер и не знаю, что вставить как «account_url», который я пытался сделать:

client = get_client_from_auth_file(BlobServiceClient, account_url=storage_account.primary_endpoints.blob)
return client.create_container(name)

Но я получаю:

azure.core.exceptions.ResourceNotFoundError: The specified resource does not exist

Мне удалось создать контейнер, используя:

client = get_client_from_auth_file(StorageManagementClient)
return client.blob_containers.create(
    resourceGroup,
    storage_account.name,
    name,
    BlobContainer(),
    public_access=PublicAccess.Container
)

Но позже, когда Я пытаюсь загрузить большой двоичный объект с помощью BlobServiceClient или BlobClien. Мне все еще нужен "account_url", поэтому я все еще получаю сообщение об ошибке:

azure.core.exceptions.ResourceNotFoundError: The specified resource does not exist

Кто-нибудь может помочь мне понять, как получить account_url для учетной записи хранения, которую я создал с помощью SDK?

EDIT: Мне удалось найти способ решения проблемы, создав строку подключения из ключей хранилища.

storage_client = get_client_from_auth_file(StorageManagementClient)
storage_keys = storage_client.storage_accounts.list_keys(resource_group, account_name)
    storage_key = next(v.value for v in storage_keys.keys)
    return BlobServiceClient.from_connection_string(
        'DefaultEndpointsProtocol=https;' +
        f'AccountName={account_name};' +
        f'AccountKey={storage_key};' +
        'EndpointSuffix=core.windows.net')

Это работает, но я считаю, что ответ Джорджа Чена более элегантен.

1 Ответ

2 голосов
/ 06 мая 2020

Я мог воспроизвести эту проблему, затем я обнаружил, что get_client_from_auth_file не может передать учетные данные в BlobServiceClient, потому что, если просто создать BlobServiceClient с account_url без учетных данных, он также может распечатать имя учетной записи.

Итак, если вы хотите использовать учетные данные для получения BlobServiceClient, вы можете использовать приведенный ниже код, а затем выполнять другие операции.

credentials = ClientSecretCredential(
    'tenant_id',
    'application_id',
    'application_secret'
)

blobserviceclient=BlobServiceClient(account_url=storage_account.primary_endpoints.blob,credential=credentials)

Если вам не нужен этот способ, вы можете создать BlobServiceClient с ключом аккаунта.

client = get_client_from_auth_file(StorageManagementClient,auth_path='auth')

storage_account = client.storage_accounts.create(
        'group name',
        'account name',
        StorageAccountCreateParameters(
            sku=Sku(name=SkuName.standard_ragrs),
            enable_https_traffic_only=True,
            kind=Kind.storage,
            location='eastus',)).result()
storage_keys = client.storage_accounts.list_keys(resource_group_name='group name',account_name='account name')
storage_keys = {v.key_name: v.value for v in storage_keys.keys}
blobserviceclient=BlobServiceClient(account_url=storage_account.primary_endpoints.blob,credential=storage_keys['key1'])
blobserviceclient.create_container(name='container name')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...