如何通过Lambda在AWS S3桶根目录创建文件并调整Elastic Transcoder输出路径
解决Elastic Transcoder转码文件输出到S3根目录及Lambda创建根目录文件的问题
我来帮你拆解这两个问题,一步步搞定:
一、让Elastic Transcoder直接把转码文件写到S3桶根目录
你现在遇到的虚拟文件夹问题,其实是Elastic Transcoder默认输出路径配置导致的——它会自动给输出文件加路径前缀(比如作业ID或输入文件名),生成看似存在的文件夹。调整方法很直接:
- 创建转码作业时,修改Output Key的设置:别用带路径的格式(比如
{inputKey}/output.mp4),直接指定纯文件名即可。比如可以用内置变量{inputBasename}提取原文件的主文件名,设置成transcoded-{inputBasename}.mp4,这样转码后的文件就会直接落到桶的根目录。 - 如果是用预设模板,检查预设里的输出路径模板,把路径部分删掉,只保留文件名规则。
这样所有转码文件都在根目录,你直接查看文件的LastModified属性就能管理时间——这个值就是文件写入S3的时间,完全能替代你想要的“文件夹创建日期”。
二、用Lambda在S3桶根目录创建文件
Lambda创建根目录文件的核心就是:不要在文件Key里加任何斜杠(/),直接用纯文件名作为Key。给你个Python的示例代码,拿来就能用:
import boto3 # 初始化S3客户端 s3 = boto3.client('s3') def lambda_handler(event, context): # 替换成你的目标桶名称和要创建的根目录文件名 target_bucket = "your-target-bucket-name" root_file_key = "my-direct-root-file.txt" # 文件内容,字符串或二进制数据都支持 file_content = "This file lives right in the S3 bucket root, no fake folders here!" try: # 写入文件到根目录 s3.put_object( Bucket=target_bucket, Key=root_file_key, Body=file_content ) return { 'statusCode': 200, 'body': f"搞定!文件 {root_file_key} 已经创建在桶根目录了。" } except Exception as e: print(f"出错了:{e}") return { 'statusCode': 500, 'body': f"创建失败:{str(e)}" }
必看注意事项:
- 给Lambda的IAM角色加上
s3:PutObject权限,同时确保目标S3桶的策略允许这个角色写入。 - 如果要创建图片、PDF这类二进制文件,直接把
Body换成二进制数据就行(比如读取本地文件的字节流)。 - 千万别在
Key里写/filename.txt或者subfolder/filename.txt,那样会生成虚拟文件夹,纯文件名才是根目录。
额外小技巧:更精准管理文件时间
S3本身没有“创建日期”字段,只有LastModified,但对于转码后的文件来说,这个时间就是转码完成写入的时间,足够日常管理。如果需要更精准的记录,你可以:
- 在转码作业完成后,用Lambda触发给文件加自定义元数据,比如
x-amz-meta-transcode-date,把转码完成时间存进去。 - 或者把文件的
LastModified时间同步到DynamoDB里,方便后续按时间筛选查询。
内容的提问来源于stack exchange,提问作者Ryan Blundell
相关产品推荐
相关产品推荐

