Przejdź do treści

Wersjonowanie obiektów

Versioning pozwala przechowywać wiele wersji tego samego obiektu w jednym buckecie.

Jest to przydatne szczególnie wtedy, gdy chcesz ograniczyć skutki:

  • przypadkowego nadpisania pliku,
  • przypadkowego usunięcia pliku,
  • błędnej aktualizacji danych,
  • zmian wykonanych przez aplikację lub użytkownika.

Jak działa versioning?

Bez versioningu przesłanie nowego obiektu pod tym samym kluczem zastępuje poprzednią zawartość.

Przykład:

raport.pdf

Jeżeli prześlesz nowy plik również jako:

raport.pdf

poprzednia zawartość zostanie zastąpiona.

Po włączeniu versioningu S3 może przechowywać wiele wersji tego samego obiektu.

Przykład:

raport.pdf
├── Version ID: wersja-1
├── Version ID: wersja-2
└── Version ID: wersja-3

Aktualnie widoczna jest najnowsza wersja, ale wcześniejsze wersje nadal mogą być dostępne.

Włączenie versioningu

Aby włączyć versioning dla bucketa:

aws \
  --profile cloud4you \
  --endpoint-url https://s3.cloud4you.pl \
  --region eu-pl-1 \
  s3api put-bucket-versioning \
  --bucket firma-backup \
  --versioning-configuration Status=Enabled

Sprawdzenie statusu

Aby sprawdzić status versioningu:

aws \
  --profile cloud4you \
  --endpoint-url https://s3.cloud4you.pl \
  --region eu-pl-1 \
  s3api get-bucket-versioning \
  --bucket firma-backup

Dla bucketa z włączonym versioningiem odpowiedź może wyglądać tak:

{
  "Status": "Enabled"
}

Co dzieje się po nadpisaniu obiektu?

Załóżmy, że przesłałeś:

raport.pdf

a następnie przesłałeś nowy plik pod tym samym kluczem.

Przy włączonym versioningu poprzednia wersja nie musi zostać utracona.

Możesz sprawdzić wszystkie wersje:

aws \
  --profile cloud4you \
  --endpoint-url https://s3.cloud4you.pl \
  s3api list-object-versions \
  --bucket firma-backup

Lista wersji konkretnego obiektu

Możesz ograniczyć wynik do określonego klucza:

aws \
  --profile cloud4you \
  --endpoint-url https://s3.cloud4you.pl \
  s3api list-object-versions \
  --bucket firma-backup \
  --prefix raport.pdf

Przykładowa odpowiedź może zawierać:

{
  "Versions": [
    {
      "Key": "raport.pdf",
      "VersionId": "example-version-id",
      "IsLatest": true
    }
  ]
}

Pobranie konkretnej wersji

Jeżeli znasz Version ID, możesz pobrać konkretną wersję obiektu:

aws \
  --profile cloud4you \
  --endpoint-url https://s3.cloud4you.pl \
  s3api get-object \
  --bucket firma-backup \
  --key raport.pdf \
  --version-id "VERSION_ID" \
  raport-stara-wersja.pdf

Zastąp:

VERSION_ID

rzeczywistym identyfikatorem wersji.

Usunięcie obiektu przy włączonym versioningu

Przy włączonym versioningu standardowe usunięcie obiektu:

aws \
  --profile cloud4you \
  --endpoint-url https://s3.cloud4you.pl \
  s3 rm s3://firma-backup/raport.pdf

może utworzyć tak zwany Delete Marker.

Oznacza to, że obiekt przestanie być widoczny jako aktualny, ale jego wcześniejsze wersje mogą nadal istnieć.

Delete Marker

Delete Marker zachowuje się jak informacja, że aktualna wersja obiektu została usunięta.

Przykład:

raport.pdf
├── Delete Marker      <- aktualny
├── Version ID: v3
├── Version ID: v2
└── Version ID: v1

Standardowe wyświetlenie zawartości bucketa może nie pokazać raport.pdf, mimo że starsze wersje nadal znajdują się w storage.

Wyświetlenie Delete Markerów

aws \
  --profile cloud4you \
  --endpoint-url https://s3.cloud4you.pl \
  s3api list-object-versions \
  --bucket firma-backup

W odpowiedzi mogą pojawić się sekcje:

Versions
DeleteMarkers

Przywrócenie usuniętego obiektu

Jeżeli usunięcie utworzyło Delete Marker, wcześniejsze wersje obiektu nadal mogą istnieć.

