发布于: Oct 30, 2022

越来越多的企业将自己的数据存入 Amazon S3 中,但是很多企业还不知道这种智能存储于一般的存储方式有何区别以及如何利用这种存储方式。本文将为大家介绍如何利用 S3 的清单功能实现存储桶对象的实时统计场景以及更多高级自定义的业务逻辑。

了解源和目标存储桶里的S3 对象是非常重要的准备工作,该章节我们讨论,如何获得 S3 存储桶的所有对象列表,包含对象的基本的信息,比如最新版本的对象大小,ETag 等等。

Amazon S3 本身提供了存储桶管理功能之清单生成功能,该功能是一个异步的 Amazon Web Services 后台定期执行,可以实现每天生成一个存储桶清单保存成 Excel 格式。

同时我们也看到很多用户提问,如何实现一个自定义的清单功能,满足大家对于对象变化比较频繁的存储桶对象的实时统计场景以及更多高级自定义的业务逻辑。

接下来我们来看看这两种方法的具体实现逻辑。

作者利用 Amazon S3 CLI 实现高效的清单功能基于以下两个事实前提:

  1. s3api list-objects-v2 虽然文档中说明最多返回 1000 个对象,但实测可以获得所有对象列表
  2. 同样利用 s3api list-objects-v2delimiterprefix 参数,我们可以实现类似文件夹目录逐级扫描功能

基于以上两个事实,我们实现桶清单的主要逻辑如下图所示:

  • 输入参数主要是:bucketregionIAM 配置的 profile 名字,profile 默认为 default;另外 depth 控制扫描的目录层级
  • depth 为零时,我们直接尝试利用 list-objects-v2 一次性获取存储桶中所有对象列表并生成一个 json 格式的文件(但当桶里面对象太多时,该操作会超时)
  • depth 为零即单线程无法直接生成存储桶清单时,我们就尝试如下迭代逻辑:
    • 生成存储桶当前目录里面的所有对象和该目录中所有子目录列表
    • 遍历上一步的子目录列表,迭代生成该目录下的对象列表和子目录列表
    • 如果遍历的深度等于输入参数 depth=n,或者子目录列表为空,那么停止遍历子目录,直接生成该层级目录里面所有的对象列表

以下是几个关键点实现的代码说明,首先,生成某个目录前缀下所有对象列表的 Amazon S3 CLI 命令参考,如下命令将在操作系统后台执行并生成存储桶 jason目录前缀“qwikLabs/”下的所有对象列表(包括所有嵌套子目录中的所有对象):

$ nohup aws s3api list-objects-v2 --bucket "jason" --prefix "qwikLabs/" --profile bjs > 0.obj. 2>&1

其次,如下命令将仅仅生成指定目录前缀“qwikLabs/”下的对象列表(不包括嵌套子目录的对象)和所有下一层子目录列表,为了加强子目录输出格式,我们增加了 query 参数:

$ nohup aws s3api list-objects-v2 --bucket "jason" --prefix "qwikLabs/" --delimiter "/" --query "{Keys:Contents[].{Key: Key, Size: Size,ETag:ETag},CommonPrefixes:CommonPrefixes[].Prefix}" --profile bjs > 0.1.obj. 2>&1

另外,为了实现并发我们利用了迭代算法以及操作系统后台异步执行 Amazon S3 CLI 命令的方法,最终程序会生成一系列的 json 文件结果,存储桶中所有的对象列表分布在这些文件当中。

在了解了我们通过 Amazon CLI S3 命令行工具实现自定义的清单功能之后,我们再来对比下,Amazon S3 自带的清单功能。

在存储桶页面,导航到管理标签,Amazon S3 目前提供了四项 S3 管理功能,其中跟本文相关的是清单功能。该功能支持我们对某一个存储桶,定义多个清单,用户可以根据需要,定义针对不同 S3 对象前缀生成各自的清单列表,并可以存储在独立的存储桶中:

同时,自带清单功能还支持定义生成清单的频率及清单中包含的对象字段,检查并确定好清单选项之后,服务会帮助我们在保存清单的目标存储桶中设置好相应的 IAM 策略:

清单任务保存之后,后台会异步定期执行,每次都会按时间生成 manifest.json  文件和一系列的清单文件,manifest.json 里面包含这次生成的所有清单文件列表:

Amazon S3 存储桶已经内置了清单功能,基本可以满足我们的日常需求,我们不需要重复造轮子;本章节所讨论的利用 Amazon S3 CLI 命令行自定义实现清单功能,更多的是作者好奇的发现,Amazon S3 CLI 本身非常好用,也可以帮助我们实现类似文件目录的逐级对象列表功能,提供给有特殊场景需求的用户参考。

相关文章