Этот сценарий AWS CLI bash работает, но как ограничить его удаление только файлов журнала на верхнем уровне? - PullRequest
0 голосов
/ 18 февраля 2020

Я не пишу много сценариев bash, особенно с AWS, поэтому могу использовать некоторую помощь.

Результаты включения AWS S3 Ведение журнала с контролем версий одновременно и в итоге он сгенерировал более 70000 файлов журналов (радость), а затем попытка удаления устанавливает только маркер удаления файла.

Сценарий оболочки bash, представленный ниже, прекрасно работает для удаления всех версий объектов / файлов S3 и удаления маркеры в данном сегменте.

Проблема в том, что мне нужно сохранить 25 ГБ реальных / le git файлов, но мне нужно удалить 70000 версий файлов журналов с маркерами удаления, которые были смешаны.

Это больше ничего не делает, потому что они версионные и уже имеют маркеры удаления: aws s3 rm s3: // MYBUCKETNAME / --exclude "" --include "2020- "

Не думайте, что срок действия LifeCycle истек все будет работать, потому что действительные файлы смешиваются с действительными файлами до и после, единственное, что я могу думать о том, что может сработать, - это удалить файлы, начинающиеся с «2020-» (НО, только на верхнем уровне, НЕ рекурсивно .)

Итак, я хочу изменить скрипт ниже, чтобы удалить только те файлы, которые начинаются с «2020-» (НО, только на верхнем уровне), то есть все файлы журналов, случайно созданные на контейнер S3.

2020-01-25-07-33-44-DAC13CC9B600B11A 2020-01-25-07-33-46-59F44EEC6F93E8C7 2020-01-25-07-33-47-786A5091CABF6912 ... et c ...

    #!/bin/bash

    #USAGE: sh delete_all_object_versions.sh MYBUCKETNAME

    bucket=$1

    set -e

    echo "Removing all versions from $bucket"

    versions=`aws s3api list-object-versions --bucket $bucket |jq '.Versions'`
    markers=`aws s3api list-object-versions --bucket $bucket |jq '.DeleteMarkers'`

    echo "removing files"
    for version in $(echo "${versions}" | jq -r '.[] | @base64'); do
        version=$(echo ${version} | base64 --decode)

        key=`echo $version | jq -r .Key`
        versionId=`echo $version | jq -r .VersionId `
        cmd="aws s3api delete-object --bucket $bucket --key $key --version-id $versionId"
        echo $cmd
        $cmd
    done

    echo "removing delete markers"
    for marker in $(echo "${markers}" | jq -r '.[] | @base64'); do
        marker=$(echo ${marker} | base64 --decode)

        key=`echo $marker | jq -r .Key`
        versionId=`echo $marker | jq -r .VersionId `
        cmd="aws s3api delete-object --bucket $bucket --key $key --version-id $versionId"
        echo $cmd
        $cmd
    done

1 Ответ

0 голосов
/ 18 февраля 2020

Я нашел решение удалить 85 000 файлов журналов, которые были удалены (с маркерами удаления), после прочтения полезного комментария Джона, используя префикс, чтобы гарантировать, что объекты начинаются с '2020 -'.

Это удалил только файлы журналов, начиная с '2020-' на уровне root контейнера S3 и НЕ go в подпапки, такие как "mp3 / 2020-", поэтому он оставил действительные файлы, которые начинались с дат года.

versions=`aws s3api list-object-versions --bucket $bucket --prefix '2020-' |jq '.Versions'`
markers=`aws s3api list-object-versions --bucket $bucket --prefix '2020-' |jq '.DeleteMarkers'`

Ниже приведен окончательный сценарий bash, который я запустил на своей Ma c с AWS CLI S3API ...

#!/bin/bash

#USAGE: sh delete_all_object_versions.sh BUCKETNAME
#TEST:  aws s3api list-objects --bucket BUCKETNAME --prefix '2020-'

bucket=$1

set -e

echo "Removing all versions from $bucket"

versions=`aws s3api list-object-versions --bucket $bucket --prefix '2020-' |jq '.Versions'`
markers=`aws s3api list-object-versions --bucket $bucket --prefix '2020-' |jq '.DeleteMarkers'`

echo "removing files"
for version in $(echo "${versions}" | jq -r '.[] | @base64'); do 
    version=$(echo ${version} | base64 --decode)

    key=`echo $version | jq -r .Key`
    versionId=`echo $version | jq -r .VersionId `
    cmd="aws s3api delete-object --bucket $bucket --key $key --version-id $versionId"
    echo $cmd
    $cmd
done

echo "removing delete markers"
for marker in $(echo "${markers}" | jq -r '.[] | @base64'); do 
    marker=$(echo ${marker} | base64 --decode)

    key=`echo $marker | jq -r .Key`
    versionId=`echo $marker | jq -r .VersionId `
    cmd="aws s3api delete-object --bucket $bucket --key $key --version-id $versionId"
    echo $cmd
    $cmd
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...