如何在S3上删除或清除旧文件?


70

是否有现有的解决方案可以删除x天之前的任何文件?


1
现在,我将使用以下解决方案:s3cmd ls s3://mybucket/mypath/ |ruby -rdate -ne 'date, time, size, uri = $_.split; days = (Time.now - Date.parse(date).to_time) / 60/60/24; puts uri if days > 2' |xargs s3cmd del
Erik 2012年

Answers:


94

亚马逊最近引入了对象过期

Amazon S3宣布对象到期

Amazon S3宣布了一项新功能“对象过期”,该功能使您可以在预定的时间段后安排删除对象。使用对象过期来计划定期删除对象,您无需识别要删除的对象并将删除请求提交给Amazon S3。

您可以为存储桶中的一组对象定义对象过期规则。每个对象到期规则都允许您指定前缀和有效期限(以天为单位)。前缀字段(例如 logs/)标识受到期规则约束的对象,并且到期期限指定从创建日期(即年龄)开始的天数,之后应删除一个或多个对象。对象过期后,将排队等待删除。在对象到期之日或之后,无需为您支付存储费用。


1
这是亚马逊提供的一个非常钝的工具。它按照锡罐上的说明去做!如果需要更好地控制删除的方式,则必须使用旧的DELETE方法。另一种选择是拥有多达1000个不同的对象过期规则(以及1000个不同的前缀);您仍然
只能使用1000。– δοδεMεδιϲ 2012年

13
这不会删除“较早的现有文件”。从创建之日起生效。
哈什迪普

1
可以为整个存储桶设置此规则,但不能为存储桶中的单个文件夹设置该规则?
Nikhil Rao

5
@Harshdeep-并非如此。“添加对象过期规则后,该规则将应用于存储桶中已经存在的对象以及创建规则后添加到存储桶中的所有新对象。” aws.amazon.com/blogs/aws/amazon-s3-object-expiration
Slawomir's

1
@Slawomir新的过期规则对存储桶中的现有对象生效需要花费多少时间?
凤凰城



1

以下是使用CloudFormation模板实现它的方法:

  JenkinsArtifactsBucket:
    Type: "AWS::S3::Bucket"
    Properties:
      BucketName: !Sub "jenkins-artifacts"
      LifecycleConfiguration:
        Rules:
          - Id: "remove-old-artifacts"
            ExpirationInDays: 3
            NoncurrentVersionExpirationInDays: 3
            Status: Enabled

如@Ravi Bhatt所述,这将创建生命周期规则

了解更多信息:https : //docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html

对象生命周期管理的工作方式:https : //docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html


0

您可以使用以下Powershell脚本删除之后过期的对象x days

[CmdletBinding()]
Param(  
  [Parameter(Mandatory=$True)]
  [string]$BUCKET_NAME,             #Name of the Bucket

  [Parameter(Mandatory=$True)]
  [string]$OBJ_PATH,                #Key prefix of s3 object (directory path)

  [Parameter(Mandatory=$True)]
  [string]$EXPIRY_DAYS             #Number of days to expire
)

$CURRENT_DATE = Get-Date
$OBJECTS = Get-S3Object $BUCKET_NAME -KeyPrefix $OBJ_PATH
Foreach($OBJ in $OBJECTS){
    IF($OBJ.key -ne $OBJ_PATH){
        IF(($CURRENT_DATE - $OBJ.LastModified).Days -le $EXPIRY_DAYS){
            Write-Host "Deleting Object= " $OBJ.key
            Remove-S3Object -BucketName $BUCKET_NAME -Key $OBJ.Key -Force
        }
    }
}

该脚本不适用于我要删除早于指定时间的对象的方案。行IF(($ CURRENT_DATE-$ OBJ.LastModified).Days -le $ EXPIRY_DAYS)...实际上应该是IF(($ CURRENT_DATE-$ OBJ.LastModified).Days -ge $ EXPIRY_DAYS)...
CarlR
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.