Object Storage Swift - Mémo de commandes Swift
Retrouvez ici les principales commandes swift pour gérer vos conteneurs d'objets
Retrouvez ici les principales commandes swift pour gérer vos conteneurs d'objets
Dernière mise à jour le 16/11/2022
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.
swift post <conteneur>
swift stat
swift stat <conteneur>
swift stat <conteneur> <objet>
swift list
swift list <conteneur>
swift upload <conteneur> <objet>
swift upload --use-slo --segment-size 1G <conteneur> <objet>
swift upload --segment-size 1G <conteneur> <objet>
$ 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é.
swift download <conteneur> <objet>
swift delete <conteneur>
swift delete <conteneur>
swift delete <conteneur> <objet>
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>
swift post <conteneur> -r "${OS_TENANT_ID}:*"
swift post <conteneur> -w "${OS_TENANT_ID}:*"
swift post <conteneur> -r ""
swift post <conteneur> -w ""
swift copy -d /<conteneur_de_destination> <conteneur> <objet>
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"
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
swift list
<conteneur>
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
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"
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
openstack user show --format json "${OS_USERNAME}" | jq -r '.id'
openstack token issue -f json | jq -r '.user_id'
swift capabilities
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
Échangez avec notre communauté d'utilisateurs sur https://community.ovh.com.
N’hésitez pas à nous proposer des suggestions d’amélioration afin de faire évoluer cette documentation.
Images, contenu, structure… N’hésitez pas à nous dire pourquoi afin de la faire évoluer ensemble !
Vos demandes d’assistance ne seront pas traitées par ce formulaire. Pour cela, utilisez le formulaire "Créer un ticket" .
Merci beaucoup pour votre aide ! Vos retours seront étudiés au plus vite par nos équipes..
Accedez à votre espace communautaire. Posez des questions, recherchez des informations, publiez du contenu et interagissez avec d’autres membres d'OVHcloud Community.
Echanger sur OVHcloud Community