Hyppää sisältöön

Significant changes to Puhti & Mahti authentication coming in April! Read about the SSH key and multi-factor authentication requirements.

S3-asiakas

Tässä luvussa kuvataan, kuinka käyttää Allas-objektien tallennuspalvelua s3cmd komentorivikomentojen avulla. Tämä asiakasohjelma käyttää S3-protokollaa, joka eroaa Swift-protokollasta, jota käytetään Rclone, swift ja a-commands esimerkeissä. Yleensä S3:lla ladatut tiedot ovat käytettävissä myös swift-protokollan kanssa. Kuitenkin, yli 5 GB tiedostot, jotka on ladattu swiftillä Allakseen, eivät ole ladattavissa S3-protokollan avulla.

Käyttäjän näkökulmasta yksi suurimmista eroista S3- ja Swift-protokollien välillä on se, että Swift-pohjaiset yhteydet pysyvät voimassa kahdeksan tuntia kerrallaan, kun taas S3:ssa yhteys pysyy pysyvästi avoimena. Pysyvä yhteys on käytännöllinen monin tavoin, mutta sillä on myös turvallisuusnäkökulma: jos CSC-tilisi vaarantuu, vaarantuu myös objektien tallennustila.

s3cmd-komennon syntaksi:

s3cmd -options command parameters

Yleisimmät s3cmd komennot:

s3cmd komento Toiminto
mb Luo ämpäri (bucket)
put Lataa objekti
ls Listaa objektit ja ämpärit
get Lataa objektit ja ämpärit
cp Siirrä objekti
del Poista objektit tai ämpärit
md5sum Hanki tarkistussumma
info Näytä metadata
signurl Luo väliaikainen URL
put -P Aseta objekti julkiseksi
setacl --acl-grant Hallitse käyttöoikeuksia

Yllä oleva taulukko listaa vain olennaisimmat s3cmd komennot. Täydentävämmän listan saamiseksi, vieraile s3cmd käyttöohje tai kirjoita:

s3cmd -h

S3cmd:n aloittaminen

Jos käytät Allasta Puhtissa tai Mahtissa, kaikki tarvittavat paketit ja ohjelmistot on jo asennettu. Tässä tapauksessa voit ohittaa tämän luvun ja siirtyä osioon S3-yhteyden konfigurointi supertietokoneissa.

Jotta voit konfiguroida s3cmd-yhteyden, sinulla tulee olla OpenStack ja s3cmd asennettuna ympäristöösi.

OpenStack s3cmd asennus:

Fedora/RHEL johdannaiset:

sudo yum update
sudo yum install python3
sudo pip3 install python-openstackclient
sudo yum install s3cmd
Debian johdannaiset:
sudo apt install python3-pip
sudo pip3 install python-openstackclient
sudo apt install restic
curl https://rclone.org/install.sh | sudo bash
sudo pip3 install s3cmd
OSX:
python3 virtualenv
pip3 install s3cmd
s3cmd

Viittaa http://s3tools.org/download ja http://s3tools.org/usage saadaksesi lisätietoa.

S3-yhteyden konfigurointi paikallisessa tietokoneessa

Kun olet asentanut OpenStack ja s3cmd ympäristöösi, voit ladata allas_conf skriptin konfiguroidaksesi S3-yhteyden Allaksen projektiisi.

wget https://raw.githubusercontent.com/CSCfi/allas-cli-utils/master/allas_conf
source allas_conf --mode S3 --user your-csc-username
Huomaa, että sinun tulisi käyttää --user -asetusta määritelläksesi CSC-käyttäjänimesi. Konfigurointikomento kysyy ensin CSC-salasanasi ja sitten valitsemaan Allas-projektin. Sen jälkeen työkalu luo avain-tiedoston S3-yhteyttä varten ja tallentaa sen oletussijaintiin (.s3cfg kotikansiossa).

S3-yhteyden konfigurointi supertietokoneissa

Jotta voit käyttää s3cmd Puhtissa ja Mahtissa, sinun on ensin konfiguroitava yhteys:

module load allas
allas-conf --mode S3
Konfigurointiprosessi kysyy ensin CSC-salasanasi. Sitten se listaa Allas-projektisi ja pyytää valitsemaan käytettävän projektin. Konfigurointitiedot tallennetaan tiedostoon $HOME/.s3cfg. Tämä konfiguraatio tarvitsee määritellä vain kerran. Tulevaisuudessa s3cmd käyttää automaattisesti objektien tallennusyhteyttä, joka on kuvailtu .s3cfg tiedostossa. Jos haluat vaihtaa Allas-projektia, jota s3cmd käyttää, sinun täytyy suorittaa konfigurointikomento uudelleen.

