S3 verzování objektů

Verze objektů se používá k uložení více kopií objektu do stejného bloku. Každá z těchto kopií odpovídá obsahu objektu v konkrétním okamžiku v minulosti. Tuto funkci lze použít k ochraně objektů v bucketu před přepsáním nebo náhodným vymazáním.

Tato funkcionalita, která umožňuje historický záznam objektů v bucketu, vyžaduje, aby byl povolen na úrovni bucketu, čímž vznikají tři různé stavy bucketu: „unversioned“, „versioning enabled“ nebo „versioning suspended“.

Nově vytvořený bucket je vždy ve stavu „unversioned“.

Je-li funkce verzování povolena, může se bucket přepínat mezi stavy „versioning enabled“ nebo „versioning suspended“, ale nemůže se vrátit do stavu „unversioned“. To znamená, že po aktivaci nelze zrušit verzování bucketu, lze jej pouze pozastavit.

Každá verze objektu je identifikována pomocí VersionID. Pokud není bucket verzován, bude VersionID hodnota nula. Ve verzovaném bucketu bude aktualizace objektu prostřednictvím požadavku PUT ukládat nový objekt s jedinečným VersionID.

Přístup k verzi objektu v bucketu lze provést prostřednictvím jména nebo kombinace jména a VersionID. V případě přístupu pouze podle jména bude obnovena nejnovější - aktuální verze verze objektu.

V případě odstranění objektu ve verzovaném bucketu budou pokusy o přístup prostřednictvím požadavků GET vracet chybu, pokud nebude zahrnuto VersionID. Chcete-li obnovit odstraněný objekt, není nutné tento objekt stahovat a nahrávat. Stačí zadat operaci KOPIE včetně konkrétního VersionID. Viz níže.

K testování verzování objektů můžete použít AWS CLI, nástroj s otevřeným zdrojovým kódem, který poskytuje příkazy pro interakci se službami AWS z terminálového programu. Konkrétně použijte příkazy rozhraní API AWS CLI obsažené v sadě příkazů s3api.

Verzovaný bucket

Pokud se pro neverzovaný bucket nahraje objekt se stejným klíčem, přepíše jej. Pokud je pro verzovaný bucket nahrán objekt se stejným klíčem, nový nahraný objekt se stane aktuální verzí a předchozí objekt se stane neaktuální verzí:

Pro správnou funkčnost je nezbytné u všech příkazů používat volbu --endpoint-url pro příslušné adresy S3 služeb provozovaných sdružením CESNET.
Jméno bucketu musí být unikátní a mělo by obsahovat pouze malá a velká písmena, čísla a pomlčky a tečky. Název bucketu musí začínat pouze písmenem nebo číslem a nesmí obsahovat tečky vedle pomlček nebo více teček. Dále doporučujeme nepoužívat „/“ a „_“ v názvu, protože by to znemožnilo jeho použití přes API.

$ aws s3api create-bucket --bucket "název bucketu" --profile "název profilu" --endpoint-url=https://s3.cl2.du.cesnet.cz 

$ aws s3api get-bucket-versioning --bucket "název bucketu" --profile "název profilu" --endpoint-url=https://s3.cl2.du.cesnet.cz

$ aws s3api put-bucket-versioning --bucket "název bucketu" --versioning-configuration Status=Enabled --profile "název profilu" --endpoint-url=https://s3.cl2.du.cesnet.cz

$ aws s3api get-bucket-versioning --bucket "název bucketu" --profile "název profilu" --endpoint-url=https://s3.cl2.du.cesnet.cz
{
    "Status": "Enabled",
    "MFADelete": "Disabled"
}


Přidávání objektů

Přidávání objektů

$ aws s3api put-object --key "název souboru" --body "cesta k souboru 1" --bucket "název bucketu" --profile "název profilu" --endpoint-url=https://s3.cl2.du.cesnet.cz 
{
    "ETag": "\"5ec0f1a7fc3a60bf9360a738973f014d\"",
    "VersionId": "KdS5Yl0d06bBSYriIddtVb0h5gofiNX"
}

