node.js dans les nuages

56
Node.js dans les nuages

Upload: xebia-france

Post on 12-Jul-2015

442 views

Category:

Software


1 download

TRANSCRIPT

Node.js dans les nuages

/me

Jean-Sébastien FRANCK@jsebfranckhttp://jsebfranck.blogspot.fr/

Use case

Le frontend est prêt. Comment on va en prod ?

Backend 1

Backend 2

Backend 3

#1 la v0 est prête

il faut la mettre en ligne

On fait tout à la main ?

● EC2 / Load balancer / Route 53 ● git clone / npm install / node server.js● upstart ? forever ?● ...

● Hosting d’application web● Surcouche de plusieurs services AWS● Interface web simple● Création automatisée de l’infra● Machines optimisées pour Node.js

Elastic Beanstalk support

Load balancer

Backend 1

S3v1.zipv2.zip

conf.zip

Console / API

USER

Backend 2

Backend 3

EC2

Elastic Beanstalk

DEV /OPS

Infra v0

Route 53DNS

#2 j’ai suivi le fichier Word de

déploiement, mais j’ai cassé la prod

Script de déploiement en Node.js awsUtil.uploadArchiveToS3(params.filename, params.remoteFilename).then(function() {

return awsUtil. createApplicationVersion(params.versionLabel, params.description, params.remoteFilename);

}).then(function(versionDetails) {

return awsUtil. updateEnvironmentVersion(params.environment, versionDetails.versionLabel);

}).then(function() {

return awsUtil. waitEnvironmentToBeReady(params.environment);

}).then(function() {

defered.resolve('Deployment is finished.')

}).catch(function(err) {

defered.reject(err);

});

Load balancer

Backend 1

S3v1.zipv2.zip

conf.zip

Console / API

USER

Backend 2

Backend 3

EC2

Elastic Beanstalk

DEV /OPS

Infra avec usine logicielle

Route 53DNS

EC2

#3 la V1 est mise en ligne et les premiers utilisateurs arrivent : le site devient

très lent

Optimiser le codeEn local :

Trouver les limites

Analyser

Optimiser

Valider

class MySimulation extends Simulation {

val httpProtocol = http.baseURL("http://localhost:3000");

val scn = scenario("My scenario").exec(http("GET /myPage").get("/myPage"));

setUp(scn.inject(constantUsersPerSec(10) during (1 minutes))).protocols(httpProtocol)

}

Optimisations

● Redis / Elasticache● Clustering● Descripteurs de fichiers● Templates swig en cache● Refactoring divers

Dimensionnement de l’infra

● Objectifs :○ déterminer le meilleur rapport performances / coûts○ quel type d’instance EC2 ?○ quel type de cache ?

● Tests Gatling sur l’infra AWS à partir d’une instance EC2

RésultatsNode : 2 x t2.medium, cache : m3.medium600 pages / seconde pendant 10 minutes

Scalabilité linéaire

● 2x t2.medium : 600 pages / seconde● 4x t2.medium : 1200 pages / seconde● 8x t2.medium : 2400 pages / seconde

● 600 pages par seconde = en théorie 1,5 milliards de pages par mois

Load balancer EC2 t2.medium

x2

Backend 1S3

v1.zipv2.zip

conf.zip

Console / API

USER

Elasticache

Redis

EC2

Backend 2

Backend 3

EC2 t2.medium

x2

Elastic Beanstalk

DEV /OPS

Infra avec 2xt2.medium, cache et tests Gatling

Route 53DNS

#4 le boss n’est pas content

d’une feature, il aurait voulu une démo sur un autre environnement

E.Beanstalk : les environnements

Pipeline dans jenkins

★ Build★ Test★ Deploy

★ Promote ★ Promote

Script de promotion en Node.jsawsUtil.getEnvironmentInfo(params.source).then(function(environment) {

return awsUtil. updateEnvironmentVersion(params.target, environment.version);

}).then(function() {

return awsUtil. waitEnvironmentToBeReady(params.target);

}).then(function() {

logger.info(‘%s has been updated from %s’, params.target, params.source);

}).catch(function(err) {

logger.error(err);

});

#5 premier spot TV,

le site ne répond plus

E.Beanstalk : Auto Scaling Group

● if (load > x) addInstance();

