Automatiser sur Oracle Cloud Infrastructure : Utilisation des REST API (1/3)

Introduction

L’interface d’Oracle Cloud Infrastructure permet d’accéder à l’ensemble des services du Cloud Oracle (Instances, Governance, Object Storage, Autonomous Database, Block Storage, …). Cependant, pour contrôler efficacement les ressources de ces services, une solution d’automatisation, via des clients pour OCI, est parfois nécessaire afin de s’affranchir des limitations de l’interface graphique.

 

Quels sont les choix possibles de clients pour mettre en place cette automatisation ?

Il existe trois clients, proposés nativement par Oracle, pouvant offrir une telle solution :

  • OCI CLI : C’est une interface en lignes de commandes, basée sur python, qui permet d’administrer les services OCI. L’utilisation d’OCI CLI nécessite d’effectuer une installation du client depuis le github d’Oracle.
  • OCI SDK : C’est un kit de développement (disponible pour Java, Python, Ruby) permettant de développer des outils ou des applications pour s’intégrer aux services OCIs.
  • REST API : Les services OCI sont accessibles en utilisant une URL HTTPS à destination d’un REST Endpoint qui représente le serveur REST à contacter dans votre domaine OCI. REST API se base sur l’envoi de demandes vers ces URL HTTPS. Aucune installation particulière n’est nécessaire pour faire fonctionner les REST API.

Tous ces clients se basent sur une authentification sur OCI par une clef RSA et les identifiants OCI (OCID) des tenants, compartments, users et services.

C’est le client REST API que je vous propose de découvrir aujourd’hui.

 

Présentation REST API

 

Les URL REST API

Les commandes REST API vont donc contacter les services OCIs via  une URL d’accès :

https://rest-server/endpoint

rest-server : il s’agit du serveur REST à contacter pour vos services OCI. Ce nom de serveur se compose généralement du nom du service OCI (database, objectstorage, …) suivi du nom de la région.
Voici quelques exemples :

objectstorage.eu-frankfurt-1.oraclecloud.com
database.us-ashburn-1.oraclecloud.com

endpoint : C’est une adresse relative définissant le endpoint (le type de service) à atteindre. Elle est généralement composée de la version de l’API suivant du chemin de la ressource cible.

Voici quelques exemples :

# Pour les accès VCN
20160918/vcns

# Pour les accès aux bases Autonomous
20160918/autonomousDatabases
Les méthodes REST API

Il existe quatre méthodes différentes pour envoyer des commandes aux services OCI :

  • DELETE : Pour supprimer une ressource ou un objet dans OCI.
  • GET : Pour récupérer des informations sur une ressource spécifique dans OCI.
  • POST : Pour manager (créer, démarrer, arrêter) une ressource spécifique dans OCI.
  • PUT : Pour configurer une ressource spécifique dans OCI.
L’authentification REST API

L’accès aux services OCI se fait de manière sécurisée via le protocole HTTPS.

L’authentification se fait via un compte OCI disposant des droits nécessaires pour effectuer les opérations. La partie sécurité de cet accès s’effectue via les API Keys (déclaration de clef RSA).

Passons maintenant aux travaux pratiques !

 

Configuration REST API

Je dispose d’un tenant OCI sur la région de Frankfort et d’un compte d’accès. Je vais utiliser un serveur Linux qui me servira de client pour accéder aux différents services OCI via les REST API.

 

Génération d’une clef privée RSA

La première opération est de créer une clef RSA sur le serveur Linux. Cette clef servira à l’authentification vers OCI.

Nous allons créer un répertoire qui hébergera notre clef RSA privée ainsi que nos scripts REST API :

# mkdir ~/.oci

Ensuite, il nous faut créer une clef RSA 2018 bits au format PEM.

Le nom de la clef générée sera oci_api_key.pem :

