亚马逊AWS官方博客

通过 S3 Batch Operations (批量操作)功能轻松处理海量对象

S3是AWS非常核心的一个存储服务。由于S3具有极强的扩展性、数据持久性、极低成本和高安全性,很多AWS用户会在一个S3存储桶上存储超过百万甚至过亿个的对象。这些对象通常是图像、视频、日志文件、备份或其他关键的业务数据。S3是很多AWS用户数据存储架构的重要组成部分,也是用来构建数据湖解决方案的基础。

那如何在S3通过简单快捷的方式来处理数百万甚至数十亿对象呢?可以考虑使用S3 Batch Operations(批量操作)功能!通过S3批量操作功能,在S3控制台上通过几次鼠标点击就可以实现批量将对象复制到另一个存储桶、设置对象标签或ACL、触发Glacier/Deep Archive对象还原或者是对每个对象触发指定的Lambda函数进行处理。

S3批量操作功能通过S3现有的清单报告(Inventory Report)或手动编写CSV文件来指定需要操作的对象集合。用户不需要编写任何代码,也不需要启动虚拟机集群,更不需要了解如何将批量操作任务进行分解并分发到虚拟机上进行执行。借助S3批量操作功能,用户只需要在控制台上通过几次鼠标点击即可在数分钟内创建一个作业(Job)并提交,通过S3大规模并行处理机制进行海量对象的批量操作。通过S3控制台、命令行或API,用户可以创建、监控和管理批量操作作业。

基本概念

在开始使用S3批量操作功能并创建作业前,我们需要先了解一些基本的概念:

  • (Bucket):一个S3存储桶可以存放无限数量的对象,并提供对象级别的多版本管理功能
  • 单报告(Inventory Report):  清单报告是S3后台每天或每周定期对存储桶进行检查并生成对象清单列表。清单报告可以包含存储桶中所有对象,或只包含某些前缀(prefix)的对象。
  • (Manifest): 指定需要进行处理的对象集合,可以是清单报告,也可以是CSV文件
  • 操作(Operation):期望对目标对象执行的动作。对某个对象执行动作称之为一个(Task)
  • IAM 角色(IAM Role): 通过IAM角色赋予S3相应的权限,以便读取清单报告、对目标对象执行特定的动作以及写入完成报告。如果执行动作是调用Lambda函数,则需要确保Lambda函数的执行角色(Execution Role)具有相应的权限
  • (Job):每个作业会包含上述提到的要素,同时每个作业均有状态和优先级。

 

演示

接下来我们演示如何通过S3控制台创建并运行一个批量替换对象标签的作业。

在S3控制台左边可以看到批量操作功能的入口并创建作业

另外我们也可以选择从清单创建作业:

 

在这个演示中,我们已经为存储桶 linjungz-batch-bjs 创建了一个名为 Inv1 的清单,并保存在了 linjungz-logs-bjs 存储桶中。因此我们选择“从清单创建作业”按钮开始进入作业创建向导:

 

从上图可以看到,我们需要先为作业选择相应的AWS区域:如果是复制对象操作,则作业需要与目标存储桶在同一个AWS区域 ;如果是其他操作,则作业需要与被操作的对象在同一个AWS区域。在这个例子中我们演示进行批量的标签替换操作,由于被操作的对象存放在北京区域的存储桶中,因此作业也需要在北京区域创建。

另外由于我们是从清单创建作业的,因此可以看到这里自动选择了“S3清单报告”并自动填充了清单对象的路径。用户也可以通过创建一个CSV文件来指定需要操作的对象列表。如果清单对象有多个版本,在这里我们也可以指定版本ID。

接着我们进入下一步,指定对象所需要执行的操作。在这里我们选择“替换所有标签“,并指定对象的新标签:

接着我们在下一步对作业的其他选项进行设置:

在上面截图可以看到,我们可以输入作业的描述和优先级,并指定是否生成完成报告及相应的位置。这里我把完成报告输出到了存储桶 linjungz-logs-bjs 并指定前缀 batch-reports

同时在这里我们需要指定S3批量操作所需要的IAM角色,通过这个IAM角色S3可以获得相应的权限来执行批量操作。根据操作所需要的权限不同,控制台提供了对应的IAM角色的策略模板,基于这个模板用户可以快速的创建出相应的IAM策略。如下是替换对象标签所对应的IAM策略模板及简单的描述:

接下来我们将创建一个名为linjungz-Batch的IAM角色,以便S3 Batch 可以有相应的权限来批量对指定的对象进行标签替换,并且输出作业完成报告。

首先我们将参考上述模板在IAM中创建一个新的策略,并命名为 linjungz-Batch-PutObjectTagging:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObjectVersionTagging",
                "s3:PutObjectTagging"
            ],
            "Resource": "arn:aws-cn:s3:::linjungz-batch-bjs/*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetBucketLocation",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws-cn:s3:::linjungz-logs-bjs/*"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws-cn:s3:::linjungz-logs-bjs/*"
        }
    ]
}

 

(注意:在创建S3 Batch的策略时,如果该策略需要被重复使用,则可以适当放宽相应的读写权限。比如说在这个例子里,我的读取清单文件和写入完成报告的权限是指定到了整个存储桶。)

接着我们需要创建一个IAM角色。在这里我们需要指定这个角色的信任实体为S3 Batch Operations

然后我们需要为这个角色附加刚才创建的策略:

最后我们在S3 Batch控制台上为这个作业选择刚才创建的IAM角色 linjungz-Batch

完成IAM角色创建后,我们可以进入到最后一步,即作业的审核:

确认没问题后,我们即可创建作业并提交。

在S3批量操作控制台上,我们即可看到刚提交的作业。稍等一会待作业准备完成后,作业状态会进入“等待确认”状态。此时我们可以看到S3 Batch已经通过我们指定的清单文件找到了本次作业所需要批量处理的对象数量,这里的例子是158个对象。

此时我们可以点击“确认并运行“按钮,并且确认后,S3 Batch作业会在后台开始执行。

此时状态为“准备就绪“。在等待一段时间后作业完成,可以查看作业的状态:

可以随机挑选一个目标对象,检查标签是否已经替代成功:

同时S3会在刚才指定的存储桶 linjungz-logs-bjs 的指定路径下生成完成报告:

我们可以下载这个作业完成报告,或是直接在S3控制台上通过S3 Select查询完成报告所对应的CSV文件,看到本次S3 Batch作业的任务执行情况

 

小结

通过上面的演示我们可以看到,借助S3批量操作功能,我们可以方便地对海量对象进行批量操作,而无须自行编码去构建一个作业管理平台。S3批量操作目前支持标签替换、ACL替换、对象复制、Glacier/Deep Archive数据还原以及触发Lambda函数。通过Lambda函数我们可以自行编码相应的处理逻辑,从而方便地扩展S3批量操作功能。

查阅我们的官方文档了解更多关于S3批量操作功能的信息吧

https://docs.amazonaws.cn/AmazonS3/latest/dev/batch-ops.html

 

本篇作者

林俊

AWS解决方案架构师,主要负责企业客户的解决方案咨询与架构设计优化,同时致力于AWS云存储及IoT类服务的应用和推广。