$ aws s3api put-object --key "název souboru" --body "cesta k souboru 2" --bucket "název bucketu" --profile "název profilu" --endpoint-url=https://s3.cl2.du.cesnet.cz

{
    "ETag": "\"5ec0f1a7fc3a60bf9360a738973f014d\"",
    "VersionId": "xNQC4pIgMYx59digj5.gk15WC4efOOa"
}

$ aws s3api list-object-versions --bucket "název bucketu" --profile "název profilu" --endpoint-url=https://s3.cl2.du.cesnet.cz
 
{
    "Versions": [
        {
            "ETag": "\"5ec0f1a7fc3a60bf9360a738973f014d\"",
            "Size": 13,
            "StorageClass": "STANDARD",
            "Key": "test-key-1",
            "VersionId": "xNQC4pIgMYx59digj5.gk15WC4efOOa",
            "IsLatest": true,
            "LastModified": "2020-05-18T10:34:05.072Z",
            "Owner": {
                "DisplayName": "Testovaci",
                "ID": "user$tenant"
            }
        },
        {
            "ETag": "\"5ec0f1a7fc3a60bf9360a738973f014d\"",
            "Size": 13,
            "StorageClass": "STANDARD",
            "Key": "test-key-1",
            "VersionId": "KdS5Yl0d06bBSYriIddtVb0h5gofiNX",
            "IsLatest": false,
            "LastModified": "2020-05-18T10:33:53.066Z",
            "Owner": {
                "DisplayName": "Testovaci",
                "ID": "user$tenant"
            }
        }
    ]
}


Vyhledávání objektů

Vyhledávání objektů

U bucketu bez verzování se vyhledáváním objektů vrací vždy jediný dostupný objekt. U bucketu s verzováním se vrátí vyhledáváním aktuální objekt:

$ aws s3api list-object-versions --bucket "název bucketu" --profile "název profilu" --endpoint-url=https://s3.cl2.du.cesnet.cz 
{
    "Versions": [
        {
            "ETag": "\"5ec0f1a7fc3a60bf9360a738973f014d\"",
            "Size": 13,
            "StorageClass": "STANDARD",
            "Key": "test-key-1",
            "VersionId": "xNQC4pIgMYx59digj5.gk15WC4efOOa",
            "IsLatest": true,
            "LastModified": "2020-05-18T10:34:05.072Z",
            "Owner": {
                "DisplayName": "Testovaci",
                "ID": "user$tenant"
            }
        },
        {
            "ETag": "\"5ec0f1a7fc3a60bf9360a738973f014d\"",
            "Size": 13,
            "StorageClass": "STANDARD",
            "Key": "test-key-1",
            "VersionId": "KdS5Yl0d06bBSYriIddtVb0h5gofiNX",
            "IsLatest": false,
            "LastModified": "2020-05-18T10:33:53.066Z",
            "Owner": {
                "DisplayName": "Testovaci",
                "ID": "user$tenant"
            }
        }
    ]
}

$ aws s3api get-object --key "název souboru" "název souboru.out" --bucket "název bucketu" --profile "název profilu" --endpoint-url=https://s3.cl2.du.cesnet.cz 
{
    "AcceptRanges": "bytes",
    "LastModified": "Mon, 18 May 2020 10:34:05 GMT",
    "ContentLength": 13,
    "ETag": "\"5ec0f1a7fc3a60bf9360a738973f014d\"",
    "VersionId": "xNQC4pIgMYx59digj5.gk15WC4efOOa",
    "ContentType": "binary/octet-stream",
    "Metadata": {}
}

U verzovaného bucketu lze neaktivní objekty načíst zadáním ID Version:

