[FR] C'est quoi une API ?
-
Upload
ovh -
Category
Technology
-
view
2.511 -
download
1
Transcript of [FR] C'est quoi une API ?
C'est quoi une API ?Et les API chez OVH
Vincent CasséDéveloppeur
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 :
À 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 :
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
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 :
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
À 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 ?
Les API OVH
api.ovh.comProduits OVH
api.runabove.comLabs OVH
api.hubic.comhubiC API
Authentification script-able Authentification OAuth2
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
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/
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
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
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/
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"}
Login de l'utilisateur
La première requête !
GET https://eu.api.ovh.com/1.0/dedicated/server[ "ns1337.a.org", "ns42.a.org"]
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)
Comment utiliser l'API ?Sans réinventer la roue
github.com/ovh
Utilisations basiques à avancées
Manager VPS personnalisé
Comment redémarrer un VPS ?
Manager VPS personnalisé
import ovh
client = ovh.Client()
print client.post('/vps/vps42424242.ovh.net/reboot')
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 ?
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
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 ?
Protéger ses déploiements
import ovh
client = ovh.Client()
print client.post('/vps/vps42424242.ovh.net/createSnapshot')
.git/hooks/pre-commit
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 ?
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
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;}
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}
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)
Aller plus loin
- https://api.{ ovh | runabove | soyoustart | kimsufi | hubic }.com- Les consoles- github.com/ovh- [email protected]