Voit käyttää .s3cfg -tiedostoon tallennettuja S3-todennustietoja myös muissa palveluissa. Voit tarkistaa parhaillaan käytössä olevat access key ja secret_key komennolla:

grep key $HOME/.s3cfg
Kun käytät näitä avaimia muissa palveluissa, sinun tulisi varmistaa, että avaimet pysyvät aina yksityisinä. Kuka tahansa, joka pääsee käsiksi näihin kahteen avaimeen, voi käyttää ja muokata kaikkea projektin dataa Allaksessa.

Tarvittaessa voit deaktivoida S3-avainparin komennolla:

allas-conf --s3remove

Luo ämpärit ja lataa objekteja

Luo uusi ämpäri:

s3cmd mb s3://my_bucket

Lataa tiedosto ämpäriin:

s3cmd put my_file s3://my_bucket

Listaa objektit ja ämpärit

Listaa kaikki ämpärit projektissa:

s3cmd ls

Listaa kaikki objektit ämpärissä:

s3cmd ls s3://my_bucket

Näytä tietoja ämpäristä:

s3cmd info s3://my_bucket

Näytä tietoja objekteista:

s3cmd info s3://my_bucket/my_file

Lataa objektit ja ämpärit

Lataa objekti:

s3cmd get s3://my_bucket/my_file new_file_name
Paramentteri new_file_name on vapaaehtoinen. Se määrittää ladatulle tiedostolle uuden nimen.

Komennolla md5sum voit tarkistaa, ettei tiedosto ole muuttunut tai vioittunut:

$ md5sum my_file new_file_name
   39bcb6992e461b269b95b3bda303addf  my_file
   39bcb6992e461b269b95b3bda303addf  new_file_name

Yllä olevassa esimerkissä tarkistussummat täsmäävät alkuperäisen ja ladatun tiedoston välillä.

Lataa koko ämpäri:

s3cmd get -r s3://my_bucket/

Siirrä objekteja

Kopioi objekti toiseen ämpäriin. Huomaa, että näitä komentoja tulisi käyttää vain objekteihin, jotka on ladattu Allakseen S3-protokollalla:

s3cmd cp s3://sourcebucket/objectname s3://destinationbucket

Esimerkiksi:

$ s3cmd cp s3://bigbucket/bigfish s3://my-new-bucket
kaukokopio: 's3://bigbucket/bigfish' -> 's3://my-new-bucket/bigfish'

Nimeä tiedosto uudelleen kopioidessasi sitä:

$ s3cmd cp s3://bigbucket/bigfish s3://my-new-bucket/newname
kaukokopio: 's3://bigbucket/bigfish' -> 's3://my-new-bucket/newname'

Poista objektit ja ämpärit

Poista objekti:

s3cmd del s3://my_bucket/my_file

Poista ämpäri:

s3cmd rb s3://my_bucket
Huom: Voit poistaa vain tyhjät ämpärit.

s3cmd ja julkiset objektit

Tässä esimerkissä objekti salmon.jpg pseudo-kansiossa kalat tehdään julkiseksi:

$ s3cmd put fishes/salmon.jpg s3://my_fishbucket/fishes/salmon.jpg -P
Objektin julkinen URL on: https://a3s.fi/my_fishbucket/fishes/salmon.jpg

Toisen projektin lukuoikeuden antaminen ämpäriin

Voit hallita käyttöoikeuksia komennolla s3cmd setacl. Tämä komento vaatii projektin UUID (universaali yksilöivä tunniste), jolle haluat myöntää käyttöoikeuden. Projektin jäsenet voivat tarkistaa projektinsa tunnuksen osoitteessa https://pouta.csc.fi/dashboard/identity/ tai käyttämällä komentoa openstack project show. Esimerkiksi Puhtilla ja Mahtilla:

module load allas
allas-conf -k --mode s3cmd
openstack project show $OS_PROJECT_NAME

S3cmd:n tapauksessa luku- ja kirjoitusoikeuksia voidaan hallita sekä kauhoille että objekteille:

Seuraava komento antaa projektin UUID:llä 3d5b0ae8e724b439a4cd16d1290 lukuoikeuden my_fishbucket ämpäriin, mutta ei sen sisällä oleviin objekteihin:

