Download - [FR] C'est quoi une API ?

Transcript
Page 1: [FR] C'est quoi une API ?

C'est quoi une API ?Et les API chez OVH

Vincent CasséDéveloppeur

Page 2: [FR] C'est quoi une API ?
Page 3: [FR] C'est quoi une API ?

Pourquoi des API ?

- Données sont affichées dans un navigateur, avec un design- Pas de structure définie- Destiné à être compris par des humains

- Données structurées en fonction de leur contenu- Rendu brut, sans affichage particulier- Permet l'utilisation automatisé de ces données (donc par des machines)

Du site web :

Aux API :

Page 4: [FR] C'est quoi une API ?

À quoi servent les API ?

- Avoir une interface simple pour gérer des produits- Créer des applications pour des usages spécifiques- Créer une interaction avec d'autres sites et logiciels- Inventer de nouveaux usages

- Protéger les accès aux comptes de ses clients- S'assurer que des programmes / sites externes utilisent leur produits- Permet de fournir un service automatisé (impression et envoi de factures...)

Pour les développeurs :

Pour le fournisseur :

Page 5: [FR] C'est quoi une API ?

Les API : interface entre 2 services

- Socket : transfert brut de données entre deux service → applications liées- RPC : définition d'une interface en C → applications “lourdes”- SOAP : définition d'une interface sur HTTP et formaté avec XML- REST : définition d'une interface sur HTTP et formaté avec XML ou JSON

Petite histoire des interfaces

Page 6: [FR] C'est quoi une API ?

API REST

- Classement des ressources en arborescence- Utilisation des verbes HTTP : GET, POST, PUT et DELETE

GET /domain/zone/GET /domain/zone/{my_zone}GET /domain/zone/{my_zone}/recordPOST /domain/zone/{my_zone}/recordGET /domain/zone/{my_zone}/record/{one_id_record}

Exemples :

Page 7: [FR] C'est quoi une API ?

Avantages et inconvénients de REST

- Utilise un protocole accessible partout : HTTP- Beaucoup de langages possèdent un mapping avec HTTP- Simple à comprendre et tester

Avantages

- Le serveur ne peut pas initier la conversation

Inconvénient

Page 8: [FR] C'est quoi une API ?

À quoi servent les API ?

- Gérer ses produits sans passer par les espaces client- Supprimer de nombreuses actions manuelles- Simplifier les déploiements- Améliorer ses processus de tests et d'intégration continue- Configurer rapidement des systèmes complexes...

- Tous les produits pourront se gérer depuis l’API- L'espace client est basé sur ces API

By OVH

Pour quoi faire ?

Page 9: [FR] C'est quoi une API ?

Les API OVH

api.ovh.comProduits OVH

api.runabove.comLabs OVH

api.hubic.comhubiC API

Authentification script-able Authentification OAuth2

Page 10: [FR] C'est quoi une API ?

Les API OVH

api.soyoustart.comLabs serveurs dédiés

api.kimsufi.comServeurs dédiés discount

Deprecatedovh.com/soapi/fr/

Authentification script-able Ancienne API SOAPi

Page 11: [FR] C'est quoi une API ?

Découvrir les API

https://api.ovh.com/console/https://eu.api.kimsufi.com/console/https://api.soyoustart.com/console/

https://api.hubic.com/console/https://api.runabove.com/console/

Page 12: [FR] C'est quoi une API ?

Authentification Script-able

Authentification déportée chez OVH- Ne partage pas le mot de passe avec l’application tierce- Token d'authentification envoyé à l'API à chaque requête : la “Consumer key” - Validation du token par l'utilisateur et uniquement depuis {ovh.com|runabove.com}

Droits d’accès

Utilisateur Application

Consumerkey

Page 13: [FR] C'est quoi une API ?

Authentification Script-able

Granularité des droits- Droits différents pour chaque “Consumer Key”- Limitation du périmètre des appels en fonction des URL- Droits décrits avec des regex sur les URL

Exemples : GET /me/bill/*GET,POST,DELETE,PUT /dedicated/server/{server_name}/*POST /dedicated/server/*/reboot

Page 14: [FR] C'est quoi une API ?

Authentification Script-able

Créer des identifiants d'application

https://{ca,eu}.api.ovh.com/createApp/https://api.runabove.com/createApp/https://eu.api.kimsufi.com/createApp/

https://eu.api.soyoustart.com/createApp/

Page 15: [FR] C'est quoi une API ?

Authentification Script-ableRécupérer une “Consumer Key”

POST https://eu.api.ovh.com/1.0/auth/credential"accessRules": [ { "method": "GET", "path": "/dedicated/server" }], "redirection":"https://www.mywebsite.com/"

{ "validationUrl":"https://eu.api.ovh.com/auth/?credentialToken=iQ1joJExxxxxxOtrPQEeRh", "consumerKey":"one_consumer_key", "state":"pendingValidation"}

Page 16: [FR] C'est quoi une API ?

Login de l'utilisateur

Page 17: [FR] C'est quoi une API ?

La première requête !

