如何使用python将blob从Azure存储复制到linux虚拟机?

时间:2019-01-27 11:57:14

标签: python-3.x azure azure-storage azure-functions

我是Azure云服务的新手,因为我不知道如何使用python将我的blob从Azure存储帐户复制到Linux虚拟机(vm)。 在我的应用程序中,我将上传的文件存储到Azure存储中,并且每当新文件上传时,我也触发了Azure函数,现在我需要将该文件从Azure函数复制到Azure VM。 任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

您可以使用Azure Storage Python SDK。您可以将此示例文件用作基础文档和官方文档:

https://github.com/Azure/azure-storage-python/blob/master/samples/blob/block_blob_usage.py#L329
https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-python

full_path_to_file2 = os.path.join(local_path, string.replace(local_file_name ,'.txt', '_DOWNLOADED.txt'))
print("\nDownloading blob to " + full_path_to_file2)
block_blob_service.get_blob_to_path(container_name, local_file_name, full_path_to_file2)

答案 1 :(得分:0)

听起来您想将Azure函数与Blob存储触发器一起使用,以使用Python将blob从Azure存储复制到Linux虚拟机。

因此,可行的解决方案是在Azure Function上将一些Python软件包scpssh2-python与Azure存储Python SDK一起使用,以实现可以下载blob并通过这些Python软件包传输到Linux VM的功能。像linux命令scp

众所周知,在Linux azure-storage-fuse上有一个用于Azure Blob存储的虚拟文件系统适配器,可以将带有blobfuse的Blob容器作为目录挂载到Linux本地文件系统。根据我的经验,另一种解决方法是安装指定的Blob容器,然后将文件上传到Linux VM,然后可以像在本地一样直接访问这些文件。带有Blob触发器的Azure Function仅需要将新的上传文件的事件通知到Linux VM上的相关应用程序。

答案 2 :(得分:0)

下面是专门针对Python Azure Functions的代码段。它将文件从Blob存储读取到内存中,然后使用SSH(特别是SSH上的SFTP)将其传输到远程位置。它使用名为paramiko的SSH库。

import logging
import paramiko

import azure.functions as func


def main(myblob: func.InputStream):
    ssh_client = paramiko.SSHClient()
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh_client.connect(hostname='YOUR_HOST_NAME', username='USERNAME_FROM_APP_SETTINGS', password='PASSWORD_FROM_APP_SETTINGS')

    logging.info(f"Python blob trigger function processed blob \n"
                 f"Name: {myblob.name}\n"
                 f"Blob Size: {myblob.length} bytes")
    with open('LOCAL_FILE_LOCATION', 'wb') as f: 
        f.write(myblob.read()) 

    ftp_client=ssh_client.open_sftp()
    ftp_client.put('LOCAL_FILE_LOCATION','REMOTE_FILE_LOCATION') # same file location written to above
    ftp_client.close()