Передача файла из AWS S3 в SFTP с помощью Boto 3 - PullRequest
4 голосов
/ 05 ноября 2019

Я новичок в использовании Boto3 и хотел бы перенести файл из корзины S3 непосредственно на сервер SFTP.

Моя конечная цель - написать скрипт Python для AWS Glue.

Я нашел статью, в которой показано, как перенести файл из SFTP в корзину S3:
https://medium.com/better-programming/transfer-file-from-ftp-server-to-a-s3-bucket-using-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()

1 Ответ

3 голосов
/ 06 ноября 2019

«передача ... напрямую» может означать множество разных вещей.

Предположим, что вы хотите передать файл через локальную машину (где работает код Python),без фактического сохранения временной копии файла в локальной файловой системе.


Для загрузки по SFTP вы можете использовать Библиотека Paramiko .

Предполагая, что у вас уже есть готовые экземпляры Paramiko SFTPClient (sftp) и Boto 3 client (s3) (о чем говорится в статье, на которую вы ссылались вваш вопрос), вы можете просто «склеить» их вместе с помощью файловых объектов:

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