Object Storage Swift - Mémo de commandes Swift
Objectif
Vous pouvez utiliser l’API OpenStack pour générer divers scripts afin d’automatiser vos actions sur vos instances Public Cloud.
Le swiftclient OpenStack vous permet d’interagir avec vos conteneurs et objets et de les gérer. Vous pourrez par exemple envoyer des fichiers de manière régulière vers vos conteneurs afin de les sauvegarder.
Retrouvez dans ce guide les principales commandes swift pour gérer vos conteneurs d'objets à l’aide de python-swiftclient.
Prérequis
En pratique
Créer un conteneur PCS
swift stat <conteneur> <objet>
Lister le(s) conteneur(s) relatif(s) à un compte
Lister le contenu d'un conteneur
Upload d'un objet inférieur à 5GB
swift upload <conteneur> <objet>
Upload d'un objet supérieur à 5GB en mode SLO
swift upload --use-slo --segment-size 1G <conteneur> <objet>
Upload d'un objet supérieur à 5GB en mode DLO
swift upload --segment-size 1G <conteneur> <objet>
Abandon de l'upload d'un LargeObject
$ swift upload --use-slo --segment-size 500M <conteneur> <objet>
^C Aborted
$ swift list
<conteneur>
<conteneur_segments>
$ swift list <conteneur>
$
$ swift list <conteneur_segments>
<objet>/slo/1628738591.297565/6442450944/524288000/00000000
<objet>/slo/1628738591.297565/6442450944/524288000/00000001
<objet>/slo/1628738591.297565/6442450944/524288000/00000002
<objet>/slo/1628738591.297565/6442450944/524288000/00000003
<objet>/slo/1628738591.297565/6442450944/524288000/00000004
<objet>/slo/1628738591.297565/6442450944/524288000/00000005
<objet>/slo/1628738591.297565/6442450944/524288000/00000006
<objet>/slo/1628738591.297565/6442450944/524288000/00000007
<objet>/slo/1628738591.297565/6442450944/524288000/00000008
<objet>/slo/1628738591.297565/6442450944/524288000/00000009
Il est donc recommandé de supprimer le conteneur <conteneur_segments> ou au moins les segments ccorrespondant à l'objet abandonné.
Download d'un objet
swift download <conteneur> <objet>
Supprimer un conteneur vide
Supprimer un conteneur non vide
Supprimer un objet
swift delete <conteneur> <objet>
Supprimer des objets répondant à un préfixe
swift delete --prefix <prefix> <conteneur>
swift post -H "X-Container-Meta-Access-Control-Allow-Origin:http://example.com" <conteneur>
swift post -m "my-custom-key:value" <conteneur> <objet>
swift post -H "X-Container-Meta-Access-Control-Allow-Origin:" <conteneur>
swift post -m "my-custom-key:" <conteneur> <objet>
swift post -H "X-Remove-Object-My-Custom-Key:" <conteneur> <objet>
Définir l'ACL de lecture sur un conteneur
swift post <conteneur> -r "${OS_TENANT_ID}:*"
Définir l'ACL d'écriture sur un conteneur
swift post <conteneur> -w "${OS_TENANT_ID}:*"
Supprimer l'ACL de lecture sur un conteneur
swift post <conteneur> -r ""
Supprimer l'ACL d'écriture sur un conteneur
swift post <conteneur> -w ""
Déplacer des objets d'un conteneur à un autre
swift copy -d /<conteneur_de_destination> <conteneur> <objet>
Particularité des LargeObject
Info
Dans cet exemple, le LargeObject à été uploadé en mode SLO.
Consultez la documentation Mémo de commandes curl pour l'upload du manifest.
Sur un LargeObject, la commande swift copy renvoie une erreur 413 :
swift copy -d /<conteneur_de_destination> <conteneur> <largeobject>
created container <conteneur_de_destination>
Object COPY failed: https://storage.gra.cloud.ovh.net/v1/AUTH_702xxxxxxxxxxxxxxxxxxxxxxxxxxdaf/<conteneur>/<largeobject> 413 Request Entity Too Large [first 60 chars of response] b'<html><h1>Request Entity Too Large</h1><p>The body of your r'
Il faut donc commencer par déplacer les segments:
for obj in $(swift list <conteneur_segments>);do swift copy -d /<conteneur_de_destination_segments> <conteneur_segments> $obj;done
created container <conteneur_de_destination_segments>
<conteneur_segments>/<largeobject>/slo/1629978906.614903/6442450944/1073741824/00000000 copied to /<conteneur_de_destination_segments>/<largeobject>/slo/1629978906.614903/6442450944/1073741824/00000000
created container <conteneur_de_destination_segments>
<conteneur_segments>/<largeobject>/slo/1629978906.614903/6442450944/1073741824/00000001 copied to /<conteneur_de_destination_segments>/<largeobject>/slo/1629978906.614903/6442450944/1073741824/00000001
created container <conteneur_de_destination_segments>
<conteneur_segments>/<largeobject>/slo/1629978906.614903/6442450944/1073741824/00000002 copied to /<conteneur_de_destination_segments>/<largeobject>/slo/1629978906.614903/6442450944/1073741824/00000002
created container <conteneur_de_destination_segments>
<conteneur_segments>/<largeobject>/slo/1629978906.614903/6442450944/1073741824/00000003 copied to /<conteneur_de_destination_segments>/<largeobject>/slo/1629978906.614903/6442450944/1073741824/00000003
created container <conteneur_de_destination_segments>
<conteneur_segments>/<largeobject>/slo/1629978906.614903/6442450944/1073741824/00000004 copied to /<conteneur_de_destination_segments>/<largeobject>/slo/1629978906.614903/6442450944/1073741824/00000004
created container <conteneur_de_destination_segments>
<conteneur_segments>/<largeobject>/slo/1629978906.614903/6442450944/1073741824/00000005 copied to /<conteneur_de_destination_segments>/<largeobject>/slo/1629978906.614903/6442450944/1073741824/00000005
Puis récupérer le manifest, l'adapter et le ré-uploader
$(swift auth)
curl -s -X GET "$OS_STORAGE_URL/<conteneur>/<largeobject>?multipart-manifest=get" -H "X-Auth-Token:$OS_AUTH_TOKEN" | jq '.' > <largeobject>.json
sed -i 's/name/path/g' <largeobject>.json
sed -i 's/bytes/size_bytes/g' <largeobject>.json
sed -i '/hash/d' <largeobject>.json
sed -i '/last_modified/d' <largeobject>.json
sed -i '/content_type/d' <largeobject>.json
sed -i '/path/s/,$//g' <largeobject>.json
curl -i -X PUT -H "X-Auth-Token:$OS_AUTH_TOKEN" -T <largeobject>.json "$OS_STORAGE_URL/<conteneur_de_destination>/<largeobject>?multipart-manifest=put"
Renommer un conteneur
Il n'est pas possible de renommer un conteneur. Il faut pour cela créer un nouveau conteneur et ré-uploader les objets dedans. Cependant, Swift dispose de la fonction copy qui semble fournir de meilleures performances.
Délai pour uploader 2Gb (1500 objets de 1M et 1 objet de 500M) :
time swift upload <conteneur> ./*
real 69m26,159s
user 0m20,017s
sys 0m3,689s
swift list --lh -t <conteneur>
2.0G
time for obj in $(swift list <conteneur>);do swift copy -d /<autre_conteneur> <conteneur> $obj; done
real 54m43,898s
user 12m38,060s
sys 1m34,394s
swift list
<autre_conteneur>
<conteneur>
swift list --lh -t <autre_conteneur>
2.0G
On remarque que, pour les petits objets, cela ne change pas grand chose. Par contre, pour les objets de taille un peu plus conséquente (500M) :
time swift upload <conteneur> <objet> --object-name <objet_bis>
<objet_bis>
real 15m51,525s
user 0m4,245s
sys 0m0,848s
time swift copy -d /<autre_conteneur> <conteneur> <objet_bis>
created container <autre_conteneur>
<conteneur>/<objet_bis> copied to /<autre_conteneur>/<objet_bis>
real 0m11,924s
user 0m0,464s
sys 0m0,091s
Particularité des LargeObject
Info
Dans cet exemple, le LargeObject à été uploader en mode SLO.
Consultez la documentation Mémo de commandes Curl pour l'upload du manifest.
time swift upload --use-slo --segment-size 1G <conteneur> <largeobject>
<largeobject> segment 4
<largeobject> segment 2
<largeobject> segment 0
<largeobject> segment 1
<largeobject> segment 5
<largeobject> segment 3
<largeobject>
real 190m55,547s
user 0m57,906s
sys 0m14,246s
Sur un LargeObject, la commande swift copy renvoie une erreur 413 :
swift copy -d /<conteneur_de_destination> <conteneur> <largeobject>
created container <conteneur_de_destination>
Object COPY failed: https://storage.gra.cloud.ovh.net/v1/AUTH_702xxxxxxxxxxxxxxxxxxxxxxxxxxdaf/<conteneur>/<largeobject> 413 Request Entity Too Large [first 60 chars of response] b'<html><h1>Request Entity Too Large</h1><p>The body of your r'
Il faut donc commencer par déplacer les segments :
for obj in $(swift list <conteneur_segments>);do swift copy -d /<conteneur_de_destination_segments> <conteneur_segments> $obj;done
created container <conteneur_de_destination_segments>
<conteneur_segments>/<largeobject>/slo/1629978906.614903/6442450944/1073741824/00000000 copied to /<conteneur_de_destination_segments>/<largeobject>/slo/1629978906.614903/6442450944/1073741824/00000000
created container <conteneur_de_destination_segments>
<conteneur_segments>/<largeobject>/slo/1629978906.614903/6442450944/1073741824/00000001 copied to /<conteneur_de_destination_segments>/<largeobject>/slo/1629978906.614903/6442450944/1073741824/00000001
created container <conteneur_de_destination_segments>
<conteneur_segments>/<largeobject>/slo/1629978906.614903/6442450944/1073741824/00000002 copied to /<conteneur_de_destination_segments>/<largeobject>/slo/1629978906.614903/6442450944/1073741824/00000002
created container <conteneur_de_destination_segments>
<conteneur_segments>/<largeobject>/slo/1629978906.614903/6442450944/1073741824/00000003 copied to /<conteneur_de_destination_segments>/<largeobject>/slo/1629978906.614903/6442450944/1073741824/00000003
created container <conteneur_de_destination_segments>
<conteneur_segments>/<largeobject>/slo/1629978906.614903/6442450944/1073741824/00000004 copied to /<conteneur_de_destination_segments>/<largeobject>/slo/1629978906.614903/6442450944/1073741824/00000004
created container <conteneur_de_destination_segments>
<conteneur_segments>/<largeobject>/slo/1629978906.614903/6442450944/1073741824/00000005 copied to /<conteneur_de_destination_segments>/<largeobject>/slo/1629978906.614903/6442450944/1073741824/00000005
Puis récupérer le manifest, l'adapter et le ré-uploader
$(swift auth)
curl -s -X GET "$OS_STORAGE_URL/<conteneur>/<largeobject>?multipart-manifest=get" -H "X-Auth-Token:$OS_AUTH_TOKEN" | jq '.' > <largeobject>.json
sed -i 's/name/path/g' <largeobject>.json
sed -i 's/bytes/size_bytes/g' <largeobject>.json
sed -i '/hash/d' <largeobject>.json
sed -i '/last_modified/d' <largeobject>.json
sed -i '/content_type/d' <largeobject>.json
sed -i '/path/s/,$//g' <largeobject>.json
curl -i -X PUT -H "X-Auth-Token:$OS_AUTH_TOKEN" -T <largeobject>.json "$OS_STORAGE_URL/<conteneur_de_destination>/<largeobject>?multipart-manifest=put"
Obtenir l'espace utilisé dans un conteneur
swift list --lh -t <conteneur>
8.4G
Il n'y a pas de notion de dossier dans un conteneur, cependant on peut utiliser les préfixes :
swift list -p <prefix> <conteneur>
<prefix>/1.jpg
<prefix>/10.jpg
<prefix>/11.jpg
<prefix>/12.jpg
<prefix>/13.jpg
<prefix>/14.jpg
<prefix>/15.jpg
<prefix>/16.jpg
<prefix>/17.jpg
<prefix>/18.jpg
<prefix>/2.jpg
<prefix>/3.jpg
<prefix>/4.jpg
<prefix>/5.jpg
<prefix>/6.jpg
<prefix>/7.jpg
<prefix>/8.jpg
<prefix>/9.jpg
swift list --lh -t -p <prefix> <conteneur>
685K
Obtenir l'id d'un utilisateur
openstack user show --format json "${OS_USERNAME}" | jq -r '.id'
openstack token issue -f json | jq -r '.user_id'
Obtenir les limites du cluster
Limiter la taille d'un conteneur
Pour limiter la taille d'un conteneur, ajoutez la métadonnée 'X-Container-Meta-Quota-Bytes' et sa valeur limite :
swift post -H "X-Container-Meta-Quota-Bytes:<limit-in-bytes>" <conteneur>
Lorsque la limite est dépassée, l'erreur suivante est retournée :
swift upload <conteneur> logo_ovh.png
Object PUT failed: https://storage.gra.cloud.ovh.net/v1/AUTH_<account>/<conteneur>/logo_ovh.png 413 Request Entity Too Large b'Upload exceeds quota.' (txn: txee1f2b77c26a424ebbda8-0062a1aa7f)
Consider using the --segment-size option to chunk the object
Aller plus loin
Si vous avez besoin d'une formation ou d'une assistance technique pour la mise en oeuvre de nos solutions, contactez votre commercial ou cliquez sur ce lien pour obtenir un devis et demander une analyse personnalisée de votre projet à nos experts de l’équipe Professional Services.
Échangez avec notre communauté d'utilisateurs.