Inscrivez-vous à la newsletter

Inscrivez-vous à la newsletter

Abonnez-vous maintenant et nous vous tiendrons au courant.
Nous respectons votre vie privée. Vous pouvez vous désabonner à tout moment.

Oracle Cloud Gen 2 : (3) Accès en Python

Partager sur linkedin
Partager sur twitter
Partager sur facebook

Troisième article de la série concernant l’utilisation d’Oracle Cloud Gen 2 ou plus simplement OCI (pour Oracle Cloud Infrastructure), particulièrement avec un compte d’essai gratuit de 30 jours.
Après avoir introduit le sujet et partagé les premiers pas, vous avez pu créer votre système de base de données ou utiliser le service « Autonomous Database« , qu’il soit de type « Datawarehouse » ou « Transactionnel ».

Voici maintenant comment faire pour interagir avec votre tenant dans le Cloud en utilisant une API, et particulièrement ici le SDK Python.
Le dernier article de la série vous donnera les bases pour « terraformer » des déploiements de serveurs dans votre espace.

Le principe de base, quelle que soit l’API que vous souhaitez utiliser, est d’associer à votre utilisateur de connexion une paire de clés publique et privée qui servira ensuite pour votre authentification. Cette paire étant complétement différente de ce qui est utilisé pour la communication SSH. La connexion se réalisant grâce à un fichier de configuration qui contiendra, en autres éléments, la localisation du bon fichier de clé.

Mais prenons les choses dans l’ordre.

 

Installation de Python

Utilisateur de Windows 10, je n’avais pas envie de passer par une VM linux pour utiliser Python, j’ai donc suivi un des tutos que l’on peut trouver sur un internet pour l’installer sur mon laptop, comme celui-ci : noter qu’ il faut ajouter à Python le gestionnaire de téléchargement pip pour pouvoir récupérer les bibliothèques d’Oracle.
Pour ce faire, une fois l’installation terminée, exécuter simplement depuis une fenêtre MSDOS la commande « pip install oci ».

 

Clés API et utilisateur Cloud

Pour la génération des clés, il n’existe pas de commandes sous Windows, il faut passer par une émulation de shell pour pourvoir utiliser la commande openssl.
Télécharger gitbash, l’installer et ouvrir une fenêtre depuis l’icône qui est apparue sur votre bureau :

Le prompt vous positionne sous les dossiers de votre utilisateur :

Créer le sous-répertoire « .oci », positionnez-vous dessous et générez les clés :

$ mkdir .oci
$ cd .oci
ericl@ELE-ZENBOOK MINGW64 ~/.oci
# Génération de la clé privée :
$ openssl genrsa -out ~/.oci/oci_api_key.pem 2048^C
# Modification des droits
$ chmod go-rwx ~/.oci/oci_api_key.pem
# Génération de la clé publique
$ openssl rsa -pubout -in ~/.oci/oci_api_key.pem -out ~/.oci/oci_api_key_public.pem
writing RSA key

Une fois la clé publique à disposition, il faut l’ajouter à votre utilisateur du Cloud Oracle et créer votre fichier de configuration pour la connexion.
Pour cela, vous conservez d’un coté votre fenêtre shell Gitbash et de l’autre vous ouvrez votre navigateur, vous vous connectez sur votre tenant et vous allez sur la section « Identité »/ »Utilisateurs ».
Vous avez la liste de vos utilisateurs, et au moins votre compte de connexion :

Cliquer sur votre compte pour descendre au niveau « Détails », la section « Clé d’API pour l’utilisateur » apparait, c’est une des ressources liées :

Depuis votre shell Gitbash, copier le contenu du fichier contenant la clé publique dans le clipboard pour la coller ensuite dans la ressource de votre utilisateur :

ericl@ELE-ZENBOOK MINGW64 ~/.oci
$ cat oci_api_key_public.pem | clip

Depuis les détails de l’utilisateur, cliquer sur « Ajouter une clé publique », coller votre clé publique et cliquer sur « Ajouter » :

La clé a été ajouté et l’information « Empreinte » lui est associée, sélectionnez la valeur de l’empreinte et copiez-la dans un fichier texte, elle va vous servir ensuite pour la configuration :

On peut aussi retrouver la valeur de cette empreinte par la commande openssl dans le shell Gitbash :

$ openssl rsa -pubout -outform DER -in ~/.oci/oci_api_key.pem | openssl md5 -c
writing RSA key
(stdin)= f0:c6:a4:ff:c9:ff:7c:4d:d5:ff:dd:cf:ff:84:aa:94

 

Fichier de configuration pour API