# openssl genpkey -out ~/.oci/oci_api_key.pem -algorithm RSA -pkeyopt rsa_keygen_bits:2048
...........................................+++
.+++
# ls -l ~/.oci/oci_api_key.pem
-rw-r--r--. 1 oracle oinstall 1704 Feb 7 11:42 /home/oracle/.oci/oci_api_key.pem
# cat ~/.oci/oci_api_key.pem
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCbEyCceLoI7WdE
beYc69A03g8ifq64WRwORDRIeQ8PTYdR9r2x1wZIyxwDBO+b7iJAtThoOkVap8QK
LAF4bdUt83e0ijeG+dKatV5q+Wyl4MazkSmu/h4ehm2q5TCOAorXzvpnhY8opzxL
3Xk2+Cq7gTCz2lLv4tpk/sDj1a9p1jM4ayHcC6PzA0rVWXc7rvYm3QYn6PSBEhz+
IJBL2WEsORP+rrGm0wbzCohonip9Fb41UzT/Vo/NMEa3Ypl7bpIAHknW6QiuL9YJ
2gZ20h1YwTsj0C0ombMtPXoTL0rR+GL//gk/l+z1cxwwM1t4ApJc2JSLL0Ep1Yq0
ve+8ju//o32Y7E1si2uSvfWCErzGxSHQqe3wyKI3f5+wzhbKOoOnv/OXo6ysVGEq
a7rKVhtiib0CgYBntlciaqYHYvFHr0hiXhpVjXawTpweH3pK/0pgRVaU2lJnuPwr
MPJ2GcVTpGtUV/S5I5X9a3pnFPc3z1Vj7wd0+2zfViieCW4vfgthd3IAvzRt+xBA
x1J4Yz+OcDNTe15m9yQSJuUxlPWWdWk4K9KUW6k4LZnKCpZersDsI0FPJZOpzP1X
ZwFiuJD9m4xUfHf9EY5qrHtD2tYQOhM0OroLrSBLkAECgYEA9ZEdaJceu1t7hN1h
aKmu/TwEWKjXXP56SaW0Df+wwn+If7k4WvjfrAr9TZ4J940rioKqRrHehjvoy2ZH
/iDpSyYEPnG2ck3iDdJL45d4++ECgYEA65RzD8r7yVZbiS4Yj1/fwf+rYNT4Zy9H
OZheikVMENRB4qqZcmSlsbzdItN2vGf8b39DSl008dPivFQz7f/u7GvdgAkh5Yi6
Z3PZVjFlfnboNzRVxH+uD9ZY3yyy1TKrjvsCvk4sBwvobt+yBMx+6eCEeS5sC4e8
6Jubdwuk9hU2t/WCxTIzsm0rg0CyOrB2UBGbtf7euJ+n3J2VcBLkaHvi7kbBGS6v
Y79Do9AYWDwnX2nRgx5F9riONMkCgYEAwnXBqkbfXABXaDAIvzLaPridvhvtkWK+
2fvC5DmF24cPkEYJumMcigRUjngHKwUe7VDjlBD7ugtslRh/7fKqE+EVWuDFgPFT
XehOOw2bldjhOwTi13IRLCB27ktQDG2VOlIfihCOFNDeGntDNBQ1N4q0srXK5von
AR4dq/z1/3ivivkXMwRusF7caVb+bJDt4s+SJNpDIffQcOtkXuKgjJGEdoOVCTyx
5KAkTzy6snFGxM+8Rfy/j+BziIJk1rDHjc1BFWCowraF5G5JnEGS26Ny8QKBgHmP
9Z5FqdGwoPOPu5gS6R32eR3kBZIyQY6xdPcJAqXme5M8RU6QMMISzO03GXwKOngu
nI7JpJhcrcuuLKe8zjvHaQii3pGf5c7RuTU071edAoGBAIwWO8PVX5FsT1lJ5Hfu
hwWDB3RYXRh3wvK/TEG2UJ14yRvf5rk5hzii7nQ8xxsbhnSQ97fuDtyoy+JT60s6
j2TTvhEPfARSjyta+9pF00wE0zqqNzoLLmeXpK+4vTSS4hUSYuqbIWwt/N/4unPx
FdVHqgXYxn1qaIcGQE6X06yY
-----END PRIVATE KEY-----

 

