CérénIT - httpsLe blog tech de Nicolas Steinmetz (Time Series, IoT, Web, Ops, Data)Zola2018-02-28T09:30:00+01:00https://cerenit.fr/tags/https/atom.xmlWeb, Ops & Data - Février 20182018-02-28T09:30:00+01:002018-02-28T09:30:00+01:00
Unknown
https://cerenit.fr/blog/web-ops-and-data-fevrier-2018/<h3 id="api-rest-graphql">API, Rest, GraphQL</h3>
<ul>
<li><a rel="noopener" target="_blank" href="https://medium.com/javascript-scene/graphql-at-the-rest-aurant-f4091054e82a">GraphQL at the REST-aurant</a> : une introduction à GraphQL et à ses avantages par rapport à un modèle REST en faisant une analogie avec un REST-aurant. J'ai découvert les "persisted queries".</li>
</ul>
<h3 id="container-orchestration">Container & orchestration</h3>
<ul>
<li><a rel="noopener" target="_blank" href="https://www.infoq.com/presentations/production-docker-swarm#">Going Production with Docker and Swarm</a> : une présentation repassant les bonnes et mauvaises pratiques de Docker et Docker Swarm, les outils disponibles, des éléments de sizing de cluster swarm, etc. Globalement en phase avec ce que je pratique chez un client actuellement. Prochaine étape, ne plus utiliser "latest" comme référence d'images !</li>
</ul>
<h3 id="dataviz">Dataviz</h3>
<ul>
<li><a rel="noopener" target="_blank" href="http://docs.grafana.org/guides/whats-new-in-v5/">What’s New in Grafana v5.0</a> : Grosse refonte de Grafana pour l'arrivée de cette version 5.0 : nouveau système de dashboard, gestion des permissions, gestion de groupes, gestion de dossiers, nouvelle UX, etc.</li>
</ul>
<h3 id="git">Git</h3>
<ul>
<li><a rel="noopener" target="_blank" href="https://developer.atlassian.com/blog/2015/04/force-with-lease/">--force considered harmful; understanding git's --force-with-lease</a> : Si l'usage de <code>git --force</code> est déconseillée si ce n'est proscrite, sa variante <code>git --force-with-lease</code> est plus intéressante et permet d'éviter d'écraser le travail de vos camarades alors que vous pensiez juste faire un push en force sur une branche distante suite à un rebase local.</li>
<li><a rel="noopener" target="_blank" href="http://danluu.com/monorepo/">Advantages of monolithic version control</a> : le débat mono-dépot vs multi-dépots est récurrent - celui- ci donne des raisons pro mono dépôt. Au delà du mono/multi dépôt, c'est surtout l'architecture d'une application et sa modularité qui sont prépondérants.</li>
</ul>
<h3 id="kafka">Kafka</h3>
<ul>
<li><a rel="noopener" target="_blank" href="https://eng.uber.com/reliable-reprocessing/">Building Reliable Reprocessing and Dead Letter Queues with Kafka</a> : Rien de révolutionnaire mais c'est assez bien documenté sur la gestion des erreurs / retry et au final des <a rel="noopener" target="_blank" href="https://en.wikipedia.org/wiki/Dead_letter_queue">Dead Letter Queues</a> afin d'avoir une vision sur ce qui se passe bien ou pas dans la chaine d'événements, pouvoir les reprocesser si besoin et surtout ne pas engorger le système bêtement.</li>
</ul>
<h3 id="securite-compliance">Sécurité & Compliance</h3>
<ul>
<li><a rel="noopener" target="_blank" href="https://ssl-tls.info/symantec_thawte_geotrust_rapidssl.html">La fin d’une époque…</a> : si vous utilisez des certificats issues de chez Thawte, GeoTrust et RapidSSL ayant été générés avant le 1er juin 2016 pour la 1er vague ou avant le 1er décembre 2017 (date de rachat de l'autorité de Symantec par Digicert), alors vos sites risquent d'être bloqués par les version de printemps et d'automne de Firefox et Chrome. Il vous faut renouveller vos certificats. Si votre certificat a été généré après le 1er Décembre 2017, vous n'avez rien à faire.</li>
<li><a href="vhttps://thenewstack.io/chef-bulks-security-compliance-automation-cloud/">Chef InSpec 2.0 Puts the Security into DevSecOps</a> : la spécification <a rel="noopener" target="_blank" href="https://www.inspec.io/">InSpec</a> permet de définir/tester/valider l'état d'une machine au regard de règles de conformité et de sécurité. Cette spécification a été initiée par l'entreprise Chef (éditrice du logiciel du même nom et d'Habitat entre autres). La version 2.0 vient de sortir et apporte une intégration AWS/Azure, de nouvelles ressources de validation (docker, configuration serveurs web, clés & certificats, etc) et une amélioration des performances.</li>
</ul>
<h3 id="astuce-s-du-mois">Astuce(s) du mois</h3>
<p>Lorsque l'on déploie une même application dans plusieurs contextes via <code>docker-compose</code>, il est intéressant d'utiliser le <a rel="noopener" target="_blank" href="https://docs.docker.com/compose/reference/envvars/#compose_project_name">COMPOSE_PROJECT_NAME</a> qui permet de donner un préfixe à vos réseaux et containers docker a minima.</p>
<p>L'inconvénient est qu'il faut <a rel="noopener" target="_blank" href="https://docs.docker.com/compose/reference/overview/#use--p-to-specify-a-project-name">ajouter à vos commandes</a> un <code>-p <project_name></code> :</p>
<pre data-lang="bash" style="background-color:#2b303b;color:#c0c5ce;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#bf616a;">docker-compose -p</span><span> instancea build</span><span style="color:#bf616a;"> --pull
</span><span style="color:#bf616a;">docker-compose -p</span><span> instancea up</span><span style="color:#bf616a;"> -d
</span><span style="color:#bf616a;">docker-compose -p</span><span> instancea logs</span><span style="color:#bf616a;"> -f
</span><span style="color:#bf616a;">docker-compose -p</span><span> instancea stop <service>
</span><span style="color:#bf616a;">docker-compose -p</span><span> instancea down
</span><span style="color:#bf616a;">...
</span></code></pre>
<p>Ainsi, vos conteneurs seront nommés <code>instancea_<service name>_<occurence></code> et votre réseau <code>instancea_<network name></code>.</p>
<p>Mais il est possible d'aller plus loin avec les <a rel="noopener" target="_blank" href="https://docs.docker.com/compose/env-file/">fichiers d'environnement</a> <code>.env</code>.</p>
<p>Dans votre fichier <code>.env</code> à la racine de votre dossier où se trouve votre fichier <code>docker-compose.yml</code>, définissez la/les variable(s) dont vous avez besoin. Ici, nous allons nous limiter à <code>COMPOSE_PROJET_NAME</code> mais ne vous privez pas.</p>
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>COMPOSE_PROJECT_NAME=instancea
</span></code></pre>
<p>A partir de ce moment-là, plus besoin de précier l'argument <code>-p <project name></code>, vos commandes redeviennent :</p>
<pre data-lang="bash" style="background-color:#2b303b;color:#c0c5ce;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#bf616a;">docker-compose</span><span> build</span><span style="color:#bf616a;"> --pull
</span><span style="color:#bf616a;">docker-compose</span><span> up</span><span style="color:#bf616a;"> -d
</span><span style="color:#bf616a;">docker-compose</span><span> logs</span><span style="color:#bf616a;"> -f
</span><span style="color:#bf616a;">docker-compose</span><span> stop <service>
</span><span style="color:#bf616a;">docker-compose</span><span> down
</span><span style="color:#bf616a;">...
</span></code></pre>
<p>... et pour autant, vos réseaux et containers ont le bon préfix car le fichier <code>.env</code> est lu à l'exécution de la commande <code>docker-compose</code> avant de parser <code>docker-compose.yml</code>.</p>
<p>On peut aller encore plus loin en utilisant ce <code>COMPOSE_PROJECT_NAME</code> dans le taggage des images d'un container par ex ou</p>
<pre data-lang="yaml" style="background-color:#2b303b;color:#c0c5ce;" class="language-yaml "><code class="language-yaml" data-lang="yaml"><span style="color:#bf616a;">version</span><span>: '</span><span style="color:#a3be8c;">3</span><span>'
</span><span style="color:#bf616a;">services</span><span>:
</span><span> </span><span style="color:#bf616a;">nginx</span><span>:
</span><span> </span><span style="color:#bf616a;">build</span><span>:
</span><span> </span><span style="color:#bf616a;">context</span><span>: </span><span style="color:#a3be8c;">./nginx/
</span><span> </span><span style="color:#bf616a;">image</span><span>: "</span><span style="color:#a3be8c;">registry.mycompany.com/nginx:${COMPOSE_PROJECT_NAME}</span><span>"
</span></code></pre>
<p>Lors de la phase de build, l'image sera tagguée avec le nom passé au projet compose. Ensuite, vous pouvez poussez sur la registry de votre entreprise puis déployer cette version sur votre cluster Swarm par ex.</p>
<p>A noter justement une limitation actuelle de <code>docker stack deploy <stack name> -c docker-compose.yml</code> qui ne lit pas le fichier <code>.env</code> en amont et donc <code>COMPOSE_PROJECT_NAME</code> reste vide lors de la lecture du fichier <code>docker-compose.yml</code>.</p>
<p>Une solution possible est par ex dans le script (simplifié) de déploiement :</p>
<pre data-lang="bash" style="background-color:#2b303b;color:#c0c5ce;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#96b5b4;">cd </span><span>$</span><span style="color:#bf616a;">BUILDDIR</span><span>/compose/
</span><span style="color:#96b5b4;">source</span><span> .env
</span><span>
</span><span style="color:#65737e;"># Remplace la variable COMPOSE_PROJECT_NAME par sa valeur
</span><span style="color:#bf616a;">sed -i -e </span><span>"</span><span style="color:#a3be8c;">s/</span><span style="color:#96b5b4;">\$</span><span style="color:#a3be8c;">{COMPOSE_PROJECT_NAME}/</span><span>$</span><span style="color:#a3be8c;">{</span><span style="color:#bf616a;">COMPOSE_PROJECT_NAME</span><span style="color:#a3be8c;">}/g</span><span>" docker-compose.yml
</span><span>
</span><span style="color:#bf616a;">docker</span><span> stack deploy ${</span><span style="color:#bf616a;">COMPOSE_PROJECT_NAME</span><span>}</span><span style="color:#bf616a;"> -c</span><span> docker-compose.yml
</span></code></pre>
<p>Et voilà !</p>
Web, Ops & Data - Semaine 372016-09-15T00:00:00+00:002016-09-15T00:00:00+00:00
Unknown
https://cerenit.fr/blog/web-ops-and-data-semaine-37/<h3 id="containers">Containers</h3>
<ul>
<li><a rel="noopener" target="_blank" href="http://blog.kubernetes.io/2016/08/security-best-practices-kubernetes-deployment.html">Security Best Practices for Kubernetes Deployment </a> : les points ne sont pas propres à Kubernetes : segmentation applicative via les namespaces, segmentation réseau, quota de ressources, utilisation d'images approuvées, maintient des images à jour, etc. </li>
<li><a rel="noopener" target="_blank" href="https://blog.docker.com/2016/09/docker-golang/">Docker + Golang</a> : le billet présente des astuces pour compiler un programme Go au travers de containers pour illustrer différents besoins (cross-compilation, etc)</li>
<li><a rel="noopener" target="_blank" href="https://medium.com/@kelseyhightower/12-fractured-apps-1080c73d481c#.j06ekp66l">12 fractured apps</a> : une revue des bonnes pratiques à adopter pour gérer les fichiers de configurations, les connections à des bases de données dans un monde orientée micro-services.</li>
</ul>
<h3 id="angularjs">AngularJS</h3>
<ul>
<li><a rel="noopener" target="_blank" href="http://angularjs.blogspot.fr/2016/09/angular2-final.html">AngularJS 2.0</a> : la version 2 du framework Javascript AngularJS de Google est (enfin) sorti et se dote d'un nouveau site <a rel="noopener" target="_blank" href="https://angular.io/">angular.io</a>. Etrangement, j'ai l'impression que c'est un non événement ? Cette version mainte fois discutée, tant attendue et au final ? Ou peut être que <a rel="noopener" target="_blank" href="https://facebook.github.io/react/">React</a> est passé par là et à occuper le trou laissé par cette réécriture d'Angular ?</li>
</ul>
<h3 id="kafka">Kafka</h3>
<ul>
<li><a rel="noopener" target="_blank" href="http://www.confluent.io/blog/event-sourcing-cqrs-stream-processing-apache-kafka-whats-connection/">Event sourcing, CQRS, stream processing and Apache Kafka: What’s the connection?</a> : après un rappel sur ce qu'est CQRS et l'Event Sourcing, le billet décrit les apports de Kafka (et Kafka Streams / Kafka Connect) pour ce type de projet.</li>
<li><a rel="noopener" target="_blank" href="http://www.confluent.io/blog/announcing-the-certified-datastax-connector">Announcing the Certified DataStax Connector for Confluent Platform</a>, Kafka Connect se dôte d'un connecteur Cassandra. Il s'agit d'un connecteur de type <em>"Sink'</em>, c'est à dire que vous pouvez pousser des données de Kafka vers Cassandra.</li>
</ul>
<h3 id="tick-telegraf-influxdb-chronograf-et-kapacitor">TICK (Telegraf, InfluxDB, Chronograf et Kapacitor)</h3>
<ul>
<li>La plateforme TICK atteint le palier de la version 1.0 ; <a rel="noopener" target="_blank" href="https://www.influxdata.com/influxdb-1-0-ga-released-a-retrospective-and-whats-next/">InfluxDB</a>, <a rel="noopener" target="_blank" href="https://www.influxdata.com/announcing-telegraf-1-0-the-plugin-driven-agent-for-collecting-metrics/">Telegraf</a> et <a rel="noopener" target="_blank" href="https://www.influxdata.com/announcing-kapacitor-1-0-a-data-processing-engine-for-influxdb/">Kapacitor</a>. Pas de grosses nouveautés dans ces releases, juste une stabilisation et le tampon 1.0 ; Chronograf est aussi estampillé 1.0 même s'il s'est fait discret depuis <a rel="noopener" target="_blank" href="https://www.influxdata.com/announcing-influxdb-v0-13-plus-clustering-early-access/">la version 0.13</a>. A voir s'il rattrape son retard sur Grafana...</li>
</ul>
<h3 id="securite">Sécurité</h3>
<ul>
<li><a rel="noopener" target="_blank" href="https://www.nicolas-hoffmann.net/source/1697-Obtenir-une-bonne-note-sur-Mozilla-Observatory-HTTPS-CSP-SRI-CORS-HSTS-HPKP-etc.html">Obtenir une bonne note sur Mozilla Observatory : HTTPS/CSP/SRI/CORS/HSTS/HPKP/etc.</a> : Le Mozilla Observatory est un outil d'aide à l'évaluation de la sécurité de votre site web. Le billet vulgarise les technoligies sous-jacentes et donne des pistes pour avoir une bonne note à ce test et améliorer la sécurté de vos sites.</li>
</ul>
<h3 id="postgres">Postgres</h3>
<ul>
<li><a rel="noopener" target="_blank" href="http://sdf.org/~riley/blog/2016/01/04/is-bi-directional-replication-bdr-in-postgres-transactional/">Is Bi-Directional Replication (BDR) in Postgres Transactional?</a> : En gros BDR fonctionne si vous n'avez pas de contraintes transactionnelles fortes. D'autres solutions sont présentées sur le wiki de la fondation Postgres: <a rel="noopener" target="_blank" href="https://wiki.postgresql.org/wiki/Replication,_Clustering,_and_Connection_Pooling">Replication, Clustering, and Connection Pooling</a></li>
</ul>