Azure:用容器创建存储账户,并在Python中上传blob到它。

问题描述 投票:0回答:1

我试图在Azure中创建一个存储帐户,并使用他们的python SDK上传一个blob.I设法创建一个帐户,像这样。

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?

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

这个方法可行,但我觉得George Chen的答案更优雅。

python azure azure-storage azure-storage-blobs
1个回答
2
投票

我可以重现这个问题,然后我发现 get_client_from_auth_file 无法将凭证传给 BlobServiceClient,因为如果只是创建 BlobServiceClientaccount_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')
© www.soinside.com 2019 - 2024. All rights reserved.