tavis nörttimaailmassa

EksisONE - artikkeleita ja ohjeita nörttimaailmasta

AWS S3 Glacier: Backup-säilön poisto (vault deletion)

Amazonin Glacier on yksi edullisimmista paikoista pitää varmuuskopioita. Säilytys ei maksa paljon mitään ja palautuskin alkaa syömään euroja vasta kun palautettavia teroja alkaa olla enemmän. Kokeilin sitä pariin otteeseen oman kannettavan backuppeihin ja se toimi sinällään moitteettomasti. Elettiin vuotta 2016 ja silloin Vihdin maaseudulla ainoa tapa päästä nettiin oli seinässä oleva kupari. Taivaan kautta olisi ollut nopeampaa, mutta siihen aikaan edes 4G ei kuulunut meidän kylälle niin hyvin, että sillä olisi dataa kyennyt käyttämään. Kokeilu loppui siihen yksinkertaiseen faktaan, että pelkästään valokuvieni siirtoon olisi mennyt neljä kuukautta – jos palauttamiseenkin tarvittava aika lasketaan kvartaaleissa, niin varmuuskopioina moinen on hyödytön. Joten luovuin käytöstä.

Heräsin yhtenä päivänä alkuvuodesta 2020 siihen, että minähän maksan joka kuukausi Glacieriin tallennetuista tiedostoista, jotka on viety sinne 2016. Kyse ei ole suurista summista, mutta turhasta on turha maksaa – pidä tätä esimerkkinä siitä, että aika ajoin kannattaa tarkastaa mistä kaikesta maailmalle oikein maksaakaan… Joten päätin poistaa nuo ikivanhat ja tarpeettomat säilöt.

Avasin Glacierin ja aloin ihmettelemään miten sieltä poistetaan. Ratkaisua ei löytynyt sen enempää kuin että jos säilössä on tiedostoja, niin sitä ei saa suoraan poistettua.

Glacier eroaa esimerkiksi tavallisesta S3 bucketista siinä, että sinne ei raahata yhtään mitään. Tarvitaan joku ohjelma, joka käyttää sitä. Ohjelma laittaa sinne tiedostoja, ohjelma palauttaa ja ohjelmallisesti säilö myös tyhjennetään.

Voi olla, että nelisen vuotta sitten käyttämäni backup-ohjelma olisi moisen osannut tehdä, mutta minulla ei ollut sitä enää. Joten uudestaan Google auki ja löytyihän ratkaisu. Muuta ei tarvita kuin shell ja nyt kiitin digiluojaa siitä, että teen töitä virtuaaliservereillä. Jos olisin webhotelliasiakas, niin olisin ihmeissäni Windowsin komentorivien kanssa ja miten sinne saa asennettua AWS:n CLI:n. Voi olla, että se onnistuu, mutta itse en lähtisi edes yrittämään.

Avaisin DigitalOceanista 5 euroa kuukaudessa maksavan dropletin ja asentaisin PuTTYn. Säilön poistamiseen menee aikaa sen koosta riippuen muutamista tunneista muutamiin päiviin (todella isoissa muuten menee äkkiä kuukausi…), joten kulut laskettaisiin muutamissa senteissä, kun työn jälkeen poistaa dropletin.

Sinulla täytyy olla asennettuna AWS CLI. Ubuntussa riittää:

apt install awscli

En edes yritä selittää mitä tehdään, vaan ainoastaan luettelen työvaiheet:

aws glacier initiate-job --job-parameters '{"Type": "inventory-retrieval"}' --vault-name SÄILÖN_NIMI --account-id TILISI_ TUNNUS --region ALUE
  • Säilön nimi on Glacierissa oleva vaultin nimi, muista kirjainkoko; tilisi tunnus on AWS-tilin tunnus, numerosarja ja löydät sen esimerkiksi laskutuksen takaa account settingisistä; alue on AWS:n region, Ireland olisi eu-west-1 ja löydät sen kun avaan oikeasta yläkulmasta region-valikon
  • Tämä voi kestää. Pienemmälläkin säilöllä meni muutama tunti ja teralla upposi lähemmäs pari päivää. Mitään etenemispalkkia ei sitten ole, vaan se tapahtuu taustalla. Siirry seuraavaan vaiheeseen.

 