s3cmd setacl --acl-grant=read:3d5b0ae8e724b439a4cd16d1290 s3://my_fishbucket
Samalla tavalla seuraava komento antaa kirjoitusoikeuden vain yhdelle objektille:
s3cmd setacl --acl-grant=write:3d5b0ae8e724b439a4cd16d1290 s3://my_fishbucket/bigfish
Jos haluat muuttaa kaikkien ämpärin objektien käyttöoikeuksia, voit lisätä komennolle --recursive-asetuksen:
s3cmd setacl --recursive --acl-grant=read:3d5b0ae8e724b439a4cd16d1290 s3://my_fishbucket

Voit tarkistaa käyttöoikeudet s3cmd info -komennolla:

$ s3cmd info s3://my_fishbucket|grep -i acl
   ACL:       other_project_uuid: READ
   ACL:       my_project_uuid: FULL_CONTROL

Vaihtoehto --acl-revoke voidaan käyttää lukemis- tai kirjoitusoikeuden poistamiseen:

s3cmd setacl --recursive --acl-revoke=read:$other_project_uuid s3://my_fishbucket

Jaetut objektit ja ämpärit voidaan käyttää sekä S3- että Swift-pohjaisilla työkaluilla. Huomaa kuitenkin, että listauskomennot näyttävät vain projektisi omistamat ämpärit. Jaettujen ämpärien ja objektien tapauksessa sinun on tiedettävä ämpärien nimet voidaksesi käyttää niitä.

Yllä olevassa esimerkissä käyttäjä projektista 3d5b0ae8e724b439a4cd16d1290 ei näe my_fishbucket, kun se on jaettu, komennolla:

s3cmd ls
Hän voi kuitenkin listata ämpärin sisällön komennolla:
s3cmd ls s3://my_fishbucket
Poutan verkkokäyttöliittymässä käyttäjä voi siirtyä jaettuun ämpäriin määrittämällä ämpärin nimen URL-osoitteessa. Siirry projektiin kuuluvan ämpärin ja korvaa URL-osoitteen lopussa oleva ämpärin nimi jaetun ämpärin nimellä:
https://pouta.csc.fi/dashboard/project/containers/container/my_fishbucket

Käyttöesimerkki

Tässä esimerkissä tallennamme yksinkertaisen tietoaineiston Allakseen käyttäen s3cmd.

Ensiksi luo uusi ämpäri. Komento s3cmd ls paljastaa, että objektien tallennustila on alussa tyhjä. Käytä sitten komentoa s3cmd mb luodaksesi uusi ämpäri nimeltään fish-bucket.

$ s3cmd ls
ls

$ s3cmd mb s3://fish-bucket
mb s3://fish-bucket/
Ämpäri 's3://fish-bucket/' luotu

$ s3cmd ls
ls
2018-03-12 13:01  s3://fish-bucket

On suositeltavaa kerätä tallennettava aineisto suuremmiksi yksiköiksi ja pakata se ennen järjestelmään lataamista.

Tässä esimerkissä tallennamme Bowtie2-indeksit ja seeprakalagenomin (danio rerio) kalojen ämpäriin. ls -lh-komennon suorittaminen näyttää, että indeksitiedostot ovat saatavilla nykyisessä hakemistossa:

$ ls -lh
yhteensä 3.2G
-rw------- 1 kkayttaj csc 440M Mar 12 13:41 Danio_rerio.1.bt2
-rw------- 1 kkayttaj csc 327M Mar 12 13:41 Danio_rerio.2.bt2
-rw------- 1 kkayttaj csc 217K Mar 12 13:20 Danio_rerio.3.bt2
-rw------- 1 kkayttaj csc 327M Mar 12 13:20 Danio_rerio.4.bt2
-rw------- 1 kkayttaj csc 1.3G Mar 12 13:13 Danio_rerio.GRCz10.dna.toplevel.fa
-rw------- 1 kkayttaj csc 440M Mar 12 14:03 Danio_rerio.rev.1.bt2
-rw------- 1 kkayttaj csc 327M Mar 12 14:03 Danio_rerio.rev.2.bt2
-rw------- 1 kkayttaj csc 599K Mar 12 13:13 log

Kerää ja pakkaa aineisto yhdeksi tiedostoksi tar-komentoa käyttäen:

tar zcf zebrafish.tgz Danio_rerio*

Lopputiedoston koko on noin 2 GB. Pakattu tiedosto voidaan ladata kalojen ämpäriin käyttämällä komentoa s3cmd put:

