Вот сценарий. У меня есть корзина 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 () и ни один из них не работает. Пожалуйста, дайте мне знать, если я делаю что-то не так.