AWS最佳实践 - S3大对象复制


前言

在我们实际业务中,大量客户将其数据存储在Amazon S3,其中一些客户甚至有数百万或数十亿个单独的对象。在这个时候,Amazon S3 客户需要一种简单、可靠且可扩展的方式来对这些大型数据集执行批量操作。Amazon S3批量操作让您只需在Amazon S3控制台中单击几下或通过单个API请求即可大规模管理数十亿个对象。几个支持的操作包括复制、替换标记、替换访问控制和调用AWS Lambda函数

但是我们在实际操作时候发现,当我们的对象过大时候,会提示我们复制失败。原因是我们的单个对象超过了5GB 的最大上限。这个时候我们不能够按照常规操作进行复制。需要我们结合 Cloud Formation 和AWS Lambda 等服务进行操作。接下来将演示大对象的复制操作。

需要强调的是并非所有大于5 GB的对象都可以在当前Lambda函数15分钟超时限制内复制,尤其是跨AWS区域。该已在理想条件下成功测试,在同一区域中最多2 TB的单个对象大小,并且在两个区域EU-WEST-2和US-EAST-1之间具有1 TB的单个对象大小。


一、相关服务组件

  1. 我们需要用到S3,所以必须有源和目标的S3桶。并且需要源S3桶的库存清单文件,我们可以通过如果S3库存配置产生S3桶中的库存清单。
  2. 我们需要使用Lambda函数和AWS SDK执行复制。这里我使用Python Boto3 SDK,也可以根使用自己熟悉的其他语言。
  3. 这个我认为不是必须的,但是我还是说一下。可通过修改Boto3 SDK默认配置以提高性能,确保可以在Lambda函数超时限制之前尽可能快地复制大型对象。修改botocore配置设置和内置的高级Boto3传输实用程序配置。The botocoremax_pool_connections参数指定池中允许的最大连接数。默认情况下,它设置为10,但是,想使用尽可能多的并发连接来处理副本,就增加这个,由于SDK使用的并发连接越多,复制对象的速度就越快。在此处设置的值必须至少与下一个配置设置的值相同,即max_concurrency,因为max_concurrency依赖于基础连接池。传输实用程序max_concurrency确定用于执行操作的并发数或线程数。这两个增加的设置加快了传输速度,因此它在Lambda超时内完成限制。也可以定制SDK的数量重试次数使用max_retries参数来赋予它更多的弹性。
  4. 我们需要将IAM附加到Lambda函数的角色,具有执行复制操作的适当权限。如果使用客户管理的对象加密KMS密钥,则必须向IAM角色授予对cmk的所需访问权限。
  5. 源和目标S3存储桶示意图

二、先决条件​​​​​​

     1.具有Lambda函数和S3存储桶和AWS CloudFormation的账户权限

     2.生成源S3桶的对象库存清单

     3.具有CloudFormation中所使用的模板,可在此处获取

三、步骤摘要

  1. 下载上面提供的CloudFormation模板,用于创建Lambda函数和关联的IAM角色。
  2. 在函数环境变量中指定目标S3存储桶名称。您可以选择修改COPY和SDK配置参数。
  3. 启动S3批处理操作作业从源S3存储桶中使用库存配置选项卡或通过S3批量操作控制台页面。然后,选择S3清单JSON或CSV清单文件,并按照向导进行操作。
  4. 在批处理操作控制台中监控作业进度以确认作业成功,然后检查目标S3存储桶以确认对象已成功复制。

四、详细步骤

     1、导航到AWS CloudFormation控制台,选择创建堆栈(新增资源)

     2、选择上传模板文件,选择文件,使用以前下载的CloudFormation模板。

     3、指定堆栈名称 、目标存储桶名称等

 

 

       4.提交后,将创建完成堆栈并自动创建Lambda函数和IAM角色 。可以通过下面页面看出。

 

       5.如果是跨账户,需要注意的是在添加目标S3存储桶策略 