$ ls -lh zebrafish.tgz
-rw------- 1 kkayttaj csc 9.3G Mar 12 15:23 zebrafish.tgz

$ s3cmd put zebrafish.tgz s3://fish-bucket
put zebrafish.tgz s3://fish-bucket
lataus: 'zebrafish.tgz' -> 's3://fish-bucket/zebrafish.tgz'  [1 of 1]
 2081306836 of 2081306836   100% in   39s    50.16 MB/s  valmis

$ s3cmd ls s3://fish-bucket
ls s3://fish-bucket
2019-10-01 12:11 9982519261   s3://fish-bucket/zebrafish.tgz

2 GB datan lataaminen vie aikaa. Nouda ladattu tiedosto:

s3cmd get s3://fish-bucket/zebrafish.tgz

Oletusarvoisesti tähän ämpäriin pääsevät vain projektin jäsenet. Kuitenkin käyttämällä komentoa s3cmd setacl, voit tehdä tiedoston julkisesti saatavilla.

Ensiksi tee kalojen ämpäristä julkinen:

s3cmd setacl --acl-public s3://fish-bucket

Sitten tee seeprakalagenomi tiedosto julkiseksi:

s3cmd setacl --acl-public s3://fish-bucket/zebrafish.tgz

Tiedoston URL-osoitteen syntaksi:

https://a3s.fi/bucket_name/object_name

Tässä tapauksessa tiedosto olisi saatavilla linkin avulla https://a3s.fi/fish-bucket/zebrafish.tgz

Objekteiden julkaiseminen tilapäisesti allekirjoitetuilla URL-osoitteilla

Komennolla s3cmd signurl voidaan Allaksessa oleva objekti julkaista tilapäisesti URL-osoitteella, joka sisältää turvallisuutta lisäävän pääsytunnuksen.

Edellisessä esimerkissä objekti s3://fish-bucket/zebrafish.tgz tehtiin pysyvästi saataville yksinkertaisen staattisen URL-osoitteen kautta. Komennolla signurl voidaan sama objekti jakaa turvallisemmin ja vain rajalliseksi ajaksi. Esimerkiksi komento:

s3cmd signurl s3://fish-bucket/zebrafish.tgz +3600
tulostaisi URL-osoitteen, joka säilyy voimassa 3600 s (1 h). Tässä tapauksessa yllä olevan komennon tuottama URL-osoite näyttäisi suunnilleen tältä:
https://fish-bucket.a3s.fi/zebrafish.tgz?AWSAccessKeyId=78e6021a086d52f092b3b2b23bfd7a67&Expires=1599835116&Signature=OLyyCY14s%2F0HxKOOd108mldINyE%3D

Objektien elinkaaren määrittäminen

Jotta sinulla olisi mahdollisuus poistaa/vanhentaa objekteja automaattisesti, voit määrittää elinkaarikäytännön Allas-ämpärille. Ämpärissä olevia objekteja käsitellään elinkaarikäytännön mukaisesti, jos vastaavuusehdot täyttyvät. Vastaavuusehdot voidaan asettaa objektin etuliitteelle ja/tai tunnisteille. Elinkaarikäytäntö soveltuu erityisesti tapauksiin, joissa tiedot on poistettava "ylläpitoa" varten tietyin aikavälein.

Varoitus

Ennen kuin määrität elinkaarikäytännön, varmista osastoltasi/tiimiltäsi, että se vastaa projektissa olevan datan säilytyskäytäntöä. (Lailliset tai säädökselliset rajoitukset).

Seuraavassa elinkaarikäytännössä meillä on kaksi sääntöä. Nimetään se mypolicy.xml.

<?xml version="1.0" ?>
<LifecycleConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
   <Rule>
      <ID>1-days-expiration</ID>
      <Status>Enabled</Status>
      <Expiration>
         <Days>1</Days>
      </Expiration>
      <Filter>
         <Tag>
            <Key>days</Key>
            <Value>1</Value>
         </Tag>
      </Filter>
   </Rule>
   <Rule>
      <ID>30-days-expiration</ID>
      <Status>Enabled</Status>
      <Expiration>
         <Days>30</Days>
      </Expiration>
      <Filter>
         <Tag>
            <Key>days</Key>
            <Value>30</Value>
         </Tag>
      </Filter>
   </Rule>
</LifecycleConfiguration>

