S3存储桶中的AWS Lambda创建文件夹

时间:2020-09-04 17:12:16

标签: amazon-web-services amazon-s3 aws-lambda

我有一个Lambda,在将文件上传到S3-A存储桶并将这些文件移动到另一个存储桶S3-B时运行。面临的挑战是,我需要在S3-B存储桶中创建一个具有相应上传文件日期的文件夹,然后将文件移动到该文件夹​​中。非常感谢任何帮助或想法。听起来可能令人困惑,所以随时提出问题。谢谢!

2 个答案:

答案 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运行,您可能期望时区中的日期略有不同,因此您可能需要相应地调整时间。

相关问题