【发布时间】:2020-07-07 15:44:55
【问题描述】:
这里是场景。我有一个 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(),但它们都不起作用。如果我做错了什么,请告诉我。
【问题讨论】:
-
“不工作”是什么意思?遇到任何错误?
-
无需检查
test_copy文件夹是否存在并创建。你不需要它。只需从data/test/cat.png复制到data/test_copy/cat.png。 -
-
尝试以下等效项:
s3.Object('mybucket','data/test_copy/cat.png').copy_from(CopySource='mybucket/data/test/cat.png') -
@jarmod 好的。所以如果key不存在,会自动创建。?
标签: python-3.x amazon-web-services amazon-s3 aws-lambda boto3