aws glacier list-jobs --vault-name SÄILÖN_NIMI --region ALUE --account-id TILISI_ TUNNUS
  • Kokeile tätä aika ajoin niin kauan, että saat tulosteen, jossa on rivit

...
"Completed": true,
"StatusCode": "Succeeded",
...

  • Kopioi JobId-rivin pitkä merkkijono, sitä käytetään seuraavassa vaiheessa.

 

aws glacier get-job-output --job-id JOB_ID --vault-name SÄILÖN_NIMI --region ALUE --account-id TILISI_ TUNNUS  ./output.json
  • job-id on äsken kopioimasi

Sinun pitää saadaa tällainen ilmoitus:


{
   "status": 200,
   "acceptRanges": "bytes",
   "contentType": "application/json"
}

 

Tehdään säilön poistava skripti.

nano glacier.php
  • Tiedoston nimi saa olla mitä vaan. Kopioi siihen tämä ja muuta tiedot:

<?php

$file = './output.json' ;
$accountId = 'TILISI_TUNNUS' ;
$region = 'ALUE' ;
$vaultName = 'SÄILÖN_NIMI' ;

$string = file_get_contents ( $file ) ;
$json = json_decode($string, true ) ;
foreach ( $json [ 'ArchiveList' ] as $jsonArchives )
{
echo 'Delete Archive: ' . $jsonArchives [ 'ArchiveId' ] . "\n" ;
exec ( 'aws glacier delete-archive --archive-id="' . $jsonArchives [ 'ArchiveId' ] . '" --vault-name ' . $vaultName . ' --account-id ' . $accountId . ' --region ' . $region , $output ) ;
echo $output ;
}

 

php glacier.php
  • säilön sisältö poistetaan

Tiedostojen poisto kestää vähintään yhtä kauan kun sisällön läpikäyminen edellisessä vaiheessa. Joten shell joutuu olemaan auki kauan. Minulla meni yhden säilön läpikäymiseen yö ja tiedostojen poistoon toista päivää. Jostain kumman syystä Amazon ei tarjoa mitään rm -rf tyylistä ratkaisua, joten aikaa palaa.

 

aws glacier delete-vault --vault-name SÄILÖN_NIMI --account-id TILISI_TUNNUS --region ALUE
  • Säilö poistetaan

 

Homman pitäisi nyt olla valmis. Jos se epäonnistui, niin tee uudestaan. Silloin syy saattaa olla siinä, että etenit vaiheesta toiseen liian nopeasti ja taustalla olleet työt eivät ehtineet valmistua. Sen tunnistaa siitä, että säilön koko kuitenkin pieneni. Jos syy on jossain muualla… onnea matkaan, minusta ei ole apua. Mutta sen huomasin, että jos saat glacier.php -tiedoston ajamisesta jonkun syötteen, niin saat poistettua vain osan säilön tiedostoista ja joudut tekemään homman uudestaan. Minä sain isommalla säilöllä tehdä teletappikierroksen kolmasti, ennen kuin se  tyhjeni ja sain säilön poistettua. Miksi noi kävi… en tiedä, mutta yhtään kolmesta säilöstä en saanut kerrasta poistettua, vaan jouduin ainakin kerran toistamaan – joka kerta säilön koko kuitenkin pieneni, joten jotain sieltä hävisi. Sitten kun glacier.php ei anna mitään syötettä, niin poisto onnistuu.

Lopuksi voit poistaa tekemäsi glacier.php tiedoston sekä luodun JSON-tiedoston.

 

Tässä on samat ohjeet, mutta hieman tiivistetymmässä muodossa: