python-3.x - 使用 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(),但它们都没有工作。如果我做错了什么,请告诉我。
解决方案
这是在存储桶中复制 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)
推荐阅读
- javascript - TokBox/OpenTok Web RTC - 限制订阅者数量
- javascript - d3 v4 向力导向图添加箭头
- prestashop - Prestashop 1.7 仅向管理员显示类别
- excel - 如果在其中一列中找到查找值,则返回第一列的值
- amazon-s3 - EMR S3:FileDeletedInMetadataNotFoundException:文件在元数据中被标记为已删除
- html - 在 Google chrome 检查元素中复制生成的 html
- c++ - C++ 标准是否允许双括号标量初始化?
- android - 原因:路径可能不是 null 或空字符串。路径=''
- google-cloud-platform - 停止 GCP 中附加了本地 SSD 的虚拟机实例
- python - 想要根据python中的特定条件从另一列替换一列中的值