如何使用split/join生成新AWS S3对象键,实现Lambda跨桶迁移文件自定义路径
解决方案
核心逻辑说明
你只需要在现有跨桶迁移逻辑的基础上,增加少量代码处理目标对象键即可,核心步骤如下:
- 从S3触发事件的Records字段中提取源文件的对象键(Key)
- 从源Key中提取纯文件名(自动忽略源Key自带的目录前缀)
- 拆分纯文件名的名称部分和后缀部分,用名称部分作为目标桶的一级目录,拼接得到最终目标Key
Python 代码片段
使用Python原生内置模块实现,无需额外配置Lambda层:
import os # 从触发事件中取源Key,该逻辑你现有迁移代码中应该已经存在 source_key = event['Records'][0]['s3']['object']['key'] # 提取纯文件名,自动去掉源Key的所有上层路径前缀 file_full_name = os.path.basename(source_key) # 拆分文件名和后缀,得到目标目录名 file_name_without_suffix = os.path.splitext(file_full_name)[0] # 拼接得到符合要求的目标Key target_key = f"{file_name_without_suffix}/{file_full_name}" # 后续直接使用target_key调用你已有的copy_object/put_object跨桶迁移逻辑即可
该代码对带多个点的文件名也可以正常适配,例如源文件为family.photo.grandkids.jpg时,会自动生成family.photo.grandkids/family.photo.grandkids.jpg的目标Key。
Node.js 代码片段
使用Node.js原生内置模块实现,无需额外安装依赖:
const path = require('path'); // 从触发事件中取源Key,该逻辑你现有迁移代码中应该已经存在 const sourceKey = event.Records[0].s3.object.key; // 提取纯文件名,自动去掉源Key的所有上层路径前缀 const fileFullName = path.basename(sourceKey); // 拆分文件名和后缀,得到目标目录名 const fileNameWithoutSuffix = path.parse(fileFullName).name; // 拼接得到符合要求的目标Key const targetKey = `${fileNameWithoutSuffix}/${fileFullName}`; // 后续直接使用targetKey调用你已有的s3.copyObject等跨桶迁移逻辑即可
注意事项
- S3对象键不需要以
/开头,拼接时无需额外添加开头的斜杠,避免出现冗余前缀 - 该处理逻辑耗时在毫秒级,完全适配数十万级的上传规模,不会影响Lambda执行效率
- 即使源文件上传到源桶时没有任何上层路径前缀,上述代码也可以正常运行
内容的提问来源于stack exchange,提问作者ftb3
相关产品推荐
相关产品推荐

