Lorsque vous stockez vos fichiers dans Nuxeo Platform et que vous voulez bénéficier des avantages des solutions Cloud d'AWS, il y a un moment où vous devez choisir la façon dont vous accédez aux blobs stockés dans Nuxeo Platform. Une question toujours délicate, en particulier lorsque tout le monde veut bénéficier de performances maximales sans faire de compromis. Trouver la meilleure solution entre Amazon S3 et Azure (puis choisir d'opter ou non pour un CDN) n'est pas une mince affaire. Dans cet article, nous allons donc aborder les différentes solutions basées sur AWS pour vous permettre de faire votre choix entre un stockage S3 direct ou une solution CloudFront redirigeant vers un bucket S3.

Je ne vais pas aborder les questions de tarifications liées à ces options, mais vous pouvez partir du principe qu'utiliser CloudFront pour transférer vos données sera moins coûteux que S3.

Il y a un petit moment, je vous ai montré comment ajuster le taux de téléchargement de vos blobs et nous avons vu qu'il était très simple de configurer Nuxeo Platform pour générer une URL S3 directe ou pour obtenir un URI sur un objet CloudFront en amont de l'URL S3.

Imaginons le scénario suivant :

Je sais que j'ai des clients dans différents emplacements périphériques (Edge locations), que CloudFront est le CDN utilisé pour AWS, et je sais que j'ai besoin d'un système rapide. Même si S3 fonctionne sur un principe de réplication entre régions, CloudFront propose un plus grand nombre de points de terminaison (Endpoints) au niveau des emplacements périphériques.

L'objectif ici n'est donc pas de comparer la récupération simultanée de plusieurs ressources web (feuilles de style, fichiers GIF, JPEG ou .js) via un CDN, car ce n'est pas l'objectif principal de Nuxeo Platform. Nous pourrions certainement le faire, mais nous préférons nous concentrer sur la qualité plutôt que sur la quantité !

Par exemple, on peut parler du gain lié à une requête (ce qui signifie un téléchargement). N'oubliez pas que la taille moyenne d'une ressource téléchargée est d'environ 5 Mo, rarement moins.

Passons à la comparaison ! Pensez au jour où vous, l'un des meilleurs product owners de votre société, devrez choisir entre ces deux configurations pour Nuxeo Platform :

  • Stocker les blobs sur S3 et configurer un accès direct pour télécharger les ressources.
  • Mettre en place une redirection vers CloudFront, configurée avec S3 et dotée de fonctions de sécurité.

Votre journée pourrait ressembler à ceci :

  • Vous vous dites que ça serait une bonne idée d'utiliser CloudFront en amont de S3. Très bon choix. Vous savez depuis notre dernier article comment gagner en performances, mais vous devez justifier cette décision auprès de votre équipe de scrum. Plus vous y réfléchissez, et plus les questions vous viennent :
  • Vous (le PO) hésitez entre S3 et CloudFront + S3 pendant votre session de priorisation, après avoir consulté des dizaines d'articles abordant le sujet de la performance (1 heure si vous êtes vraiment très rapide... 3 heures si vous êtes humain, comme nous tous !)
  • Vous expliquez l'idée à votre équipe et, bien sûr, ils veulent en discuter. Les mêmes questions reviennent. "Mais pourquoi ?" "Pourquoi CloudFront ?" (La discussion dure au moins 10 minutes).
  • Votre équipe finit par accepter et votre développeur senior passe la tâche à "En cours" dans votre kanban. Youpi ! (5 secondes)
  • Puis l'équipe de développement prend une pause avant de commencer la tâche (10 minutes s'ils prennent juste un café, plus s'ils vont chercher à manger).
  • Le développeur sait exactement ce qu'il/elle doit faire. Pas besoin de lire la documentation. (0 seconde)
  • Le développeur demande à l'administrateur AWS de lui envoyer les clés CloudFront, car si vous voulez des URL sécurisées, seul le compte de votre utilisateur racine peut créer les paires de clés nécessaires pour générer l'URL signée à partir de Nuxeo Platform. (2 minutes)
  • L'administrateur AWS, qui ne s'est pas connecté depuis un moment, perd du temps à retrouver les clés MFA de la racine pour se connecter et s'assurer que tout est configuré et sécurisé. (20 minutes)
  • Enfin, l'administrateur AWS génère les clés privées et les partage avec le développeur (en lui demandant de s'en occuper). (45 minutes en théorie, mais probablement plus !)
  • Enfin, notre développeur peut créer le bucket S3 et le configurer en tant que stockage par défaut dans Nuxeo Platform (Plus ou moins 30 minutes, c'est assez facile.)
  • Le développeur peut maintenant chercher comment stocker les paires de clés CloudFront et comment les utiliser dans l'environnement de production. Pour ça, il/elle doit changer les scripts de déploiement, car ceux-ci doivent être sécurisés et ne pas être stockés dans le référentiel de sources principal. (2 heures, c'est certain !)
  • Et là, toutes ces modifications cassent la chaîne d'intégration continue ! Notre développeur doit la réparer (1 heure, peut-être plus si Jenkins fait des siennes !)
  • La tâche est enfin terminée.

Temps passé : 359 minutes et 5 seconds, ou 21 545 secondes

Au contraire, partons du principe que vous souhaitez miser sur la simplicité en optant pour un système S3 où les requêtes de téléchargement sont directement redirigées vers (nuxeo.s3storage.directdownload=true).

  • Vous (le PO) priorisez la tâche. (30 secondes)
  • Vous expliquez la tâche à votre équipe de la façon suivante : « Je pense que ça sera suffisant, dans la mesure où S3 réplique désormais les blobs dans des centres de données du monde entier. Il n'y a pas autant d'emplacements que CloudFront, mais ça fait l'affaire pour le moment. » (2 minutes)
  • Notre développeur passe la tâche dans la colonne "En cours". Youpi ! (5 secondes)
  • Le développeur prend une pause avant de commencer sa tâche. (10 minutes)
  • Enfin, il/elle peut créer le bucket S3 et le configurer en tant que stockage par défaut dans Nuxeo Platform (Plus ou moins 30 minutes, c'est assez facile.)
  • La tâche est terminée.

Temps passé : 42 minutes et 35 seconds, ou 2 555 secondes

Cela fait donc une différence de 18 990 secondes, soit environ 316 minutes, ou plus de 5 heures entre ces deux configurations.

S3 prend moins de temps à configurer, mais CloudFront offre de meilleures performances.

Je ne vais pas faire de benchmark maintenant, car les résultats seront liés à ma localisation et à d'autres paramètres que je ne peux pas contrôler. Mais partons du principe que l'on gagne effectivement 100 ms par requête (ce qui est déjà énorme) en ajoutant CloudFront à S3.

Cela signifie qu'il vous faut 189 900 téléchargements via CloudFront avant de commencer à gagner vraiment du temps, et vous devez encore configurer certaines choses :

  • L'accès racine de votre compte AWS.
  • Générer les paires de clés CloudFront afin d'obtenir des URL signées depuis Nuxeo Platform.
  • Gérer les fichiers sensibles (paires de clés) de l'environnement de développement vers la production.

...au lieu d'utiliser directement S3. Ce chiffre peut représenter beaucoup de téléchargements (ou pas) en fonction de l'utilisation et du nombre d'utilisateurs actifs que vous prévoyez.

L'idée ici n'est pas de prendre parti, mais de vous donner des éléments de réponse pour vous aider dans votre prise de décision.

Amusez-vous bien à déployer votre configuration AWS !