● Configurable sur :○ usage CPU○ usage réseau○ usage disque○ latence○ ...

● Exemple de configuration :

■ Entre 2 et 4 instances EC2○

■ if (latency > 2) addInstance();○

■ if (latency < 1) removeInstance();

E.Beanstalk : Auto Scaling Group

Source : http://aws.amazon.com/fr/architecture/

Auto scaling group

Load balancer EC2 t2.medium

x2

Backend 1S3

v1.zipv2.zip

conf.zip

Console / API

USER

Elasticache

Redis

EC2

Backend 2

Backend 3

EC2 t2.medium

x2

Elastic Beanstalk

DEV /OPS

Infra avec Auto Scaling Group

Route 53DNS

#6le site se fait attaquer

Sécurité

● AWS : tokens & security groups● npm retire● npm outdated● Helmet : middlewares pour Express● HTTPS● https://www.owasp.org/

#7les pages mettent trop de temps à s’afficher sur une

connexion mobile

Intégration avec WebPageTest

Optimiser les pages Web● Diminuer le nombre de requêtes● Des requêtes moins lourdes● Cacher les requêtes

● => Concaténation, minification, cache-control, inliner les images, nettoyage du code mort, above the fold...

Content Delivery Network

● AWS Cloudfront ● En point d’entrée de la webapp● Rapproche l’utilisateur des serveurs● Exemple pour la France :

○ Data centers proches : Dublin et Francfort○ CDN proches : Paris et Marseille

Cache busting pour les assets

Module Node Connect-cachify

Auto scaling group

Load balancer EC2 t2.medium

x2

Backend 1S3

v1.zipv2.zip

conf.zip

Console / API

USER

Elasticache

RedisCloudfrontCDN

EC2

Backend 2

Backend 3

EC2 t2.medium

x2

Elastic Beanstalk

DEV /OPS

Infra avec CDN

Route 53DNS

#8lors d’un déploiement en

pleine journée, il y a un pic d’erreurs

Test Gatling lors d’un déploiement

1% de requêtes KO, jusqu’à 30 secondes de latence

E.Beanstalk : Zero Downtime Deployment

Mise à jour des serveurs un par un :

Après configuration

~0% de requêtes KO, jusqu’à 5 secondes de latence

Avec le CDN

Aucun impact notable !

#9le site est down tout le

dimanche sans que personne ne s’en rende

compte

Elastic Beanstalk : Cloudwatch

Alertes configurables

App Performance Management

Alertes configurables

+ Health check

Agrégation des logs

Intégration facile avec Winston

+

Auto scaling group

Load balancer EC2 t2.medium

x2

Backend 1S3

v1.zipv2.zip

conf.zip

Console / API

USER

Elasticache

RedisCloudfrontCDN

EC2

Backend 2

Backend 3

EC2 t2.medium

x2

Elastic Beanstalk

DEV /OPS

Infra avec monitoring

Route 53DNS

CloudwatchMonitoring

#10le boss veut de la visibilité

sur les coûts

Bénéfices du cloud

● On ne paye que ce que l’on consomme

Bénéfices du cloud

● Pas de maintenance de data-center● En quelques clics :

○ Augmentation / réduction des ressources○ Mise en place de nouvelles infras○ Déploiement à l’international

=> On se concentre sur le métier

Coûts AWS

● Billing accessible

● Pricing Elastic Beanstalk = pricing des services utilisés

Coûts mensuelsCoûts

Usine logicielle & Dev 2 instances small : 2 * 20$ / mois

Preprod 2 instances medium : 2 * 41$ / mois

Production 2 instances medium : 2 * 41$ / mois

Cache 2 noeuds medium : 2 * 70$ / mois

CDN 10 millions de pages vues à 500KB : ~700$ / mois

Papertrail (Logs) 16GB cherchables sur 2 semaines : 150$ / mois

Newrelic (APM) 2 hosts : 180$ / mois

Total ~1400$ / mois

Auto scaling group

Load balancer EC2 t2.medium

x2

Backend 1S3

v1.zipv2.zip

conf.zip

Console / API

USER

Elasticache

RedisCloudfrontCDN

EC2

Backend 2

Backend 3

EC2 t2.medium

x2

Elastic Beanstalk

DEV /OPS

Merci ! @jsebfranck

Route 53DNS

CloudwatchMonitoring