GET https://eu.api.ovh.com/1.0/dedicated/server[ "ns1337.a.org", "ns42.a.org"]

Page 18: [FR] C'est quoi une API ?

Comment utiliser l'API ?Avec HTTP

La signature est générée à l'aide des informations de la requête

curl -H 'X-Ovh-Application:one_application_key’ \ -H 'X-Ovh-Timestamp:1369560945’ \ -H 'X-Ovh-Signature:$1$sign' \ -H 'X-Ovh-Consumer:one_consumer_key’ \ https://eu.api.ovh.com/1.0/dedicated/server/

"$1$" + SHA1_HEX(application_secret+"+"+consumer_key+"+"+METHOD+"+"+QUERY+"+"+BODY+"+"+TSTAMP)

Page 19: [FR] C'est quoi une API ?

Comment utiliser l'API ?Sans réinventer la roue

github.com/ovh

Page 20: [FR] C'est quoi une API ?

Utilisations basiques à avancées

Page 21: [FR] C'est quoi une API ?

Manager VPS personnalisé

Comment redémarrer un VPS ?

Page 22: [FR] C'est quoi une API ?

Manager VPS personnalisé

import ovh

client = ovh.Client()

print client.post('/vps/vps42424242.ovh.net/reboot')

Page 23: [FR] C'est quoi une API ?

Effectuer des actions de masse

Une faille de sécurité impacte un port sur vos serveurs Comment appliquer une règle sur les IP protégées par le firewall OVH ?

Page 24: [FR] C'est quoi une API ?

Effectuer des actions de massedef myurlencode (string): return urllib.quote(string).replace('/', '%2f')

ips = client.get('/ip')for ip in ips:

try:encodedIp = myurlencode(ip)inFirewall = client.get('/ip/' + encodedIP + '/firewall');

for ipInFirewal in inFirewall:content = { 'action': 'deny', 'protocol': 'tcp', 'sequence': 0, 'sourcePort': 80 }url = '/ip/' + encodedIP + '/firewall/' + myurlencode(inIp) + "/rule"client.post(url,content)print inIp , " in ", ip, " : ok"

except requests.exceptions.HTTPError, e: print e , " " , ip

Page 25: [FR] C'est quoi une API ?

Protéger ses déploiements

Votre configuration Puppet est sur Git et vous déployez automatiquement Comment créer un snapshot à chaque commit avec l’API OVH et les hooks Git ?

Page 26: [FR] C'est quoi une API ?

Protéger ses déploiements

import ovh

client = ovh.Client()

print client.post('/vps/vps42424242.ovh.net/createSnapshot')

.git/hooks/pre-commit

Page 27: [FR] C'est quoi une API ?

Gérer les pics de charge

Un site e-commerce peut subir de fortes chargesComment ajouter des serveurs PHP-FPM + Nginx lors de ces pics ?

Page 28: [FR] C'est quoi une API ?

Gérer les pics de charge

- Une IP load balancing- Un serveur web permanent- Un ou plusieurs /cloud en fonction de charge

Serveur webServeur /cloud

Outils nécessaires

Page 29: [FR] C'est quoi une API ?

Gérer les pics de chargeConnaître l'état du serveur web permanent

pm.status_path = /status

/etc/php5/fpm/pool.d/www.conf :

/etc/nginx/sites-available/default : location /status { include fastcgi_params; fastcgi_pass unix:/var/run/php5-fpm.sock;}

Page 30: [FR] C'est quoi une API ?

Gérer les pics de charge

curl http://mon_serveur_php/status?json

Connaître l'état du serveur web permanent

{ "accepted conn": 1337, "active processes": 1, "idle processes": 2, "listen queue": 0, "listen queue len": 0, "max active processes": 10, "max children reached": 4, "max listen queue": 0, "pool": "www", "process manager": "dynamic", "start since": 3926, "start time": 1393946907, "total processes": 3}

Page 31: [FR] C'est quoi une API ?

Gérer les pics de chargeDémarrer un serveur cloud

flavor = "550757b3-36c2-4027-b6fe-d70f45304b9c"; #VPS-SSD-1 BHSimage = "1b042c00-5978-4d75-9a7e-0d7f6ed5be76"; # Ubuntu 15.10 BHSproject_cloud = "93c6bxxxxxxxxxxxfeb6";

r = requests.get('http://my_server/status?json')active_processes = json.loads(r.content)['active processes']

if active_processes >= 8:client.post("/cloud/project/" + project_cloud + "/instance", flavorId=flavor, imageId=image, name="php-fpm load peak", region="BHS1", userData="Script to run");

   # Wait cloud machine is ready

    ipInBackend = client.get('/ip/loadBalancing/ip-192.168.0.0/backend')    if not ('127.0.0.1' in ipInBackend):     content = { 'ipBackend': '127.0.0.1', 'probe': 'http' }        client.post('/ip/loadBalancing/ip-192.168.0.0/backend', content)        

Page 32: [FR] C'est quoi une API ?

Aller plus loin

- https://api.{ ovh | runabove | soyoustart | kimsufi | hubic }.com- Les consoles- github.com/ovh- [email protected]