使用Boto 3将文件从AWS S3传输到SFTP


问题内容

我是使用Boto3的初学者,我想将文件从S3存储桶直接传输到SFTP服务器。

我的最终目标是为AWS Glue编写Python脚本。

我发现了一些文章,展示了如何将文件从SFTP传输到S3存储桶:https :
//medium.com/better-programming/transfer-file-from-ftp-server-to-a-s3-bucket-
使用python-7f9e51f44e35

不幸的是,我找不到任何相反的动作。您有什么建议/想法吗?


我的第一个错误尝试是在下面。

但我想避免在将文件下载到本地内存时将其下载到SFTP。

import pysftp
import boto3

# get clients
s3_gl = boto3.client('s3', aws_access_key_id='', aws_secret_access_key='')

# parameters
bucket_gl = ''
gl_data = ''
gl_script = ''

source_response = s3_gl.get_object(Bucket=bucket_gl,Key=gl_script+'file.csv')
print(source_response['Body'].read().decode('utf-8'))

#---------------------------------

srv = pysftp.Connection(host="", username="", password="")

with srv.cd('relevant folder in sftp'): 
    srv.put(source_response['Body'].read().decode('utf-8'))

# Closes the connection
srv.close()

问题答案:

“直接……转移” 可能意味着许多不同的事情。

假设您要通过本地计算机(运行Python代码的地方)传输文件,而没有实际将文件的临时副本存储到本地文件系统。


对于SFTP上传,您可以使用Paramiko库

假设您已经准备好ParamikoSFTPClientsftp)和Boto
3 clients3)实例(问题链接中的文章中介绍了这些实例),则可以使用类似文件的对象将它们“粘合”在一起:

with sftp.open('/sftp/path/filename', 'wb', 32768) as f:
    s3.download_fileobj('mybucket', 'mykey', f)

关于32768参数的用途,请参阅在使用pysftp打开的SFTP服务器上写入文件