boto3: Przesyłanie plików pomiędzy różne konta bucket s3 w AWS

0

Cześć,
Mam taki mały projekt a jestem dość początkujący.
Potrzebuję z czyjegoś bucketu s3 do którego mam dostęp "read only" pobrać pliki backupu oraz wysłać je do swojego bucketu s3.
Pomysł mam taki, żeby pobierać je do /tmp a następnie przesyłać do swojego bucketu s3 i czyścić katalog /tmp. Lepszym jednak rozwiązanie było by zrobienie bezpośredniego tz. pipe który pobiera bezpośrednio do mojego bucketu s3, ale nie widzę możliwości zrobienia czegoś takiego.

Obecnie tak nastrugałem mój kod:

Pobieranie:

import boto3

# Download file

ACCESS_KEY='XXX'
SECRET_KEY='XXXX'
BUCKET_NAME='XXXX'

session = boto3.Session(
    aws_access_key_id=ACCESS_KEY,
    aws_secret_access_key=SECRET_KEY
)

s3 = session.resource('s3')
bucket = s3.Bucket(BUCKET_NAME)

for s3_file in bucket.objects.all():
    file = s3_file.key
    bucket.download_file(file, '/tmp/'+file)
    print(file, 'copied')

Wysyłanie:

import boto3

# Upload file
ACCESS_KEY_U='XXXXXXXXXXX'
SECRET_KEY_U='XXXXXXXXXXX'
BUCKET_NAME_U='xxx-backup'

session_u = boto3.Session(
    aws_access_key_id=ACCESS_KEY_U,
    aws_secret_access_key=SECRET_KEY_U
)

s3u = session_u.resource('s3')
bucketu = s3u.Bucket(BUCKET_NAME_U)
s3u.Bucket(BUCKET_NAME_U).upload_file('/tmp/hello.txt', 'hello.txt')

Czy widzicie jakąś opcję, żeby zrobić bezpośredni tz. "pipe", który nie będzie wymagał użycia katalogu /tmp ?

0
import boto3
s3 = boto3.resource('s3')
copy_source = {
      'Bucket': 'mybucket',
      'Key': 'mykey'
    }
bucket = s3.Bucket('otherbucket')
bucket.copy(copy_source, 'otherkey')

https://stackoverflow.com/questions/47468148/how-to-copy-s3-object-from-one-bucket-to-another-using-python-boto3
https://aws.amazon.com/premiumsupport/knowledge-center/move-objects-s3-bucket/

jesli to dwa rozne konta: https://blog.vizuri.com/how-to-copy/move-objects-from-one-s3-bucket-to-another-between-aws-accounts

0

Jakieś pomysły jak zrobić, żeby pominąć zrzucanie pliku na dysk? Ewentualnie pokroić na kawałeczki po np. 100mb i jednocześnie robić upload?
Działający skrypt bez opcji streamingu napisałem jak poniżej. Działa to tak, że najpierw sprawdza czy w moim s3 jest taki plik. Jeśli go nie ma to rozpoczyna pobieranie na mój lokalny /tmp (np.5GB). Jak go pobierze to rozpoczyna wysyłać do mojego S3.

#/usr/bin/env python

import boto3
import os

# ACESS TO LIVESPACE
ACCESS_KEY_L='XXX'
SECRET_KEY_L='XXX'
BUCKET_NAME_L='XXX'

# ACESS TO EP
ACCESS_KEY_E='XXX'
SECRET_KEY_E='XXX'
BUCKET_NAME_E='XXX'

# SESSION TO EXTERNAL S3
sessionl = boto3.Session(
    aws_access_key_id=ACCESS_KEY_L,
    aws_secret_access_key=SECRET_KEY_L
)
s3l = sessionl.resource('s3')
bucketl = s3l.Bucket(BUCKET_NAME_L)

# SESSION TO MY S3
sessione = boto3.Session(
    aws_access_key_id=ACCESS_KEY_E,
    aws_secret_access_key=SECRET_KEY_E
)

s3e = sessione.resource('s3')
buckete = s3e.Bucket(BUCKET_NAME_E)

# CREATE A LIST OF MY BACKUP FILES
list_ep_backups = []

for s3_file in buckete.objects.all():
    file = s3_file.key
    list_ep_backups.append(file)

# DOWNLOAD A NEW BACKUP FILE FROM EXTERNAL S3
downloaded_files = []

for s3_file in bucketl.objects.all():
    file = s3_file.key
    if file not in list_ep_backups:
        bucketl.download_file(file, '/tmp/' + file)
        downloaded_files.append(file)
        print(file, 'downloaded to /tmp')
        s3e.Bucket(BUCKET_NAME_E).upload_file('/tmp/'+file, file)
        print(file,'before remove')
        os.remove('/tmp/'+file)
        print(file, 'sended to bucket EP')
    else:
        break

print('All backup files are in S3')
0

Generowanie presigned url:

import boto3

s3 = boto3.client('s3')

presigned_url = s3.generate_presigned_url(
    ClientMethod='get_object',
    Params={
        'Bucket': 'bucket-name',
        'Key': 'key-name'
    }
)

Potem:

    import requests

    def wrapper(url):
        with requests.get(url, stream=True) as r:
            yield from r.iter_content(chunk_size=4096)

Potem:

s3.Object('mybucket', 'hello.txt').put(Body=wrapper(presigned_url))

a jak nie tak to zajrzy: https://botocore.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.put_object

1 użytkowników online, w tym zalogowanych: 0, gości: 1