{
    "Version": "2012-10-17",
    "Id": "Policy1541018284691",
    "Statement": [
        {
            "Sid": "Allow Cross Account Copy",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::1234567890:root"
            },
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
	 "s3:PutObjectTagging"
            ],
            "Resource": "arn:aws:s3:::DESTINATION_BUCKET/*"
        }
    ]
}

       6. 启动批处理作业。从导航窗格中,选择批处理操作并选择创建作业。或者,您可以通过选择来源来开始工作S3存储桶,去管理选项卡,向下滚动到库存配置节,选择库存,最后选择从清单创建作业

 

        7. 用于清单格式,选择CSVS3库存并输入S3位置。然后,选择下一个

 

         8. 选择操作类型,选择调用AWS Lambda函数。

 

         9.选择已自动创建的Lambda函数,并选择堆栈。名称的格式为 “StackName-S3BatchCopyLambdafunction-”。例如,如果您将CloudFormation堆栈名称指定为 “MyS3batch”,则S3 Batch Lambda函数名称将为 “MyS3batch-S3BatchCopyLambdafunction-”

 

       10.完成报告目标的路径,输入希望将报告发送到的S3存储桶的位置 

       11.S3批量操作需要权限为S3 Batch Operations服务自动创建的IAM角色。角色名称的格式为 “StackName-S3BatchOperationsService-”。 

 

       12. 在 “复查” 页上,复查作业的详细信息。然后,选择创建作业

       13. 建作业后,作业状态更改自新建准备。然后,状态更改为等待您的确认。要运行作业,必须选择作业ID打开作业详细信息,然后选择运行作业。下一步选择运行作业再次开始工作。

       14. 完成后,检查完工报告以确认已成功复制所有对象。您还可以检查目标S3存储桶。

 

五、故障排除和指导

Amazon S3批处理操作是一个至少执行一次的执行引擎,这意味着它对提供的清单中的每个键至少执行一次调用。在极少数情况下,每个键可能有多个调用,例如与服务相关的限制,或者如果客户提供的调用Lambda操作函数代码返回对批处理操作的临时失败响应。

在我们的例子中。SDK配置设置的值max_pool_connectionsmax_concurrency设置为940。请注意,由于请求速率增加,您可能会在复制操作期间遇到来自Amazon S3的限制。过多的限制可能会导致运行时间更长的任务,并可能导致任务失败。

作为最佳实践,我们建议应用生命周期过期规则使不完整的分段上传过期到您的S3存储桶,这可能是由于Lambda函数超时而导致的任务失败。

要解决性能问题,请参考S3性能指南。以下是一些快速提示:

  1. 考虑启用S3请求指标跟踪和监控S3存储桶上的请求速率和5XX错误数量。
  2. 请考虑降低您的请求率,通过降低max_concurrencymax_pool_connections设置为较低的值,方法是在启动作业之前更新CloudFormation堆栈参数。例如,如果您要在同一存储桶或同一区域内复制对象,则可以设置SDKmax_concurrency,max_pool_connections,和重试值分别为60、60和30。
  3. 失败并显示 “任务在9xxx秒后超时” 的作业任务表示Lambda函数超时。Lambda超时的可能原因包括S3限制导致函数不断重试任务,直到函数超时,或者可能是对象大小太大而无法在lambda超时限制内复制。根据需要调整SDK配置以满足您的独特要求。
  4. S3批处理操作将利用所有可用的Lambda并发,最多1,000个。如果您需要为其他Lambda函数保留一些并发,则可以选择通过设置保留并发并指定小于1,000的所需值来减少Lambda函数使用的并发。
  5. 如果性能缓慢、限制过多或其他问题仍然存在,请联系AWS Support并显示错误消息和S3 RequestID和扩展RequestID在Amazon S3批处理操作失败中报告函数CloudWatch Logs。您还可以通过查询来获取S3 requestidS3访问或Cloudtrail日志 (如果已启用)。

对于非常大的工作负载; 数百万个对象或tb级数据或期限紧迫的关键工作负载,请考虑在开始复制或迁移过程之前联系您的AWS账户联系人。

六、总结

Amazon S3客户通常在其S3存储桶中存储各种大小的对象,范围从几千字节到数百GB不等。对于经常需要复制大于5 GB的对象作为其工作流程的一部分,以满足业务或合规性要求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值