Sous le répertoire « ~/.oci », créer un fichier nommé « config ». Le fichier doit contenir les éléments suivants :

  • user : Identifiant sur le Cloud de votre utilisateur – OCID -Information à récupérer depuis le Cloud, dans la section « Identité »/ »Utilisateurs » pour l’utilisateur, cliquer sur les liens « Afficher » ou « Coller » :
  • fingerprint : Empreinte de la clé API ajoutée que vous avez récupérée plus tôt
  • key_file : chemin complet du fichier de clé privé
  • tenancy : Identifiant de votre tenant dans le Cloud Oracle – OCIDInformation à récupérer depuis le Cloud, dans la section « Administration »/ »Détails de location » pour votre tenant cliquer sur les liens « Afficher » ou « Copier » :
  • region : le datacenter abritant votre tenant, en général pour nous français « eu-frankfurt-1 »

Le fichier config sera de la forme suivante :

[DEFAULT]
user=ocid1.user.oc1..aaaaaaaaaq77cappbawxmgpdw7ubgfzzzzzzzzzzzzru7gxfdfltgqaeq
fingerprint=f0:c6:a4:ff:c9:ff:7c:4d:d5:ff:dd:cf:ff:84:aa:94
key_file=~/.oci/oci_api_key.pem
tenancy=ocid1.tenancy.oc1..aaaaaaaapro3o5wizzzzzzzxi3jseikokzzzzzzzdrg64lcvhrla
region=eu-frankfurt-1

A noter que ces informations pourraient être directement passées dans le corps d’un programme python (moins pratique qu’un fichier de configuration) sous la forme :

config = {
    "user": "ocid1.user.oc1..aaaaaaaaaq77cappbawxmgpdw7ubgfzzzzzzzzzzzzru7gxfdfltg",
    "key_file": "~/.oci/oci_api_key.pem",
    "fingerprint": "f0:c6:a4:ff:c9:ff:7c:4d:d5:ff:dd:cf:ff:84:aa:94",
    "tenancy": "ocid1.tenancy.oc1..aaaaaaaapro3o5wizzzzzzzxi3jseikokzzzzzzz",
    "region": "eu-frankfurt-1"
}

 

Utilisation de l’API

Maintenant que la configuration est prête, c’est le moment de vérifier que vous pouvez réaliser des opérations sur le Cloud Oracle, dans votre tenant, en utilisant le SDK Python (exemples en provenance directe de la documentation, ne pas inclure les trois chevrons dans vos commandes) :
Ajout d’un groupe :

C:Usersericl>python
Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:57:15) [MSC v.1915 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import oci
>>> identity = oci.identity.IdentityClient(config)
>>> config = oci.config.from_file()
>>> identity = oci.identity.IdentityClient(config)
>>> compartment_id = config["tenancy"]
>>> from oci.identity.models import CreateGroupDetails
>>> request = CreateGroupDetails()
>>> request.compartment_id = compartment_id
>>> request.name = "my-test-ele-group"
>>> request.description = "Created with the Python SDK"
>>> group = identity.create_group(request)
>>> print(group.data.id)
ocid1.group.oc1..aaaaaaaahw6q4uv6dhhydpq2y4kiy6dmdbyik4rzl4pfwzoqg3d7ihu2wlqq

Ajout d’un utilisateur :

>>> from oci.identity.models import CreateUserDetails
>>> request = CreateUserDetails()
>>> request.compartment_id = compartment_id
>>> request.name = "my-test-user"
>>> request.description = "Created with the Python SDK"
>>> user = identity.create_user(request)
>>> print(user.data.id)
ocid1.user.oc1..aaaaaaaapj5fg5xrwrzd2hn2mq7rdlpadyskmeh4e3enalvsanabothpyo6a

Association de l’utilisateur et du groupe :

>>> from oci.identity.models import AddUserToGroupDetails
>>> request = AddUserToGroupDetails()
>>> request.group_id = group.data.id
>>> request.user_id = user.data.id
>>> response = identity.add_user_to_group(request)
>>> print(response.status)
200

Vérification des éléments créés depuis l’interface du Cloud, section « Identité »/ »Groupes » :

Avec dans le détail du groupe la présence de l’utilisateur associé :

Un peu de ménage avant de terminer, avec la suppression de l’utilisateur et du groupe :

>>> memberships = identity.list_user_group_memberships(compartment_id=compartment_id,user_id=user.data.id,group_id=group.data.id)
>>> assert len(memberships.data) == 1
>>> membership_id = memberships.data[0].id
>>> identity.remove_user_from_group(user_group_membership_id=membership_id).status
204
>>> identity.delete_user(user_id=user.data.id).status
204
>>> identity.delete_group(group_id=group.data.id).status
204

 

Pour aller plus loin avec Python, allez voir la liste des opérations possibles dans la documentation, et pour des exemples plus complets sur le dépôt GitHub ou sur les pages blogs pertinentes comme celle-ci.

A vous de jouer, ou de partir en vacances 😉 et à bientôt pour de la « terraformation ».

 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.