求基于最后修改时间重命名S3文件并复制的Lambda函数实现
实现带最后修改时间重命名的S3文件自动复制Lambda函数
核心逻辑说明
无需将文件下载到本地再上传,直接通过S3的copy_object接口完成跨桶复制,同时利用源文件的LastModified属性生成新文件名,全程在云端完成,避免本地操作的开销。
完整Python代码实现
import boto3 from datetime import datetime # 替换为你的源桶和目标桶名称 SOURCE_BUCKET = "your-source-bucket" TARGET_BUCKET = "your-target-bucket" # 可选:如果只处理特定前缀的文件,这里设置前缀,比如"input/" SOURCE_PREFIX = "" TARGET_PREFIX = "" s3 = boto3.client('s3') def lambda_handler(event, context): # 从S3触发事件中获取源对象信息 for record in event['Records']: source_key = record['s3']['object']['key'] # 过滤特定前缀的文件(如果需要) if SOURCE_PREFIX and not source_key.startswith(SOURCE_PREFIX): continue # 获取源对象的元数据,包括LastModified时间 response = s3.head_object(Bucket=SOURCE_BUCKET, Key=source_key) last_modified = response['LastModified'] # 格式化时间戳,比如转为"YYYYMMDD_HHMMSS"格式,可根据需求调整 timestamp = last_modified.strftime("%Y%m%d_%H%M%S") # 提取原文件名和扩展名,生成新文件名 file_name = source_key.split('/')[-1] if '.' in file_name: name_part, ext_part = file_name.rsplit('.', 1) new_file_name = f"{name_part}_{timestamp}.{ext_part}" else: new_file_name = f"{file_name}_{timestamp}" # 构造目标键(包含前缀) target_key = f"{TARGET_PREFIX}{new_file_name}" if TARGET_PREFIX else new_file_name # 执行跨桶复制 try: s3.copy_object( Bucket=TARGET_BUCKET, Key=target_key, CopySource={'Bucket': SOURCE_BUCKET, 'Key': source_key} ) print(f"成功复制并重命名文件:{source_key} -> {target_key}") except Exception as e: print(f"复制失败:{str(e)}") raise e
关键配置步骤
IAM权限配置:给Lambda角色添加以下权限(可通过IAM策略编辑器生成):
s3:GetObject(源桶)s3:PutObject(目标桶)s3:ListBucket(源桶,用于事件触发和元数据读取)logs:CreateLogGroup、logs:CreateLogStream、logs:PutLogEvents(CloudWatch日志权限,用于排查问题)
S3触发配置:
- 进入源S3桶的“属性”->“事件通知”
- 添加新通知,选择“所有对象创建事件”,指定前缀(如果需要),目标选择你的Lambda函数
时间格式自定义:代码中的
strftime("%Y%m%d_%H%M%S")可以根据需求修改,比如改为"%Y-%m-%d_%H-%M-%S"或者只保留日期部分"%Y%m%d"
测试建议
- 手动上传一个测试文件到源桶的指定路径
- 查看CloudWatch日志确认Lambda执行状态
- 检查目标桶是否出现带时间戳的重命名文件
内容的提问来源于stack exchange,提问作者Chris Joseph
相关产品推荐
相关产品推荐

