There’s got to be a better way….
If you put Object Lock on a bucket and use retention hold periods on your data to protect from early/ransomeware deletion, then when it comes time to remove thate data – how do you know what the earliest date that you can delete that data?
$nt =0
$endloop=0
$iter = 0
$max=1000
$oo= "newkey"
$od = "1970-01-01"
$bucket = "mybucket"
while ($ndloop -ne 1) {
$now = (get-date).ToString('T')
write-host "$nt (Iteration items done $iter $now)"
$k = aws s3api list-objects --bucket $bucket--max-items $max --starting-token $nt | ConvertFrom-Json
$nt= $k.NextToken
write-host $nt
#If $nt not defined we are at the end of the list. Exit loop
if ($nt.Length -lt 5) {
write-host $nt
$endloop=1
}
foreach ($key in $k.Contents) {
#write-host $key.Key
$r = aws s3api get-object-retention --bucket $bucket--key $key.Key | ConvertFrom-Json
$d = $r.Retention.RetainUntilDate
#write-host $d
if ((get-date $d) -gt (get-date $od)) {
# further out
$od = $d
$oo = $key.Key
write-host "Longest ret hold $od $oo"
}
}
$iter+=$max
}
The above script works. But it’s slow. It uses list-object to get all the objects in a bucket, and then for each of those calls get-object-retention to find the retention date and prints if later than what we’ve seen before.
Problem is I can only iterate about 1000 objects in 15 minutes. Not ideal when my bucket has a couple of million objects.
S3 Object Lock
