OVHcloud Hosted Private Cloud Platform Network use cases with VMware NSX
[FR] C'est quoi une API ?
1. C'est quoi une API ?
Et les API chez OVH
Vincent Cassé
Développeur
2.
3. 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 :
4. À 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 :
5. 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
6. 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}/record
POST /domain/zone/{my_zone}/record
GET /domain/zone/{my_zone}/record/{one_id_record}
Exemples :
7. 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
8. À 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 ?
9. Les API OVH
api.ovh.com
Produits OVH
api.runabove.com
Labs OVH
api.hubic.com
hubiC API
Authentification script-able Authentification OAuth2
10. Les API OVH
api.soyoustart.com
Labs serveurs dédiés
api.kimsufi.com
Serveurs dédiés discount
Deprecated
ovh.com/soapi/fr/
Authentification script-able Ancienne API SOAPi
12. 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
Consumer
key
13. 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
17. La première requête !
GET https://eu.api.ovh.com/1.0/dedicated/server
[
"ns1337.a.org",
"ns42.a.org"
]
18. 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+"+"+TS
TAMP)
23. 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 ?
24. Effectuer des actions de masse
def 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
25. 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 ?
27. Gérer les pics de charge
Un site e-commerce peut subir de fortes charges
Comment ajouter des serveurs PHP-FPM + Nginx lors de ces pics ?
28. 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
29. Gérer les pics de charge
Connaî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;
}
30. 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
}
31. Gérer les pics de charge
Démarrer un serveur cloud
flavor = "550757b3-36c2-4027-b6fe-d70f45304b9c"; #VPS-SSD-1 BHS
image = "1b042c00-5978-4d75-9a7e-0d7f6ed5be76"; # Ubuntu 15.10 BHS
project_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)
32. Aller plus loin
- https://api.{ ovh | runabove | soyoustart | kimsufi | hubic }.com
- Les consoles
- github.com/ovh
- api-subscribe@ml.ovh.net