Génération de la clef publique RSA

L’étape suivante consiste à créer la clef publique (oci_api_key.pem) associée à notre clef privée.

C’est cette clef qui sera à uploader dans la console OCI :

# openssl rsa -pubout -in ~/.oci/oci_api_key.pem -out ~/.oci/oci_api_key_public.pem
writing RSA key
# cat ~/.oci/oci_api_key_public.pem
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmxMgnHi6CO1nRCwBeG3V
im+JsFpQSLuuvitzkjqRI2DJ5pnxHGql0GVADHkD4ZtC7dKyOfFlncAGDw1Go4lK
BM1jpJxi27jsznJuYrbX5MvYk+6PkyimmKlVLtvx+kKiMQhVRYzbgocGA6naX+Uq
LDkT/q6xptMG8wqIaJ4qfRW+NVM0/1aPzTBGt2KZe26SAB5J1ukIri/WCdoGdtId
WME7I9AtKJmzLT16Ey9K0fhi//4JP5fs9XMcMDNbeAKSXNiUiy9BKdWKtL3vvI7v
/6N9mOxNbItrkr31ghK8xsUh0Knt8MiiN3+fsM4WyjqDp7/zl6OsrFRhKqtxwy6J
ZQIDAQAB
-----END PUBLIC KEY-----

 

Configuration d’une API Key

Voici la procédure à suivre pour configurer, grâce à la clef publique, l’authentification sur OCI. Cette clef est à configurer au niveau de notre compte OCI dans la partie API key.

Voici comment procéder.

Connectons nous à la console Identity Management via la lien suivant (ici pour la région de Frankfort) :

https://console.eu-frankfurt-1.oraclecloud.com/a/identity/users

Nous arrivons à la fenêtre de configuration des comptes OCI :

Choisissons ensuite le compte utilisateur où nous souhaitons créer notre API Key :

Cliquez sur le bouton « Add Public Key » et copiez le contenu de la clef publique générée dans la fenêtre :

 

La configuration de l’API Key est terminée.

 

Récupération des OCIDs

Pour l’accès aux services OCI, nous avons besoin de récupérer les différents OCIDs de nos ressources.

Nous devons récupérer le fingerprint de l’API Keys que nous avons créée.
Cette information est visible dans la fenêtre de détail de notre compte :

Nous devons récupérer notre user OCID (visible dans les informations principales de notre compte).
Vous pouvez utiliser le lien « Copy » pour le copier directement :

En dernier, il reste le plus important, le tenant OCID. Pour le trouver, il faut naviguer dans le menu principal dans « Administration > Tenancy Details ».
L’OCID du tenant est disponible dans les informations du tenancy :

 

Installation d’OCI-CURL

Pour faciliter l’utilisation des REST API, Oracle propose un petit script bash à récupérer sur le lien suivant : https://docs.cloud.oracle.com/en-us/iaas/Content/Resources/Assets/signing_sample_bash.txt

