pythonazure-functionsazure-blob-storageblobstorage

move or copy files(blob) between storage accounts python (azure function)?


I want to move (or copy then delete) files/blobs between two storage accounts using python (in an azure function). I've used methods like this. However this works for older SDKs, does anyone know a way for new SDK?

Something like this but between two storage accounts rather than containers.


Solution

  • If you want to copy blob across Azure storage account, please refer to the following code

    from azure.storage.blob import ResourceTypes, AccountSasPermissions, generate_account_sas, BlobServiceClient
    from datetime import datetime, timedelta
    source_key = ''
    des_key = ''
    source_account_name = ''
    des_account_name = '23storage23'
    # genearte account sas token for source account
    sas_token = generate_account_sas(account_name=source_account_name, account_key=source_key,
                                     resource_types=ResourceTypes(
                                         service=True, container=True, object=True),
                                     permission=AccountSasPermissions(read=True),
                                     expiry=datetime.utcnow() + timedelta(hours=1))
    source_blob_service_client = BlobServiceClient(
        account_url=f'https://{source_account_name}.blob.core.windows.net/', credential=source_key)
    des_blob_service_client = BlobServiceClient(
        account_url=f'https://{des_account_name}.blob.core.windows.net/', credential=des_key)
    
    source_container_client = source_blob_service_client.get_container_client(
        'copy')
    
    source_blob = source_container_client.get_blob_client('Capture.PNG')
    source_url = source_blob.url+'?'+sas_token
    # copy
    des_blob_service_client.get_blob_client(
        'test', source_blob.blob_name).start_copy_from_url(source_url)
    
    

    Besides, if the access level of the source container is public, we can simplify the code as below

    from azure.storage.blob import BlobServiceClient
    source_key = ''
    des_key = ''
    source_account_name = ''
    des_account_name = '23storage23'
    source_blob_service_client = BlobServiceClient(
        account_url=f'https://{source_account_name}.blob.core.windows.net/', credential=source_key)
    des_blob_service_client = BlobServiceClient(
        account_url=f'https://{des_account_name}.blob.core.windows.net/', credential=des_key)
    
    source_container_client = source_blob_service_client.get_container_client(
        'input')
    
    source_blob = source_container_client.get_blob_client('file.json')
    source_url = source_blob.url
    # copy
    des_blob_service_client.get_blob_client(
        'test', source_blob.blob_name).start_copy_from_url(source_url)
    

    enter image description here For more details, please refer to here

    enter image description here