Utiliser l’object storage OVH via OpenStack

OVH offre maintenant depuis quelques années la possibilité d’utiliser de l’object storage au sein de projet public cloud. Ce service d’object storage se veut très proche du très connu S3 d’AWS. L’intérêt principal de l’offre d’OVH est de proposer un prix de stockage du GO bien moins élevé (environ 0.01 € / mois/GO contre 0.022 $ / mois / GO) que celui d’AWS et également l’assurance d’utiliser un service basé en France dans une société Française.
L’object storage d’OVH est basé sur OpenStack SWIFT, donc l’API est celle d’OpenStack  mais une compatibilité avec l’API S3 est proposée. Après plusieurs essai et des librairies d’accès différentes (Apache jCloud, ..) j’ai finalement réussi en utilisant openstack4J (https://github.com/openstack4j/openstack4j/), il faut dire que la documentation proposé par OVH est très très light et qu’il est très difficile de trouver des exemples fonctionnant. Si on compare à la documentation fourni par AWS sur l’utilisation de son SDK on est à des années-lumières.

1 – Création du projet cloud

La première étape consiste à créer un projet cloud dans l’interface manager d’OVH. Pour cela il suffit de renseigner un moyen de paiement ainsi que le nom du projet.

L’activation du projet peut prendre un peut de temps, ovh va valider le moyen de paiement avant d’autoriser l’utilisation des ressources.

2 – Création d’un objet storage container

Lorsque le compte est activé il est possible d’accéder à l’ensemble des fonctions de l’environnement public cloud :

En sélectionnant Object storage il sera possible de suivre le processus de création d’un container. Les options sont :

  • La localisation régionale du container : Beauharnois (Canada), Frankfurt (Allemagne), Gravelines, Strasbourg, Londres, Varsovie
  • Le type de container : static (pour l’hébergement web), private (pour un accès privée), public. Nous utilisons un container private dans la suite.
  • le nom qui permettra de le retrouver dans la liste et qui sera utilisé ensuite pour dans le code pour stocker les fichiers

3 – Création du user OpenStack et accès horizon

La suite des opérations est la partie sur laquelle il est le plus difficile de trouver de la documentation. Dans le menu de votre projet public cloud, tout en bas cliquer sur User & Roles

Dans l’écran qui s’affiche cliquer sur create user, et dans la popup donner une description à votre user, et ensuite sur l’écran suivant choisir le niveau d’habilitation. Normalement ObjectStore Operator est suffisant (j’ai moi-même ajouté plus de droits car j’avais besoin de faire plus que d’accéder au stockage d’objet).

Dans la liste cliquer sur les … correspondant à l’utilisateur créé :

Et là choisir le menu « Generate a Password ». Le password généré apparait en haut de la liste (Conservez bien ce mot de passe !). Cliquer ensuite sur Launch Openstack Horizon et connectez-vous avec le user créé et le password généré.

Dans l’interface horizon, en haut à gauche bien choisir dans la liste la région sur laquelle le container d’objet a été créé. Normalement celui-ci apparait dans la liste.

Maintenant on va récupérer les éléments de configuration qui seront indispensable pour se connecter via l’API. En haut à droite, cliquer sur le menu du user et choisir de télécharger le fichier OpenStack RC File V3 :

Le fichier téléchargé est un shell linux permettant de se connecter directement à l’openstack OVH, nous allons l’utiliser pour piocher les paramètres qui nous intéressent.

4 – Connexion au container avec l’API openstack4J

L’api openstack4j est disponible sur github : https://github.com/openstack4j/openstack4j/. Dans un projet maven il suffit de rajouter la dépendance suivante à son pom.xml :

<dependency>
 <groupId>com.github.openstack4j.core</groupId>
 <artifactId>openstack4j</artifactId>
 <version>3.3</version>
</dependency>

Le code java pour se connecter est le suivant :

private void connectToOpenStack() {
		// project scoped authentication
		Identifier domainIdentifier = Identifier.byName(this.domainName);

		OSClientV3 os = OSFactory.builderV3().endpoint(this.endPoint)
				.credentials(this.user, this.password, domainIdentifier)
				.scopeToProject(Identifier.byId(this.projectid)).authenticate();
		os.useRegion(this.region);
		logger.info("Authentification OpenStack successfull");
	}

Les paramètres du code java à aller chercher dans le fichier de config sont :

  • domainName est chargé en partant de la variable OS_USER_DOMAIN_NAME
  • endPoint correspond à la variable OS_AUTH_URL
  • user correspond à OS_USERNAME (ou également le user d’accès à horizon)
  • password correspond au password généré pour l’accès à l’interface horizon
  • projetcid correspond à OS_PROJECT_ID
  • region correspond à OS_REGION_NAME

5 – Charger un fichier dans le container

Cette étape nécessite juste de conserver le nom du container qui a été créé dans l’interface ovh, il sera passé en paramètre à la méthode de chargement :

os.objectStorage().objects()
    .put({container_name},{object_name}, Payloads.create(new File({filename}))

3 Comments

  1. Anthony

    6 octobre 2021 - 8 h 52 min
    Reply

    Bonjour,

    J’ai actuellement une application web sur amazon avec S3, j’utilise le AWSJavaScriptSDK : https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/interfaces/s3clientconfig.html#useaccelerateendpoint

    J’essaie de migrer cela vers openstack avec le S3 compatible, cela fontionne depuis le cli aws avec S3 ou S3api, mais depuis le SDK, j’ai cette erreur : InvalidBucketName: The specified bucket is not valid

    Avez-vous de l’expérience à ce sujet ?

    • Nicolas BESNARD

      11 novembre 2021 - 7 h 18 min
      Reply

      Désolé pour le retard, de tous mes essais avec des api S3 pour accéder à OpenStack, cela c’est soldé par des échecs. Et j’ai eu énormément de mal à trouver de la doc et des exemples sur ce type d’utilisation.

      Bon courage.

    • Arnaud

      15 janvier 2022 - 21 h 01 min
      Reply

      Hello,

      Si j’ai bien compris c’est du S3v4 alors que la plupart des clients sont en S3v3.

      Arnaud

Leave a Reply to Arnaud

Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.