首页 > 解决方案 > 使用 aws lambda 执行 boto3 S3 复制功能时遇到困难

问题描述

这是场景。我有一个 S3 存储桶(例如 daily-data-input),其中每日文件将被写入特定文件夹(例如 S3://daily-data-input/data/test/)。每当在“test”文件夹下写入文件时,也应将副本写入同一存储桶中的“test_copy”文件夹。如果“test_copy”不存在,则应该创建它。

我使用了 S3 事件通知并将其附加到 lambda 函数(使用 python 3.7),该函数将检查“test_copy”键是否存在,如果不存在则将被创建。我能够成功创建“test_copy”文件夹,并且无法通过 boto3 使 S3 副本正常工作。

这是供您参考的代码:

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(),但它们都没有工作。如果我做错了什么,请告诉我。

标签: python-3.xamazon-web-servicesamazon-s3aws-lambdaboto3

解决方案


这是在存储桶中复制 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)

推荐阅读