【问题标题】:S3 replication: delete files in the source bucket after they've been replicatedS3 复制:复制后删除源存储桶中的文件
【发布时间】:2021-09-16 17:30:08
【问题描述】:

我为另一个账户中的存储桶启用了 S3 复制。将对象复制到目标存储桶后,有什么方法可以从源存储桶中删除它们?

我似乎找不到一个简单的方法来做到这一点。

【问题讨论】:

  • S3 复制功能不支持“复制后删除源对象”afaik。怀疑您应该确​​保所有对象都已正确复制,然后禁用或删除源复制规则。此时存储桶已断开连接,您可以根据需要处理源对象,例如生命周期过渡到 Glacier 或其他。建议您先使用一次性水桶进行测试。

标签: amazon-web-services amazon-s3


【解决方案1】:

您的实际目标似乎是将对象从一个存储桶“移动”到另一个存储桶。

这可以通过一个 AWS Lambda 函数来完成,每当在源存储桶中创建一个新对象时,该函数就会由 Amazon S3 触发。 Lambda 函数应该:

  • 将对象复制到目标存储桶
  • 从源存储桶中删除对象

这避免了配置 S3 复制的需要。

重要提示:将对象复制到其他 AWS 账户拥有的存储桶时,请务必使用ACL=bucket-owner-full-control,以便在复制操作后目标账户“拥有”该对象。

代码类似于:

import boto3
import urllib

DESTINATION_BUCKET = 'bucket2'

def lambda_handler(event, context):
    
    s3_client = boto3.client('s3')

    # Get the bucket and object key from the Event
    for record in event['Records']:
        source_bucket = record['s3']['bucket']['name']
        key = urllib.parse.unquote_plus(record['s3']['object']['key'])
        
        # Copy object
        s3_client.copy_object(
            Bucket = DESTINATION_BUCKET,
            Key = key,
            CopySource= {'Bucket': source_bucket, 'Key': key},
            ACL = 'bucket-owner-full-control'
        )
        
        # Delete source object
        s3_client.delete_object(
            Bucket = source_bucket,
            Key = key
        )

【讨论】:

  • 太棒了!复制失败后(无论出于何种原因),有什么方法可以用 lambda“重新安排”复制?
  • 如果 AWS Lambda 函数失败,它将自动重试给定次数。见:Invoking AWS Lambda functions - AWS Lambda
猜你喜欢
  • 1970-01-01
  • 2017-11-23
  • 2019-08-07
  • 2016-10-27
  • 1970-01-01
  • 2013-07-29
  • 2020-11-29
  • 2013-04-14
  • 1970-01-01
相关资源
最近更新 更多