Jednym ze sposobów przywrócenia obiektu jest usunięcie aktualnego Delete Markera.

Najpierw znajdź jego Version ID:

aws \
  --profile cloud4you \
  --endpoint-url https://s3.cloud4you.pl \
  s3api list-object-versions \
  --bucket firma-backup \
  --prefix raport.pdf

Następnie usuń konkretny Delete Marker:

aws \
  --profile cloud4you \
  --endpoint-url https://s3.cloud4you.pl \
  s3api delete-object \
  --bucket firma-backup \
  --key raport.pdf \
  --version-id "DELETE_MARKER_VERSION_ID"

Po usunięciu Delete Markera poprzednia wersja może ponownie stać się aktualną.

Sprawdź Version ID

Usunięcie konkretnej wersji jest operacją nieodwracalną.

Przed wykonaniem polecenia upewnij się, że wskazujesz właściwy Version ID.

Trwałe usunięcie konkretnej wersji

Aby trwale usunąć określoną wersję obiektu:

aws \
  --profile cloud4you \
  --endpoint-url https://s3.cloud4you.pl \
  s3api delete-object \
  --bucket firma-backup \
  --key raport.pdf \
  --version-id "VERSION_ID"

Trwałe usunięcie

Usunięcie konkretnego Version ID powoduje usunięcie tej wersji obiektu.

Nie jest to to samo co standardowe usunięcie, które może utworzyć Delete Marker.

Zawieszenie versioningu

Versioning można zawiesić:

aws \
  --profile cloud4you \
  --endpoint-url https://s3.cloud4you.pl \
  --region eu-pl-1 \
  s3api put-bucket-versioning \
  --bucket firma-backup \
  --versioning-configuration Status=Suspended

Sprawdzenie:

aws \
  --profile cloud4you \
  --endpoint-url https://s3.cloud4you.pl \
  s3api get-bucket-versioning \
  --bucket firma-backup

Odpowiedź może wyglądać tak:

{
  "Status": "Suspended"
}

Suspended nie usuwa wcześniejszych wersji

Zawieszenie versioningu nie powoduje automatycznego usunięcia wersji zapisanych wcześniej.

Starsze wersje nadal zajmują przestrzeń.

Versioning a wykorzystanie przestrzeni

Każda wersja obiektu zajmuje miejsce.

Przykład:

raport.zip - wersja 1 - 10 GB
raport.zip - wersja 2 - 10 GB
raport.zip - wersja 3 - 10 GB

Łączne zużycie może wynosić:

30 GB

mimo że użytkownik widzi tylko jeden aktualny plik o rozmiarze 10 GB.

Versioning wpływa na quota

Starsze wersje obiektów oraz dane pozostające w buckecie mogą być uwzględniane w wykorzystaniu przydzielonej przestrzeni.

Versioning nie jest backupem

Versioning zwiększa odporność na przypadkowe zmiany, ale nie należy traktować go jako pełnego zamiennika kopii zapasowej.

Nie chroni przed każdym scenariuszem, szczególnie gdy użytkownik lub aplikacja posiada uprawnienia do trwałego usuwania wersji.

Dla danych krytycznych stosuj niezależną strategię backupu i retencji.

Kiedy warto włączyć versioning?

Versioning warto rozważyć dla:

  • dokumentów,
  • archiwów,
  • danych aplikacyjnych,
  • konfiguracji,
  • ważnych plików użytkowników,
  • danych często nadpisywanych.

W przypadku repozytoriów backupowych należy również uwzględnić sposób działania konkretnego oprogramowania backupowego i jego własną politykę retencji.

Najczęściej używane polecenia

Włączenie:

aws \
  --profile cloud4you \
  --endpoint-url https://s3.cloud4you.pl \
  s3api put-bucket-versioning \
  --bucket firma-backup \
  --versioning-configuration Status=Enabled

Status:

aws \
  --profile cloud4you \
  --endpoint-url https://s3.cloud4you.pl \
  s3api get-bucket-versioning \
  --bucket firma-backup

Lista wersji:

aws \
  --profile cloud4you \
  --endpoint-url https://s3.cloud4you.pl \
  s3api list-object-versions \
  --bucket firma-backup

Zawieszenie:

aws \
  --profile cloud4you \
  --endpoint-url https://s3.cloud4you.pl \
  s3api put-bucket-versioning \
  --bucket firma-backup \
  --versioning-configuration Status=Suspended