Vaihtoehtoisesti politiikat voidaan asettaa prefix-asetuksella, jota voidaan pitää vastaavana kuin kansio. Molempia menetelmiä voidaan myös yhdistää käyttäen <And>-tunnistetta.

<?xml version="1.0" ?>
<LifecycleConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
   <Rule>
      <ID>Daily</ID>
      <Status>Enabled</Status>
      <Prefix>daily/</Prefix>
      <Expiration>
         <Days>30</Days>
      </Expiration>
   </Rule>
   <Rule>
      <ID>Weekly</ID>
      <Status>Enabled</Status>
      <Prefix>weekly/</Prefix>
      <Expiration>
         <Days>365</Days>
      </Expiration>
   </Rule>
</LifecycleConfiguration>

Asettaaksemme tämän elinkaarikäytännön ämpäriimme käytämme setlifecycle-alakomento:

s3cmd setlifecycle mypolicy.xml s3://MY_BUCKET

Voimme tarkistaa nykyisen käytännön getlifecycle-alakomennolla:

s3cmd getlifecycle s3://MY_BUCKET

Tarkista ämpäri (tai objekti) info-alakomennolla:

s3cmd info s3://MY_BUCKET

s3://MY_BUCKET/ (bucket):
   Location:  cpouta-production
   Payer:     BucketOwner
   Expiration Rule: objects with key prefix 'weekly/' will expire in '365' day(s) after creation
   Policy:    none
   CORS:      none
   ACL:       project_xxxxxxx: FULL_CONTROL

Jotta objectit voidaan laittaa elinkaarikäytännön alaisiksi, voit hyödyntää tunnisteita ja/tai etuliitteitä.

  • Tunnisteiden lisääminen tapahtuu antamalla otsikko muodossa x-amz-tagging:KEY=VALUE.
  • Etuliitettä voidaan ajatella "kansiona".

Katsotaanpa seuraavia tapauksia:

# Pitäisi poistaa 24 tunnin sisällä sääntömäärityksen ID: 1-days-expiration mukaisesti
s3cmd --add-header=x-amz-tagging:days=1 put MY_FILE_01.tar.gz s3://MY_BUCKET/
s3cmd --add-header=x-amz-tagging:days=1 put MY_FILE_02.tar.gz s3://MY_BUCKET/gone-in-one-day/

# Pitäisi poistaa 30 päivän sisällä sääntömäärityksen ID: 30-days-expiration mukaisesti
s3cmd --add-header=x-amz-tagging:days=30 put MY_FILE_03.tar.gz s3://MY_BUCKET/

# Pitäisi poistaa 30 päivän sisällä sääntömäärityksen ID: Daily mukaisesti
s3cmd put MY_FILE_04.tar.gz s3://MY_BUCKET/daily/

# Pitäisi poistaa 365 päivän sisällä sääntömäärityksen ID: Weekly mukaisesti
s3cmd put MY_FILE_05.tar.gz s3://MY_BUCKET/weekly/

Muita viitteitä elinkaaren asettamiseksi:

Rajoita ämpärin pääsyä tiettyihin IP-osoitteisiin

Voit rajoittaa pääsyn ämpäriin tiettyihin IP-osoitteisiin määrittelemällä käytännön.

Varoitus

Muista olla estämättä omaa pääsyäsi ämpäriin, et voi käyttää ämpäriä tai korjata käytäntöä, jos teet niin.

Seuraavassa IP-käytäntöesimerkissä sallimme pääsyn ämpäriin POLICY-EXAMPLE-BUCKET IP-aliverkosta 86.50.164.0/24. Nimetään käytäntötiedosto myippolicy.json.

{
    "Version": "2012-10-17",
    "Id": "S3PolicyExample",
    "Statement": [
        {
            "Sid": "IPAllow",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::POLICY-EXAMPLE-BUCKET",
                "arn:aws:s3:::POLICY-EXAMPLE-BUCKET/*"
            ],
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "86.50.164.0/24"
                }
            }
        }
    ]
}

Asettaaksemme tämän IP-käytännön ämpäriimme käytämme setpolicy-alakomento:

s3cmd setpolicy myippolicy.json s3://POLICY-EXAMPLE-BUCKET

Nykyisen käytännön voi tarkistaa info-alakomennolla.

Voimme poistaa nykyisen käytännön delpolicy-alakomennolla:

```bash s3cmd delpolicy s3://POLICY-EXAMPLE-BUCKET s3://POLICY-EXAMPLE-BUCKET/: Policy deleted