$ aws s3api list-object-versions --bucket "název bucketu" --profile "název profilu" --endpoint-url=https://s3.cl2.du.cesnet.cz 
{
    "Versions": [
        {
            "ETag": "\"5ec0f1a7fc3a60bf9360a738973f014d\"",
            "Size": 13,
            "StorageClass": "STANDARD",
            "Key": "test-key-1",
            "VersionId": "xNQC4pIgMYx59digj5.gk15WC4efOOa",
            "IsLatest": true,
            "LastModified": "2020-05-18T10:34:05.072Z",
            "Owner": {
                "DisplayName": "Testovaci",
                "ID": "user$tenant"
            }
        },
        {
            "ETag": "\"5ec0f1a7fc3a60bf9360a738973f014d\"",
            "Size": 13,
            "StorageClass": "STANDARD",
            "Key": "test-key-1",
            "VersionId": "KdS5Yl0d06bBSYriIddtVb0h5gofiNX",
            "IsLatest": false,
            "LastModified": "2020-05-18T10:33:53.066Z",
            "Owner": {
                "DisplayName": "Testovaci",
                "ID": "user$tenant"
            }
        }
    ]
}

$ aws s3api list-object-versions --bucket "název bucketu" --version-id KdS5Yl0d06bBSYriIddtVb0h5gofiNX --bucket "název bucketu" --profile "název profilu" --endpoint-url=https://s3.cl2.du.cesnet.cz
{
    "AcceptRanges": "bytes",
    "LastModified": "Mon, 18 May 2020 10:33:53 GMT",
    "ContentLength": 13,
    "ETag": "\"5ec0f1a7fc3a60bf9360a738973f014d\"",
    "VersionId": "KdS5Yl0d06bBSYriIddtVb0h5gofiNX",
    "ContentType": "binary/octet-stream",
    "Metadata": {}
}


Odstraňování objektů

Odstraňování objektů

U bucketu bez verzování je objekt trvale odstraněn a nelze jej obnovit. U bucketu s verzováním zůstanou všechny verze v kbelíku a RGW vloží značku o odstranění, která se stane aktuální verzí:

