Azure:使用容器创建存储帐户,然后在Python中将blob上载到其中

时间:2020-05-05 10:38:28

标签: python azure azure-storage azure-storage-blobs

我正在尝试在Azure中创建一个存储帐户,并使用其python SDK将blob上载到其中。 我设法创建了一个这样的帐户:

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上传blob时,我仍然需要“ account_url”,因此仍然出现错误:

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

任何人都可以帮助我了解如何获取使用SDK创建的存储帐户的account_url?

编辑: 通过从存储密钥创建连接字符串,我设法找到了解决该问题的方法。

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')

这行得通,但我稀薄的George Chen的回答更为优雅。

1 个答案:

答案 0 :(得分:2)

我可以重现此问题,然后我发现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')
相关问题