如何在AWS Lambda函数中重命名或复制文件?

5

我对AWS/Lambda技术方面还不太熟悉,现在有一个场景需要您的帮助。

每天都会有一个文件被上传到同一个存储桶(bucket)中,但我只关心每个月的最后一天上传的文件。这个文件会在美国东部时间早上8点上传。

我需要将每个月最后一天上传的文件重命名为静态名称,并将其复制到另一个存储桶中。例如,如果现在是10月份,那么我想要的文件名是bill,而之前上传的文件名为bill_september。

我的想法是:每天中午都有一个定时任务(cron job)触发Lambda函数,用于移动文件,但当月的最后一天除外。如果是每个月的第一天早上8点,我会让它在5点启动一个Lambda作业来复制文件到新的存储桶中。

所以问题是:

  1. 这种方法有意义吗?
  2. 我能让Lambda重命名已有的文件吗?

如果您有更好的解决方案,请告诉我,我非常乐意听取建议。


您可以通过Cloudwatch Events按计划运行一个或多个Lambda。或者,您可以直接从S3将事件传递到Lambda,并使文件几乎实时移动 - 有关更多信息,请参见文档 - stdunbar
1个回答

4

无论使用哪种编程语言,您的 Lambda 函数都将使用 S3-SDK 处理 S3 存储桶中的文件。使用 S3,文件(对象)无法重命名,但您可以将其复制到另一个名称(对象键),然后删除旧文件。

如何在 S3 上复制文件

AmazonS3 s3client = new AmazonS3Client(new ProfileCredentialsProvider());
s3client.copyObject(sourceBucketName, sourceKey, 
                    destinationBucketName, destinationKey);

http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/CopyingObjectUsingJava.html

如何在S3上删除文件

AmazonS3 s3Client = new AmazonS3Client(new ProfileCredentialsProvider());
        try {
            s3Client.deleteObject(new DeleteObjectRequest(bucketName, keyName));
        } catch (AmazonServiceException ase) {
            System.out.println("Caught an AmazonServiceException.");
            System.out.println("Error Message:    " + ase.getMessage());
            System.out.println("HTTP Status Code: " + ase.getStatusCode());
            System.out.println("AWS Error Code:   " + ase.getErrorCode());
            System.out.println("Error Type:       " + ase.getErrorType());
            System.out.println("Request ID:       " + ase.getRequestId());
        } catch (AmazonClientException ace) {
            System.out.println("Caught an AmazonClientException.");
            System.out.println("Error Message: " + ace.getMessage());
        }

http://docs.aws.amazon.com/AmazonS3/latest/dev/DeletingOneObjectUsingJava.html

您可能需要做的是列出特定文件夹中存储桶中的对象,然后找到目标文件(在特定日期/时间修改/创建的文件?),然后进行必要的操作,如果不是复制,可能涉及读取文件,编辑它,然后重新上传到S3。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接