$ aws s3api list-object-versions --bucket "název bucketu" --profile "název profilu" --endpoint-url=https://s3.cl2.du.cesnet.cz
{
    "Versions": [
        {
            "ETag": "\"5ec0f1a7fc3a60bf9360a738973f014d\"",
            "Size": 13,
            "StorageClass": "STANDARD",
            "Key": "test-key-1",
            "VersionId": "xNQC4pIgMYx59digj5.gk15WC4efOOa",
            "IsLatest": true,
            "LastModified": "2020-05-18T10:34:05.072Z",
            "Owner": {
                "DisplayName": "Testovaci",
                "ID": "user$tenant"
            }
        },

$ aws s3api list-object-versions --bucket "název bucketu" --profile "název profilu" --endpoint-url=https://s3.cl2.du.cesnet.cz 
{
    "Versions": [
        {
            "ETag": "\"5ec0f1a7fc3a60bf9360a738973f014d\"",
            "Size": 13,
            "StorageClass": "STANDARD",
            "Key": "test-key-1",
            "VersionId": "xNQC4pIgMYx59digj5.gk15WC4efOOa",
            "IsLatest": false,
            "LastModified": "2020-05-18T10:34:05.072Z",
            "Owner": {
                "DisplayName": "Testovaci",
                "ID": "user$tenant"
            }
        }
    ],
    "DeleteMarkers": [
        {
            "Owner": {
                "DisplayName": "Testovaci",
                "ID": "user$tenant"
            },
            "Key": "test-key-1",
            "VersionId": "hxV8on0vry4Oz0FNcgsz88aDcQoZO.y",
            "IsLatest": true,
            "LastModified": "2020-05-18T11:21:57.544Z"
        }
    ]
}

Pokud je v případě verzovaného bucketu odstraněn objekt s konkrétním VersionID, dojde k trvalému odstranění:

$ aws s3api delete-object --key "název souboru" --version-id KdS5Yl0d06bBSYriIddtVb0h5gofiNX --bucket "název bucketu" --profile "název profilu" --endpoint-url=https://s3.cl2.du.cesnet.cz
{
    "VersionId": "KdS5Yl0d06bBSYriIddtVb0h5gofiNX"
}

$ aws s3api list-object-versions --bucket "název bucketu" --profile "název profilu" --endpoint-url=https://s3.cl2.du.cesnet.cz 
{
    "DeleteMarkers": [
        {
            "Owner": {
                "DisplayName": "Testovaci",
                "ID": "user$tenant"
            },
            "Key": "test-key-1",
            "VersionId": "ZfT16FPCe2xVMjTh-6qqfUzhQnLQMfg",
            "IsLatest": true,
            "LastModified": "2020-05-18T11:22:48.482Z"
        },

}


Obnova objektů

Obnova objektů

Pro obnovení objektu je doporučeným přístupem kopírování předchozí verze objektu do stejného bucketu. Zkopírovaný objekt se stane aktuální verzí objektu a všechny verze objektu zůstanou zachovány:

$ aws s3api list-object-versions --bucket "název bucketu" --profile "název profilu" --endpoint-url=https://s3.cl2.du.cesnet.cz 
{
    "Versions": [
        {
            "ETag": "\"5ec0f1a7fc3a60bf9360a738973f014d\"",
            "Size": 13,
            "StorageClass": "STANDARD",
            "Key": "test-key-1",
            "VersionId": "xNQC4pIgMYx59digj5.gk15WC4efOOa",
            "IsLatest": false,
            "LastModified": "2020-05-18T10:34:05.072Z",
            "Owner": {
                "DisplayName": "Testovaci",
                "ID": "user$tenant"
            }
        }
    ],
    "DeleteMarkers": [
        {
            "Owner": {
                "DisplayName": "Testovaci",
                "ID": "user$tenant"
            },
            "Key": "test-key-1",
            "VersionId": "hxV8on0vry4Oz0FNcgsz88aDcQoZO.y",
            "IsLatest": true,
            "LastModified": "2020-05-18T11:21:57.544Z"
        }
    ]
}

$ aws s3api copy-object --bucket "název bucketu" --profile "název profilu" --endpoint-url=https://s3.cl2.du.cesnet.cz --copy-source "název bucketu"/"název souboru"?versionId=xNQC4pIgMYx59digj5.gk15WC4efOOa --key "název souboru" 

{
    "CopyObjectResult": {
        "ETag": "5ec0f1a7fc3a60bf9360a738973f014d",
        "LastModified": "2020-05-18T13:28:52.553Z"
    }
}

$ aws s3api list-object-versions --bucket "název bucketu" --profile "název profilu" --endpoint-url=https://s3.cl2.du.cesnet.cz 
{
    "Versions": [
           {
            "ETag": "\"5ec0f1a7fc3a60bf9360a738973f014d\"",
            "Size": 13,
            "StorageClass": "STANDARD",
            "Key": "test-key-1",
            "VersionId": "EYXgE1z-28VkVS4zTD55SetB7Wdwk1V",
            "IsLatest": true,
            "LastModified": "2020-05-18T13:28:52.553Z",
            "Owner": {
                "DisplayName": "Testovaci",
                "ID": "strnad$strnad"
            }
        },
        {
            "ETag": "\"5ec0f1a7fc3a60bf9360a738973f014d\"",
            "Size": 13,
            "StorageClass": "STANDARD",
            "Key": "test-key-1",
            "VersionId": "xNQC4pIgMYx59digj5.gk15WC4efOOa",
            "IsLatest": false,
            "LastModified": "2020-05-18T10:34:05.072Z",
            "Owner": {
                "DisplayName": "Testovaci",
                "ID": "user$tenant"
            }
        }
    ],
    "DeleteMarkers": [
        {
            "Owner": {
                "DisplayName": "Testovaci",
                "ID": "user$tenant"
            },
            "Key": "test-key-1",
            "VersionId": "hxV8on0vry4Oz0FNcgsz88aDcQoZO.y",
            "IsLatest": false,
            "LastModified": "2020-05-18T11:21:57.544Z"
        }
    ]
}