Wie lösche oder lösche ich alte Dateien in S3?


70

Gibt es bereits Lösungen zum Löschen von Dateien, die älter als x Tage sind?


1
Im Moment werde ich diese Lösung verwenden: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

Antworten:


94

Amazon hat kürzlich den Objektablauf eingeführt .

Amazon S3 kündigt Objektablauf an

Amazon S3 hat mit Object Expiration eine neue Funktion angekündigt, mit der Sie das Löschen Ihrer Objekte nach einem vordefinierten Zeitraum planen können. Durch die Verwendung von Object Expiration zum Planen des regelmäßigen Entfernens von Objekten müssen Sie keine Objekte zum Löschen identifizieren und Löschanforderungen an Amazon S3 senden.

Sie können Objektablaufregeln für eine Reihe von Objekten in Ihrem Bucket definieren. Mit jeder Objektablaufregel können Sie ein Präfix und einen Ablaufzeitraum in Tagen angeben. Das Präfixfeld (z. B. logs/) identifiziert die Objekte, die der Ablaufregel unterliegen, und der Ablaufzeitraum gibt die Anzahl der Tage ab dem Erstellungsdatum (dh dem Alter) an, nach denen Objekte entfernt werden sollen. Sobald die Objekte ihr Ablaufdatum überschritten haben, werden sie zum Löschen in die Warteschlange gestellt. Die Lagerung von Objekten am oder nach ihrem Ablaufdatum wird Ihnen nicht in Rechnung gestellt.


1
Das ist ein ziemlich stumpfes Tool von Amazon. es macht was es verspricht! Wenn Sie eine genauere Kontrolle über das Löschen benötigen, müssen Sie die alte DELETE-Methode verwenden. Eine andere Möglichkeit besteht darin, bis zu 1000 verschiedene Objektablaufregeln (und 1000 verschiedene Präfixe) zu haben. Sie sind immer noch auf 1000 begrenzt.
1οδεMεδιϲ

13
Dadurch werden die "älteren, bereits vorhandenen Dateien" nicht gelöscht. Es wird ab dem Zeitpunkt wirksam, an dem Sie es erstellen.
Harshdeep

1
Diese Regel kann für den gesamten Bucket festgelegt werden, jedoch nicht für einzelne Ordner im Bucket.
Nikhil Rao

5
@ Harshdeep - also nicht wirklich. "Nachdem eine Objektablaufregel hinzugefügt wurde, wird die Regel auf Objekte angewendet, die bereits im Bucket vorhanden sind, sowie auf alle neuen Objekte, die dem Bucket hinzugefügt werden, nachdem die Regel erstellt wurde." aws.amazon.com/blogs/aws/amazon-s3-object-expiration
Slawomir

1
@Slawomir Wie lange dauert es, bis eine neue Ablaufregel für vorhandene Objekte im Bucket wirksam wird?
Phoenix



1

So implementieren Sie es mithilfe einer CloudFormation-Vorlage:

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

Dadurch wird eine Lebenszyklusregel erstellt, die von @Ravi Bhatt erläutert wird

Lesen Sie dazu mehr: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html

Funktionsweise der Verwaltung des Objektlebenszyklus: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html


0

Sie können das folgende Powershell-Skript verwenden, um abgelaufene Objekte zu löschen 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
        }
    }
}

Dieses Skript funktioniert nicht für das von mir gewünschte Szenario, in dem Objekte gelöscht werden, die älter als die angegebene Zeit sind. Die Zeile IF (($ CURRENT_DATE - $ OBJ.LastModified) .Days -le $ EXPIRY_DAYS) ... sollte eigentlich IF (($ CURRENT_DATE - $ OBJ.LastModified) .Days -ge $ EXPIRY_DAYS) sein ...
CarlR
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.