我有一个Lambda,在将文件上传到S3-A存储桶并将这些文件移动到另一个存储桶S3-B时运行。面临的挑战是,我需要在S3-B存储桶中创建一个具有相应上传文件日期的文件夹,然后将文件移动到该文件夹中。非常感谢任何帮助或想法。听起来可能令人困惑,所以随时提出问题。谢谢!
答案 0 :(得分:3)
只是为了消除一些混乱,在S3中没有文件夹之类的东西。您在界面中看到的实际上是在使用前缀运行ListObjects。前缀就是您所看到的文件夹层次结构。
为帮助说明这一点,一个对象可能具有folder/subfolder/file.txt
的键(这是定义其名称的元数据),在控制台中,您实际上使用的是folder/subfolder/*
前缀。如果您将S3更像是一个键值存储,其中值是对象本身,那么这是有道理的。
因此,您可以在以前不存在的前缀上创建密钥,而无需创建任何其他分层功能。
在Lambda函数中,您将需要在本地下载文件,然后将其上传到其新对象键(记住要删除旧对象)。某些SDKS具有自动执行的功能,可以为您执行所有这些步骤(例如带有copy功能的Boto3)。
答案 1 :(得分:1)
这是一个Lambda函数,可以由Amazon S3事件触发并将该对象移动到另一个存储桶:
import json
import urllib
from datetime import date
import boto3
DEST_BUCKET = 'bucket-b'
def lambda_handler(event, context):
s3_client = boto3.client('s3')
bucket = event['Records'][0]['s3']['bucket']['name']
key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'])
dest_key = str(date.today()) + '/' + key
s3_client.copy_object(
Bucket=DEST_BUCKET,
Key=dest_key,
CopySource=f'{bucket}/{key}'
)
唯一要考虑的是时区。 Lambda函数以UTC运行,您可能期望时区中的日期略有不同,因此您可能需要相应地调整时间。