【问题标题】:Grouping S3 Files Into Subfolders将 S3 文件分组到子文件夹中
【发布时间】:2021-09-13 19:47:43
【问题描述】:

我有一个可以移动大约 1 TB 数据(所有 CSV 文件)的管道。在这个管道中有数百个不同名称的文件。它们有一个自动分区的日期组件。我的问题是如何使用 CDK 根据文件名自动创建子文件夹。换句话说,数据属于广泛的类别,但我们的数据科学家需要更详细的数据。

【问题讨论】:

  • 这听起来不像是 AWS CDK 可以做的事情。它应该由“管道”完成,或者作为管道之后的一个过程(例如 S3 触发“移动”对象的 AWS Lambda 函数)。
  • 好的,关于如何在 Python 中编写脚本有什么建议吗?

标签: amazon-web-services amazon-s3 aws-cli aws-cdk


【解决方案1】:

看来您的要求是根据文件名(键)中的信息将传入对象移动到文件夹中。

这可以通过在 Amazon S3 存储桶上添加一个触发器来完成,该触发器在创建新对象时触发 AWS Lambda 函数。

这是来自Moving file based on filename with Amazon S3的一些代码:

import boto3
import urllib

def lambda_handler(event, context):
    
    # Get the bucket and object key from the Event
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'])
    
    # Only copy objects that were uploaded to the bucket root (to avoid an infinite loop)
    if '/' not in key:
        
        # Determine destination directory based on Key
        directory = key # Your logic goes here to extract the directory name
      
        # Copy object
        s3_client = boto3.client('s3')
        s3_client.copy_object(
            Bucket = bucket,
            Key = f"{directory}/{key}",
            CopySource= {'Bucket': bucket, 'Key': key}
        )
        
        # Delete source object
        s3_client.delete_object(
            Bucket = bucket,
            Key = key
        )

您需要修改根据新对象的key 确定目标目录名称的代码。

它还假设新对象将进入存储桶的顶级(根),然后被移动到子目录中。相反,如果新对象进入给定路径(例如 incoming/),则只需将 S3 触发器设置为在该路径上操作并删除 if '/' not in key 逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    相关资源
    最近更新 更多