Le principe est simple : Ce script contient une fonction oci-curl qui pourra être appelée en bash afin d’accéder aux services OCI en simplifiant la gestion des authentifications, notamment le renouvellement de tokens (pour plus d’informations, voir le lien : https://docs.cloud.oracle.com/fr-fr/iaas/Content/API/Concepts/signingrequests.htm)

Nous allons créer un nouveau répertoire nommé oci-curl et y télécharger ce fichier via l’outil curl.
Atttention, le fichier étant en UTF-8 , il est nécessaire d’y enlever le BOM (Byte Order Mark) :

# mkdir ~/oci-curl
# curl -L https://docs.cloud.oracle.com/iaas/Content/Resources/Assets/signing_sample_bash.txt  | sed -e '1s/^.*#/#/' > ~/oci-curl/oci-curl.sh
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload  Upload   Total   Spent    Left  Speed
100   162  100   162    0     0     26      0  0:00:06  0:00:06 --:--:--    46
100  4764  100  4764    0     0    780      0  0:00:06  0:00:06 --:--:--   780

Une fois le téléchargement terminé, nous devons éditer ce bash (nommé oci-curl.sh) pour y inclure les différents OCIDs récupérés au chapitre précédent :

On donne ensuite les droits d’exécution à ce script puis nous le lançons afin de charger la fonction oci-curl sur notre session :

# chmod 700 ~/oci-curl/oci-curl.sh
# . ~/oci-curl/oci-curl.sh

 

Passons maintenant à quelques cas d’utilisations.

 

Exemples d’utilisations

 

Exemple n°1 : Informations sur les bases Autonomous de notre compartiment

Pour récupérer ces informations, il nous faut préciser, en paramètres,  l’OCID de notre compartiment et le nom du endpoint correspondant au service Database de notre région.
Ensuite, il suffit de lancer la fonction oci-curl avec ces éléments en utilisant la méthode GET :

# compartmentId="ocid1.compartment.oc1..aaaaaaaa7oeoutrnkcn5esfvnz6kuxr7ijqn7s3iz4q2ylp7ms23f5gvlckq"
# endpoint=database.eu-frankfurt-1.oraclecloud.com
# apiVersion=20160918
# oci-curl $endpoint get "/$apiVersion/autonomousDatabases?compartmentId=$compartmentId"

Les informations sur les bases autonomous du compartiment s’affichent (format JSON de sortie).

Ce résultat n’est pas forcément bien visible :

[{"additionalDatabaseStatus":null,"autonomousContainerDatabaseId":null,"compartmentId":"ocid1.compartment.oc1..aaaaaaaa7oeoutrnkcn5esfvnz6kuxr7ijqn7s3iz4q2ylp7ms23f5gvlckq","connectionStrings":{"allConnectionStrings":{"HIGH":"adb.eu-frankfurt-1.oraclecloud.com:1522/icnmbjgz4momkrh_db201911051736_high.atp.oraclecloud.com","MEDIUM":"adb.eu-frankfurt-1.oraclecloud.com:1522/icnmbjgz4momkrh_db201911051736_medium.atp.oraclecloud.com","LOW":"adb.eu-frankfurt-1.oraclecloud.com:1522/icnmbjgz4momkrh_db201911051736_low.atp.oraclecloud.com","TPURGENT":"adb.eu-frankfurt-1.oraclecloud.com:1522/icnmbjgz4momkrh_db201911051736_tpurgent.atp.oraclecloud.com","TP":"adb.eu-frankfurt-1.oraclecloud.com:1522/icnmbjgz4momkrh_db201911051736_tp.atp.oraclecloud.com"},"dedicated":null,"high":"adb.eu-frankfurt-1.oraclecloud.com:1522/icnmbjgz4momkrh_db201911051736_high.atp.oraclecloud.com","low":"adb.eu-frankfurt-1.oraclecloud.com:1522/icnmbjgz4momkrh_db201911051736_low.atp.oraclecloud.com","medium":"adb.eu-frankfurt-1.oraclecloud.com:1522/icnmbjgz4momkrh_db201911051736_medium.atp.oraclecloud.com"},"connectionUrls":{"apexUrl":"https://ICNMBJGZ4MOMKRH-DB201911051736.adb.eu-frankfurt-1.oraclecloudapps.com/ords/apex","machineLearningUserManagementUrl":"https://adb.eu-frankfurt-1.oraclecloud.com/omlusers/tenants/OCID1.TENANCY.OC1..AAAAAAAAISZ6B4N6MV7JTHDIQG5OMUE2VWWXRJJUYDRE5QDVW2UKDBD22C6A/databases/DB201911051736/index.html","sqlDevWebUrl":"https://ICNMBJGZ4MOMKRH-DB201911051736.adb.eu-frankfurt-1.oraclecloudapps.com/ords/admin/_sdw/?nav=worksheet"},"cpuCoreCount":1,"currentLagTimeInSeconds":null,"dataSafeStatus":"NOT_REGISTERED","dataStorageSizeInTBs":1,"dbAvailabilityType":"HIGH_AVAILABILITY","dbName":"DB201911051736","dbVersion":"18c","dbWorkload":"OLTP","definedTags":{},"displayName":"DB_TEST01","freeformTags":{},"id":"ocid1.autonomousdatabase.oc1.eu-frankfurt-1.abtheljr5iyn6ia4rcjiwzv7mwrirwanxofw753zx4kqeftl4l72rbpgldta","isAutoScalingEnabled":false,"isDedicated":false,"isFailedOver":null,"isFreeTier":true,"isPreview":false,"isRefreshableClone":null,"lagTimeInSeconds":null,"licenseModel":"LICENSE_INCLUDED","lifecycleDetails":null,"lifecycleState":"AVAILABLE","nsgIds":null,"openMode":"READ_WRITE","privateEndpoint":null,"privateEndpointLabel":null,"serviceConsoleUrl":"https://adb.eu-frankfurt-1.oraclecloud.com/console/index.html?tenant_name=OCID1.TENANCY.OC1..AAAAAAAAISZ6B4N6MV7JTHDIQG5OMUE2VWWXRJJUYDRE5QDVW2UKDBD22C6A&database_name=DB201911051736&service_type=ATP","sqlWebDeveloperUrl":null,"standbyDb":null,"subnetId":null,"systemTags":{"orcl-cloud":{"free-tier-retained":"true"}},"timeCreated":"2019-11-05T16:40:00.055Z","timeDeletionOfFreeAutonomousDatabase":null,"timeMaintenanceBegin":"2020-02-08T07:00:00.000Z","timeMaintenanceEnd":"2020-02-08T12:00:00.000Z","timeReclamationOfFreeAutonomousDatabase":"2020-02-14T11:12:03.451Z","usedDataStorageSizeInTBs":1,"whitelistedIps":null}]

 

Exemple n°2 : Informations sur les bases Autonomous de notre compartiment avec intégration de l’outil jq

jq est un outil permettant de manipuler du JSON. Il est très utilisé pour ses fonctions de formatage, de filtrage et de manipulation de données JSON.

Afin de faciliter l’utilisation des REST API, je vous propose de l’installer et de l’intégrer à nos exemples.

jq est téléchargeable sur le lien suivant : https://stedolan.github.io/jq/download/

Installons le :

# sudo wget https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 -O /usr/bin/jq

# sudo chmod +x /usr/bin/jq

Testons ensuite notre première commande oci-curl en y ajoutant la gestion du JSON avec jq :

# oci-curl $endpoint get "/$apiVersion/autonomousDatabases?compartmentId=$compartmentId" | jq

 

Exemple n°3 : Informations sur l’état de la base de données

Ajustons le filtre jq pour afficher uniquement l’état de la base de données :

# oci-curl $endpoint get "/$apiVersion/autonomousDatabases?compartmentId=$compartmentId" | jq '.[].displayName.lifecycleState'
"AVAILABLE"

Nous pouvons également modifier le filtre jq pour afficher le nom de la base avec l’état associé :

# oci-curl $endpoint get "/$apiVersion/autonomousDatabases?compartmentId=$compartmentId" | jq '.[] | .displayName,.lifecycleState'
"DB_PRODUCTION"
"AVAILABLE"

 

Pour conclure

L’utilisation des REST API est assez simple à mettre en place et à utiliser au quotiden. Toutes les actions de l’interface graphique OCI (et voir plus) sont disponibles via ces REST API. Il est très facile d’intégrer différents types de commandes (arrêt/ démarrage / provisonning / modification de configuration) dans des scripts afin d’automatiser vos différents process.

 

Pour avancer plus sur le sujet, la documentaion de réfrence des syntaxes REST API est disponible sur ce lien : https://docs.cloud.oracle.com/fr-fr/iaas/Content/API/Concepts/apiref.htm

 

Laisser un commentaire

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