gpt4 book ai didi

python-3.x - Python sdk将blob从容器复制到容器

转载 作者:行者123 更新时间:2023-12-03 00:55:47 32 4
gpt4 key购买 nike

我希望有人能帮助解决这个让我有点困惑的问题。

我正在尝试为存储容器制作备份复制脚本。我想要实现的是将容器的内容从容器 A 复制到容器 B。

为了让我的案例场景更清楚,这是我的存储结构。

存储A:

storageaccountout 
|--- Containers
|---- new blob
|---newfile.txt

在存储帐户 A 中,我有一个名为 newblob 的容器,在这个 blob 中我只有一个文件。

另一方面,我有存储空间 B

存储B:

Storageaccountin
|--- Containers

存储 B 没有任何内容,只有默认的 blob $logs

我想做的是将容器 A blob 复制到容器 B blob 中。

我有这个脚本:

from azure.storage.blob import BlobClient, BlobServiceClient
from azure.storage.blob import ResourceTypes, AccountSasPermissions
from azure.storage.blob import generate_account_sas
from datetime import *


# Source Client
connection_string = 'connection.string' # The connection string for the source container
account_key = 'key' # The account key for the source container
source_container_name = 'newblob' # Name of container which has blob to be copied
blob_name = 'lastfile.txt' # Name of the blob you want to copy
destination_container_name = 'incontainer' # Name of container where blob will be copied


# Target Client
target_connection_string = 'connection-string'
target_account_key = 'key'
source_container_name = source_container_name
target_blob_name = 'newfile.txt'
target_destination_blob = 'newblob'
# Create client
client = BlobServiceClient.from_connection_string(connection_string)

# Create target client
target_client = BlobServiceClient.from_connection_string(target_connection_string)

# Create sas token for blob
sas_token = generate_account_sas(
account_name = client.account_name,
account_key = account_key,
resource_types = ResourceTypes(object=True, container=True),
permission= AccountSasPermissions(read=True,list=True),
# start = datetime.now(),
expiry = datetime.utcnow() + timedelta(hours=4) # Token valid for 4 hours
)

# Create blob client for source blob
source_blob = BlobClient(
client.url,
container_name = source_container_name,
blob_name = blob_name,
credential = sas_token
)


# target client

target_sas_token = generate_account_sas(
account_name = target_client.account_name,
account_key = target_account_key,
resource_types = ResourceTypes(object=True, container=True),
permission= AccountSasPermissions(read=True,list=True),
# start = datetime.now(),
expiry = datetime.utcnow() + timedelta(hours=4) # Token valid for 4 hours
)

# Create blob client for source blob
source_blob = BlobClient(
target_client.url,
container_name = source_container_name,
blob_name = target_blob_name,
credential = target_sas_token
)

# Create new blob and start copy operation.
# new_blob = client.get_blob_client(destination_container_name, blob_name)
new_blob = client.get_blob_client(target_destination_blob, target_blob_name)
new_blob.start_copy_from_url(source_blob.url)

现在,当我运行此脚本时,出现以下错误:

Traceback (most recent call last):
File "/Users/user/miniforge3/lib/python3.9/site-packages/azure/storage/blob/_blob_client.py", line 1922, in start_copy_from_url
return self._client.blob.start_copy_from_url(**options)
File "/Users/user/miniforge3/lib/python3.9/site-packages/azure/storage/blob/_generated/operations/_blob_operations.py", line 2280, in start_copy_from_url
raise HttpResponseError(response=response, model=error)
azure.core.exceptions.HttpResponseError: Operation returned an invalid status 'Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/Users/user/Desktop/AzCopy/blob.py", line 35, in <module>
new_blob.start_copy_from_url(source_blob.url)
File "/Users/user/miniforge3/lib/python3.9/site-packages/azure/core/tracing/decorator.py", line 83, in wrapper_use_tracer
return func(*args, **kwargs)
File "/Users/user/miniforge3/lib/python3.9/site-packages/azure/storage/blob/_blob_client.py", line 1924, in start_copy_from_url
process_storage_error(error)
File "/Users/user/miniforge3/lib/python3.9/site-packages/azure/storage/blob/_shared/response_handlers.py", line 150, in process_storage_error
error.raise_with_traceback()
File "/Users/user/miniforge3/lib/python3.9/site-packages/azure/core/exceptions.py", line 247, in raise_with_traceback
raise super(AzureError, self).with_traceback(self.exc_traceback)
File "/Users/user/miniforge3/lib/python3.9/site-packages/azure/storage/blob/_blob_client.py", line 1922, in start_copy_from_url
return self._client.blob.start_copy_from_url(**options)
File "/Users/user/miniforge3/lib/python3.9/site-packages/azure/storage/blob/_generated/operations/_blob_operations.py", line 2280, in start_copy_from_url
raise HttpResponseError(response=response, model=error)
azure.core.exceptions.ResourceNotFoundError: Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
RequestId:199c7c8a-501e-00a3-7418-aed966000000
Time:2021-09-20T12:08:20.0231825Z
ErrorCode:CannotVerifyCopySource
Error:None

据我了解,这是共享访问签名的错误,但是如果我提供连接字符串和存储 key ,这是如何工作的,为什么我会收到此错误。

非常感谢您为我提供的任何帮助,如果您需要更多信息,请随时询问

最佳答案

非常感谢@GauravMantri 的耐心和帮助。

将 Blob 存储从一个容器复制到另一个容器的解决方案如下:

from azure.storage.blob import BlobClient, BlobServiceClient
from azure.storage.blob import ResourceTypes, AccountSasPermissions
from azure.storage.blob import generate_account_sas
from datetime import *




#================================ SOURCE ===============================
# Source Client
connection_string = '' # The connection string for the source container
account_key = '' # The account key for the source container
source_container_name = '' # Name of container which has blob to be copied
blob_name = '' # Name of the blob you want to copy
destination_container_name = '' # Name of container where blob will be copied



# Create client
client = BlobServiceClient.from_connection_string(connection_string)



# Create sas token for blob
sas_token = generate_account_sas(
account_name = client.account_name,
account_key = account_key,
resource_types = ResourceTypes(object=True, container=True),
permission= AccountSasPermissions(read=True,list=True),
# start = datetime.now(),
expiry = datetime.utcnow() + timedelta(hours=4) # Token valid for 4 hours
)

# Create blob client for source blob
source_blob = BlobClient(
client.url,
container_name = source_container_name,
blob_name = blob_name,
credential = sas_token
)


# ============================= TARGET =======================================

# Target Client
target_connection_string = ''
target_account_key = ''
source_container_name = source_container_name
target_blob_name = ''
target_destination_blob = ''

# Create target client
target_client = BlobServiceClient.from_connection_string(target_connection_string)


# Create new blob and start copy operation.
# new_blob = client.get_blob_client(destination_container_name, blob_name)
new_blob = target_client.get_blob_client(target_destination_blob, target_blob_name)
new_blob.start_copy_from_url(source_blob.url)

关于python-3.x - Python sdk将blob从容器复制到容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69254321/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com