如何通过AWS CLI访问S3存储桶文件供其他命令使用(无需本地下载)
原生bash工具(head/more/grep等)仅能识别本地文件系统路径,无法直接解析s3://协议地址,因此直接执行head s3://bucketname/file.txt会触发文件不存在报错。不需要将文件完整复制到本地目录的前提下,可通过以下几种方式实现需求:
标准输出流管道处理(最推荐临时场景使用)
你熟悉的aws s3 cp命令支持将输出目标设置为-,此时命令不会把文件保存到本地磁盘,而是将内容直接输出到标准输出流,通过管道对接需要的bash命令即可,流会在前端命令执行完成后自动中断,不会拉取多余的文件内容:
实现取文件前N行(等价head效果):aws s3 cp s3://bucketname/file.txt - | head实现分页浏览(等价
more/less效果):aws s3 cp s3://bucketname/file.txt - | less也可以直接对接其他文本处理命令,比如
grep关键词检索、awk字段处理等,全程不会生成本地持久化文件副本。字节范围定向拉取(适合超大型文件定点读取)
如果只需要读取文件指定位置的片段,不需要从头拉取流,可以调用s3api get-object接口的范围请求能力,仅下载指定字节区间的内容,进一步减少数据传输量:
比如读取文件开头1KB内容:aws s3api get-object --bucket bucketname --key file.txt --range bytes=0-1023 /dev/stdout读取文件末尾100字节内容:
aws s3api get-object --bucket bucketname --key file.txt --range bytes=-100 /dev/stdout返回的内容同样可以通过管道对接任意本地文本处理命令。
S3挂载为本地虚拟文件系统(适合高频操作场景)
如果需要频繁对S3内的文件执行各类本地文件操作,可以使用s3fs、goofys等工具将目标S3存储桶挂载为本地虚拟目录,挂载后可直接对虚拟目录下的文件执行任意原生bash命令,工具会在后台按需拉取访问到的文件片段,不会全量同步文件到本地。该方案需要提前安装依赖工具并配置访问权限,适合长期高频使用的场景,临时单次操作不推荐。
注:所有方案都不会将目标文件完整下载到本地持久化存储,传输的数据量仅为命令实际访问到的文件片段大小,对GB甚至TB级的大文件非常友好。
内容的提问来源于stack exchange,提问作者Roni Weiss

