Сложность в выполнении функции копирования boto3 S3 с использованием aws лямбда - PullRequest
0 голосов
/ 27 марта 2020

Вот сценарий. У меня есть корзина S3 (например, ежедневный ввод данных), где ежедневные файлы будут записываться в конкретную папку c (например, S3: // ежедневный ввод данных / данные / тест /). Всякий раз, когда файл записывается в папку «test», копия также должна записываться в папку «test_copy» в том же сегменте. Если «test_copy» не существует, его следует создать.

Я использовал уведомление о событии S3 и прикрепил его к лямбда-функции (с python 3.7), которая будет проверять, существует ли ключ «test_copy», если не будет создан. Я могу успешно создать папку «test_copy» и не могу заставить работать копию S3 через boto3.

Вот код для вашей справки:

import boto3
import os
import botocore
s3 = boto3.resource('s3')
s3_cli=boto3.client('s3')

def lambda_handler(event, context):

    bucket_name = event ['Records'][0]['s3']['bucket']['name']
    bucket_key = event['Records'][0]['s3']['object']['key']
    file = (os.path.basename(bucket_key))
    source_key_path = (os.path.dirname(bucket_key))
    target_keypath = source_key_path+'_'+'copy'+'/'
    target_bucket_key = target_keypath+file
    copy_source = {'Bucket': bucket_name, 'Key': bucket_key}
    try:
        s3.Object(bucket_name, target_keypath).load()
    except botocore.exceptions.ClientError as e:
        if e.response['Error']['Code'] == "404":
            # Create the key
            print ("Creating target _copy folder")
            s3_cli.put_object(Bucket=bucket_name,Key=target_keypath)
            #copy the file
            #s3.copy_object(Bucket=bucket_name, Key=target_bucket_key, CopySource=copy_source)
        else:
            print ("Something went wrong!!")
    else:
        print ("Key exists!!")
        # s3.copy_object(Bucket=bucket_name, Key=target_bucket_key, CopySource=copy_source) 

Я пытался s3.copy_object, s3_cli.meta.client.copy, bucket.copy () и ни один из них не работает. Пожалуйста, дайте мне знать, если я делаю что-то не так.

1 Ответ

0 голосов
/ 27 марта 2020

Вот один простой способ скопировать объект в S3 внутри корзины:

import boto3
s3 = boto3.resource('s3')

bucket = 'mybucket'
src_key = 'data/test/cat.png'
dest_key = 'data/test_copy/cat.png'

s3.Object(bucket, dest_key).copy_from(CopySource=f'{bucket}/{src_key}')

Вот еще один низкоуровневый способ сделать то же самое:

import boto3
s3 = boto3.client('s3')

bucket = 'mybucket'
src_key = 'data/test/cat.png'
dest_key = 'data/test_copy/cat.png'

s3client.copy_object(Bucket=bucket, CopySource={'Bucket':bucket,'Key':src_key}, Key=dest_key)
...