Effacer le filtre
Annonce
Irène Mykhailova · Avr 10, 2022
Docker 20.10.14 (publié le 23 mars 2022) modifie les capacités Linux accordées aux conteneurs d'une manière incompatible avec le vérificateur de capacités Linux dans les conteneurs InterSystems IRIS 2021.1 (et versions ultérieures).
Les utilisateurs exécutant Docker 20.10.14 sous Linux constateront que les conteneurs IRIS 2021.1+ ne démarreront pas et les journaux signaleront à tort que les fonctionnalités Linux requises sont manquantes. Par example :
[ERROR] Required Linux capability cap_setuid is missing.
[ERROR] Required Linux capability cap_dac_override is missing.
[ERROR] Required Linux capability cap_fowner is missing.
[ERROR] Required Linux capability cap_setgid is missing.
[ERROR] Required Linux capability cap_kill is missing.
[FATAL] Your IRIS container is missing one or more required Linux capabilities.
Quoi faire
Les utilisateurs rencontrant ce problème devront ajuster la ligne de commande transmise au point d'entrée du conteneur pour désactiver la vérification des fonctionnalités Linux. À partir de la ligne de commande, ajoutez --check-caps false après l'image dans votre commande docker run ou docker start. Par example :
docker run containers.intersystems.com/intersystems/iris-community:2022.1.0.152.0 --check-caps false
Si vous utilisez docker-compose, le changement correspondant serait le suivant :
command: --check-caps false
La vérification de capacité agit comme un moyen de vérifier les erreurs de configuration courantes avant de démarrer les processus IRIS. La désactivation de la vérification des capacités Linux n'a aucun impact sur les processus IRIS exécutés dans le conteneur.
En savoir plus
Docker 20.10.14 release notes
Running InterSystems Products in Containers
Article important, à partir de docker desktop 4.7.0
Cette erreur ce produit. Merci!
Ce post m'a évité de perdre beaucoup de temps.
J'ai commencé à modifier les fichiers docker-compose sur mes différents repo publiques.
Annonce
Robert Bira · Juin 2, 2022
Bonjour ,
Un webinaire a été organisé le mardi 24 mai pour vous faire découvrir les nouvelles fonctionnalités d'InterSystems IRIS ® et InterSystems IRIS for Health™ version 2022.1.
Au cours de ce webinaire, Benjamin De Boe et Bob Kuszewski ont montré certaines de ces nouvelles fonctionnalités notamment :
Prise en charge complète du développement d'applications à l'aide de Python.
Améliorations de la vitesse de traitement et de l'évolutivité notamment autour d'Adaptive SQL et SQL Loader
Prise en charge native d'Apache Kafka
Nouveaux services cloud, prise en charge de nouveaux adaptateurs cloud et Kubernetes.
Supports pour Windows Serveur 2022, Windows 11, Aix et Oracle Linux
Ce webinaire est désormais disponible en replay
Annonce
Irène Mykhailova · Sept 21, 2022
Salut la communauté !
Êtes-vous à Dubaï du 10 au 13 octobre ? Rejoignez-nous à la conférence Global DevSlam pour les développeurs avec 15 000 participants attendus en personne !📍Lieau: Hall 9, Stand № H9-E30, Dubai World Trade Center
🗓 Date: 10 Octobre, 14h00 - 15h30 🌟 Nous organiserons l'événement : "L'atelier pratique sur la plate-forme de données InterSystems IRIS"
Conférencier : @Guillaume.Rongier7183, Sales Engineer à l'InterSystemsInscrivez-vous ici !❕Nous avons des laissez-passer promotionnels gratuits pour les membres de notre communauté, nos partenaires et nos clients. Ecrivez à @Olga.Zavrazhnova2637 si vous êtes prêt à y assister!
Annonce
Irène Mykhailova · Sept 26, 2022
Bonjour à la communauté !
Nous sommes ravis d'annoncer un nouveau type de concours : le concours de l'idée la plus brillante ! Bienvenue :
💡 InterSystems Idea-A-Thon 💡
Proposez une idée liée aux produits et services d'InterSystems entre le **26 septembre** et le **16 octobre** et recevez un **prix garanti.**
En outre, **les employés d'InterSystems aussi bien que les Membres de la Communauté** peuvent participer !
**>> [Envoyez vos idées ici](https://ideas.intersystems.com)
InterSystems Ide-A-Thon est organisé via le [portail de feedback sur les idées d'InterSystems](http://ideas.intersystems.com/) où vous pouvez soumettre des demandes d'amélioration de produits et des idées liées à nos services (Documentation, Communauté Dev, Global Masters, etc.) et voter pour celles qui vous plaisent.
Dans le cadre de ce concours, nous invitons chacun à partager ses idées sur ce portail et à voter pour les autres.
Pour participer au concours, il suffit de soumettre une idée sur le [portail des Idées d'InterSystems](http://ideas.intersystems.com/).
**Les idées acceptées devraient : **
Annonce
Irène Mykhailova · Oct 6, 2022
Rencontrez InterSystems à TechCrunch Disrupt 2022 - le plus grand événement pour les startups !
Cette année, nous organiserons 4 tables rondes à TechCrunch ainsi qu'une rencontre de développeurs à San Francisco le 19 octobre !
Chez TechCrunch, nous vous invitons à rejoindre nos tables rondes pour discuter des sujets suivants :
Table ronde : Percer dans le monolithe des soins de santé : stratégies de collaboration avec les payeurs et les fournisseurs
Comment créer une start-up de technologies de la santé capable d'atteindre une croissance élevée ? Que peuvent faire les startups pour rendre leurs technologies plus attrayantes pour les plus grands acteurs de la santé : les payeurs et les systèmes de santé ? Au cours de cette session, nous discuterons des points faibles de l'entrée dans les soins de santé, ainsi que des stratégies pour ouvrir les portes à ces organisations pour des projets pilotes et des revenus durables. Vous quitterez cette table ronde avec une liste des meilleures pratiques des plus de 40 ans d'InterSystems dans le secteur de la santé.
La session se déroulera deux fois : mardi 10/18 et mercredi à 10h30 - 11h00
Table ronde : Qu'est-ce que l'interopérabilité de toute façon ?
Dans un monde où les données sont généralement disponibles au bout des doigts d'un codeur, pourquoi est-il si difficile de se connecter à certains clients ? Tout le monde n'a-t-il pas des API que nous pouvons utiliser pour accéder aux données ? Qu'est-ce que l'interopérabilité ? Les technologies cloud et les data fabrics peuvent-ils résoudre nos problèmes ? Comment nos startups peuvent-elles être mieux préparées à entrer dans les écosystèmes de données dans des secteurs tels que la santé, les services financiers ou la chaîne d'approvisionnement ? Cette table ronde vous donnera un aperçu de ce qu'est l'interopérabilité, pourquoi ces industries établies s'interfacent comme elles le font et des stratégies pour rendre ce processus moins pénible lorsque vous développez vos produits.
La session se déroulera deux fois : mardi 10/18 et mercredi à 10h30 - 11h00
Intervenant : Neal Moawed, Responsable mondial de la recherche industrielle, InterSystems
Qui sera là? Faites le nous savoir !
Annonce
Irène Mykhailova · Nov 3, 2022
Bonjour la communauté,
Nous sommes heureux d'annoncer que InterSystems IRIS, IRIS for Health, HealthShare Health Connect et InterSystems IRIS Studio 2022.2 sont maintenant disponibles !
Et pour discuter de toutes les fonctionnalités nouvelles et améliorées de celui-ci, nous aimerions vous inviter à notre webinaire Quoi de neuf dans InterSystems IRIS 2022.2.
Au cours de ce webinaire, nous mettrons en évidence certaines des nouvelles fonctionnalités d'InterSystems IRIS® et InterSystems IRIS for Health™, version 2022.2, notamment :
Stockage en colonne - version bêta
Nouvel éditeur de règles
Améliorations SQL
Prise en charge des plates-formes nouvelles et mises à jour
Connecteurs de stockage cloud pour Microsoft Azure et Google Cloud
Intervenants :🗣 @Robert.Kuszewski, Product Manager, Developer Experience🗣 @Benjamin.DeBoe, Product Manager
Cette fois-ci, nous avons décidé d'héberger ces webinaires à des jours différents pour différents fuseaux horaires, afin que chacun puisse choisir l'heure qui lui convient. Les voici:
📅 Date : mardi 15 novembre 2022⏱ Heure : 13 h 00 AEDT🔗 Inscrivez-vous ici
📅 Date : jeudi 17 novembre 2022⏱ Heure : 13 h 00 EST🔗 Inscrivez-vous ici
📅 Date : mardi 22 novembre 2022⏱ Heure : 10 h 00 AM GMT🔗 Inscrivez-vous ici
N'oubliez pas de vous inscrire via les liens ci-dessus et à bientôt !
Article
Kevin Koloska · Nov 11, 2022
** Révisé le 12 février 2018
Bien que cet article concerne InterSystems IRIS, il s’applique également aux distributions Caché, Ensemble et HealthShare.
Introduction
La mémoire est gérée en pages. La taille de page par défaut est de 4 Ko sur les systèmes Linux. Red Hat Enterprise Linux 6, SUSE Linux Enterprise Server 11 et Oracle Linux 6 ont introduit une méthode permettant d’augmenter la taille des pages en 2 Mo ou 1 Go en fonction de la configuration du système, connue sous le nom de HugePages.
Au début, les HugePages devaient être attribuées au démarrage et, si elles ne sont pas gérées ou calculées correctement, elles pourraient entraîner un gaspillage de ressources. En conséquence, diverses distributions Linux ont introduit Transparent HugePages avec le noyau 2.6.38 activé par défaut. Il s’agissait d’un moyen d’automatiser la création, la gestion et l’utilisation de HugePages. Les versions antérieures du noyau peuvent également avoir cette fonctionnalité, mais peuvent ne pas être marquées comme [toujours] et potentiellement définies sur [madvise].
Transparent Huge Pages (THP) est un système de gestion de la mémoire Linux qui réduit la surcharge des recherches TLB (Translation Lookaside Buffer) sur les machines avec de grandes quantités de mémoire en utilisant des pages de mémoire plus grandes. Cependant, dans les versions Linux actuelles, THP ne peut mapper que l’espace de tas et de pile de processus individuels.
Le problème
La majorité de l’allocation de mémoire dans n’importe quel système de cache est constituée des segments de mémoire partagée (pools de tampons globaux et de routine) et parce que THP ne gère pas ces segments de mémoire partagée. Par conséquent, les THP ne sont pas utilisés pour la mémoire partagée et ne sont utilisés que pour chaque processus individuel. Cela peut être confirmé à l’aide d’une simple commande shell.
Voici un exemple d’un système de test chez InterSystems qui montre 2 Mo de THP alloués aux processus du cache :
# grep -e AnonHugePages /proc/*/smaps | awk '{ if($2>4) print $0} ' | awk -F « / » '{print $0; system(« ps -fp " $3)} '
/proc/2945/smaps:AnonHugePages: 2048 ko
UID PID PPID C STIME TTY TIME CMD
racine 2945 1 0 2015 ? 01:35:41 /usr/sbin/rsyslogd -n
/proc/70937/smaps:AnonHugePages: 2048 ko
UID PID PPID C STIME TTY TIME CMD
root 70937 70897 0 janv.27 pts/0 00:01:58 /bench/EJR/ycsb161b641/bin/cache WD
/proc/70938/smaps:AnonHugePages: 2048 ko
UID PID PPID C STIME TTY TIME CMD
root 70938 70897 0 janv.27 pts/0 00:00:00 /bench/EJR/ycsb161b641/bin/cache GC
/proc/70939/smaps:AnonHugePages: 2048 ko
UID PID PPID C STIME TTY TIME CMD
root 70939 70897 0 janv.27 pts/0 00:00:39 /bench/EJR/ycsb161b641/bin/cache JD
/proc/70939/smaps:AnonHugePages: 4096 ko
UID PID PPID C STIME TTY TIME CMD
root 70939 70897 0 janv.27 pts/0 00:00:39 /bench/EJR/ycsb161b641/bin/cache JD
/proc/70940/smaps:AnonHugePages: 2048 Ko
UID PID PPID C STIME TTY TIME CMD
root 70940 70897 0 janv.27 pts/0 00:00:29 /bench/EJR/ycsb161b641/bin/cache SWD 1
/proc/70941/smaps:AnonHugePages: 2048 ko
UID PID PPID C STIME TTY TIME CMD
root 70941 70897 0 janv.27 pts/0 00:00:29 /bench/EJR/ycsb161b641/bin/cache SWD 2
/proc/70942/smaps:AnonHugePages: 2048 ko
UID PID PPID C STIME TTY TIME CMD
root 70942 70897 0 janv.27 pts/0 00:00:29 /bench/EJR/ycsb161b641/bin/cache SWD 3
/proc/70943/smaps:AnonHugePages: 2048 ko
UID PID PPID C STIME TTY TIME CMD
root 70943 70897 0 janv.27 pts/0 00:00:33 /bench/EJR/ycsb161b641/bin/cache SWD 7
/proc/70944/smaps:AnonHugePages: 2048 Ko
UID PID PPID C STIME TTY TIME CMD
root 70944 70897 0 janv.27 pts/0 00:00:29 /bench/EJR/ycsb161b641/bin/cache SWD 4
/proc/70945/smaps:AnonHugePages: 2048 ko
UID PID PPID C STIME TTY TIME CMD
root 70945 70897 0 janv.27 pts/0 00:00:30 /bench/EJR/ycsb161b641/bin/cache SWD 5
/proc/70946/smaps:AnonHugePages: 2048 ko
UID PID PPID C STIME TTY TIME CMD
root 70946 70897 0 janv.27 pts/0 00:00:30 /bench/EJR/ycsb161b641/bin/cache SWD 6
/proc/70947/smaps:AnonHugePages: 4096 ko
En outre, il existe des pénalités potentielles de performances sous la forme de retards d’allocation de mémoire au moment de l’exécution, en particulier pour les applications qui peuvent avoir un taux élevé de création de tâches ou de processus.
La recommandation
InterSystems recommande pour le moment de désactiver THP car le gain de performance prévu n’est pas applicable au segment de mémoire partagée IRIS et le potentiel d’un impact négatif sur les performances dans certaines applications.
Vérifiez si Transparent HugePages est activé sur votre système Linux en exécutant les commandes suivantes :
Pour les noyaux Red Hat Enterprise Linux :
# cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
Pour les autres noyaux :
# cat /sys/kernel/mm/transparent_hugepage/enabled
La commande ci-dessus affiche si l’indicateur [toujours], [madvise] ou [jamais] est activé. Si THP est supprimé du noyau, les fichiers /sys/kernel/mm/redhat_transparent_hugepage ou /sys/kernel/mm/redhat/transparent_hugepage n’existent pas.
Pour désactiver Transparent HugePages pendant le démarrage, effectuez les opérations suivantes :
1. Ajoutez l’entrée suivante à la ligne de démarrage du noyau dans le fichier /etc/grub.conf :
transparent_hugepage=jamais
2. Redémarrez le système d’exploitation
Il existe une méthode pour désactiver également THP à la volée, mais cela peut ne pas fournir le résultat souhaité car cette méthode ne fera qu’arrêter la création et l’utilisation de THP pour de nouveaux processus. THP déjà créé ne sera pas désassemblé en pages mémoire régulières. Il est conseillé de redémarrer complètement le système pour désactiver THP au démarrage.
*Remarque: Il est recommandé de confirmer auprès de votre distributeur Linux respectif pour confirmer les méthodes utilisées pour désactiver THP.
Annonce
Guillaume Rongier · Mars 16, 2022
InterSystems est très heureux d'annoncer la sortie de la version 2021.1 de la plateforme de données InterSystems IRIS, InterSystems IRIS for Health et HealthShare Health Connect, qui sont maintenant généralement disponibles pour nos clients et partenaires.
Les améliorations apportées à cette version offrent aux développeurs une plus grande liberté pour créer des applications rapides et robustes dans le langage de leur choix, tant du côté serveur que du côté client. Cette version permet également aux utilisateurs de consommer plus efficacement de grandes quantités d'informations grâce à de nouvelles capacités d'analyse plus rapides.
Nous nous attendons à ce que de nombreux clients et partenaires mettent à niveau leurs déploiements de Caché et d'Ensemble vers cette version d'IRIS d'InterSystems et nous avons tout mis en œuvre pour que cette transition se fasse sans heurts et soit utile. La plupart des applications verront des avantages immédiats en termes de performance juste en fonctionnant sur InterSystems IRIS, avant même d'explorer les nombreuses et puissantes capacités qu'IRIS apporte.
Nous vous invitons cordialement à participer à [notre webinaire présentant les points forts de la nouvelle version](https://event.on24.com/wcc/r/2977036/A3EBC8E1C1043B350B1EA087AE798F6E), le 17 juin à 11h00 EDT. Le webinaire sera enregistré et [pourra être revisionné](https://www.intersystems.com/news-events/events/?filter%5bevent-type%5d=upcoming-webinars&display=upcoming) par la suite. Vous pouvez également écouter l'épisode de notre [podcast Data Points sur les nouveautés de la version 2021.1](https://community.intersystems.com/post/data-points-ep-19-whats-new-version-20211-intersystems-iris).
Points forts de la version
Avec InterSystems IRIS 2021.1, les clients peuvent déployer [InterSystems IRIS Adaptive Analytics](https://www.intersystems.com/sg/resources/detail/intersystems-adaptive-analytics/), un produit complémentaire qui étend InterSystems IRIS pour fournir aux utilisateurs professionnels une facilité d'utilisation supérieure et des capacités d'analyse en libre-service pour visualiser, analyser et interroger de vastes quantités de données afin d'obtenir les informations dont ils ont besoin pour prendre des décisions commerciales précises et opportunes, sans être des experts en conception ou en gestion de données. Adaptive Analytics accélère de manière transparente les charges de travail de requêtes analytiques qui s'exécutent contre InterSystems IRIS en construisant et en maintenant de manière autonome des structures de données intermédiaires en arrière-plan.
Les autres fonctionnalités phares de cette version sont les suivantes :
Une meilleure gestion pour nos serveurs de langues externes, qui couvrent désormais également R et Python. Cette technologie de passerelle permet de tirer parti de manière robuste et évolutive du code côté serveur dans le langage de votre choix
InterSystems Kubernetes Operator (IKO) offre une configuration déclarative et une automatisation pour vos environnements, et prend désormais en charge le déploiement d'InterSystems System Alerting & Monitoring (SAM).
InterSystems API Manager v2.3, comprenant une expérience utilisateur améliorée, la prise en charge de Kafka et le mode hybride.
Disponibilité généralisée d'IntegratedML, permettant aux développeurs SQL de créer et de déployer des modèles d'apprentissage automatique directement dans un environnement purement SQL.
Prise en charge des champs de flux sur les tables sharded, vous offrant une flexibilité totale des schémas SQL sur l'architecture horizontalement extensible InterSystems IRIS
Une image de conteneur iris-lockeddown, mettant en œuvre de nombreuses bonnes pratiques de sécurité telles que la désactivation de l'accès Web au portail de gestion et les permissions appropriées au niveau du système d'exploitation.
Prise en charge de la clé de preuve pour l'échange de codes (PKCE) pour Oauth 2.0
**InterSystems IRIS for Health 2021.1** comprend toutes les améliorations d'InterSystems IRIS. En outre, cette version étend encore la prise en charge complète de la plateforme pour la **norme FHIR®** grâce à des API permettant d'analyser et d'évaluer les expressions **FHIRPath** par rapport aux données FHIR. Cela s'ajoute aux importantes capacités liées à FHIR publiées depuis 2020.1, notamment la prise en charge des profils FHIR, des transformations FHIR R4 et de l'API client FHIR.
Cette version comprend également **HealthShare Health Connect**, notre moteur d'intégration basé sur InterSystems IRIS for Health, qui assure la prise en charge de transactions à haut volume, la gestion des processus et la surveillance pour soutenir les applications critiques. Pour un aperçu détaillé de la comparaison de son ensemble de fonctionnalités avec InterSystems IRIS for Health, veuillez consulter [ce lien](https://www.intersystems.com/resources/detail/freeing-data-through-seamless-interoperability/).
Vous trouverez plus de détails sur toutes ces fonctionnalités dans la documentation du produit, qui a récemment été rendue encore plus facile à naviguer grâce à une **table des matières latérale pratique**.
Documentation et notes de version d'InterSystems IRIS 2021.1
Documentation et notes de version d'InterSystems IRIS for Health 2021.1
Documentation et notes de version de HealthShare Health Connect 2021.1
Si vous effectuez une mise à niveau à partir d'une version antérieure et utilisez TLS 1.3, veuillez consulter ces [considérations de mise à niveau](https://docs.intersystems.com/iris20211/csp/docbook/Doc.View.cls?KEY=GCRN_upgrade_intro).
### Comment obtenir le logiciel
InterSystems IRIS 2021.1 est une version de maintenance étendue (EM) et est livré avec des paquets d'installation classiques pour [toutes les plateformes prises en charge](https://docs.intersystems.com/iris20211/csp/docbook/Doc.View.cls?KEY=ISP_technologies#ISP_platforms_server), ainsi que des images de conteneur au format OCI (Open Container Initiative), c-à-d. au format Docker.
Les packages d'installation complets pour chaque produit sont disponibles sur le site de [téléchargement des produits](https://wrc.intersystems.com/wrc/coDistIRIS.csp) du WRC. L'utilisation de l'option d'installation « personnalisée » permet aux utilisateurs de choisir les options dont ils ont besoin, telles que InterSystems Studio et IntegratedML, afin de réduire l'empreinte de leur installation.
Les images de conteneur pour les **éditions Enterprise** d'InterSystems IRIS et d'InterSystems IRIS for Health et tous les composants correspondants sont disponibles à partir du [registre de conteneurs InterSystems](https://docs.intersystems.com/components/csp/docbook/Doc.View.cls?KEY=PAGE_containerregistry) à l'aide des commandes suivantes :
docker pull containers.intersystems.com/intersystems/iris:2021.1.0.215.0
docker pull containers.intersystems.com/intersystems/iris-ml:2021.1.0.215.0
docker pull containers.intersystems.com/intersystems/irishealth:2021.1.0.215.0
docker pull containers.intersystems.com/intersystems/irishealth-ml:2021.1.0.215.0
Pour une liste complète des images disponibles, veuillez vous référer à [la documentation ICR](https://docs.intersystems.com/components/csp/docbook/Doc.View.cls?KEY=PAGE_containerregistry#PAGE_containerregistry_images).
Les images de conteneur pour l'**édition communautaire** peuvent également être tirées de la [boutique Docker](https://hub.docker.com/_/intersystems-iris-data-platform) à l'aide des commandes suivantes :
docker pull store/intersystems/iris-community:2021.1.0.215.0
docker pull store/intersystems/iris-ml-community:2021.1.0.215.0
docker pull store/intersystems/irishealth-community:2021.1.0.215.0
docker pull store/intersystems/irishealth-ml-community:2021.1.0.215.0
Alternativement, des versions tarball de toutes les images de conteneur sont disponibles via le [site de téléchargement de produits](https://wrc.intersystems.com/wrc/coDistContainers.csp) du WRC.
**InterSystems IRIS Studio 2021.1** est un IDE autonome à utiliser avec Microsoft Windows et peut être téléchargé via le [site de téléchargement de produits](https://wrc.intersystems.com/wrc/coDistGen.csp) du WRC. Il fonctionne avec InterSystems IRIS et InterSystems IRIS for Health version 2021.1 et suivantes. InterSystems prend également en charge le plugin **[ObjectScript VSCode](https://intersystems-community.github.io/vscode-objectscript/)** pour développer des applications pour InterSystems IRIS avec Visual Studio Code, qui est disponible pour Microsoft Windows, Linux et MacOS.
D'autres composants autonomes d'InterSystems IRIS 2021.1, tels que le pilote ODBC et la passerelle Web, sont disponibles sur la même page.
### Partager vos expériences
Nous n'avons l'occasion d'annoncer qu'une seule version EM par an. Nous sommes donc ravis de voir cette version franchir le cap de GA et impatients de connaître vos expériences avec le nouveau logiciel. N'hésitez pas à nous contacter par l'intermédiaire de votre équipe de compte ou ici sur la [Communauté des développeurs](http://community.intersystems.com) pour nous faire part de vos commentaires sur la technologie ou les cas d'utilisation que vous traitez avec elle.
Pour certaines nouvelles fonctionnalités et certains nouveaux produits, nous avons mis en place des programmes d'accès anticipé afin de permettre à nos utilisateurs d'évaluer le logiciel avant sa sortie. Grâce à ces initiatives ciblées, nous pouvons apprendre de notre public cible et nous assurer que le nouveau produit répond à ses besoins lors de sa sortie. Si vous souhaitez participer à l'un de ces programmes, veuillez contacter l'équipe en charge de votre compte ou consulter la [Communauté des développeurs](http://community.intersystems.com).
Article
Guillaume Rongier · Mai 15, 2023
Salut à tous !
Dans cet article, j'aimerais passer en revue les extensions de VS Code que j'utilise moi-même pour travailler avec InterSystems et qui rendent mon travail beaucoup plus pratique. Je suis certain que cet article sera utile à ceux qui commencent tout juste à apprendre les technologies d'InterSystems. Cependant, j'espère également que cet article pourra être utile aux développeurs expérimentés ayant de nombreuses années d'expérience et qu'il leur ouvrira de nouvelles possibilités lors de l'utilisation de VS Code pour le développement.
Je recommande à tous ceux qui travaillent avec InterSystems d'avoir ces extensions installées et, dans cet article, je montrerai comment utiliser certaines d'entre elles.
Vous pouvez en savoir plus sur la fonctionnalité et l'utilisation de chaque extension dans la section Extensions de VS Code, où vous pouvez également télécharger, mettre à jour et désinstaller des extensions :
Après l'installation, des icônes d'extension apparaissent sur le côté ou en bas de l'éditeur de code.
**_Extensions obligatoires_**
Je crois qu'il est logique de commencer notre voyage avec ces extensions de base, sans lesquelles il est impossible de travailler avec InterSystems dans VS Code.
L'extension du gestionnaire de serveur d'InterSystems pour VS Code permet de spécifier les connexions au serveur.
L'extension ObjectScript d'InterSystems pour VS Code permet l'écriture et la compilation des fichiers de code.
L'extension du serveur de langage d'InterSystems pour VS Code permet la mise en œuvre d'un serveur de langage pour ObjectScript, offrant des fonctions de coloration, de complétion de code, d'évaluation de la qualité et bien plus encore.
Conjointement, ces extensions offrent aux développeurs un moyen rationalisé de créer, tester et déployer des applications complètes basées sur InterSystems.
**Extensions supplémentaires**
Outre les extensions de base nécessaires, VS Code propose un grand nombre d'autres extensions. Vous pouvez écrire du code sans elles, mais leur utilisation rend le développement plus efficace lorsque vous utilisez n'importe quelle pile technologique, y compris les technologies d'InterSystems. J'en décrirai quelques-unes qui me semblent incontournables.
L'extension Docker rend la gestion des projets dockerisés un peu plus facile. Vous pouvez générer automatiquement un fichier Docker pour les projets, exécuter des images et gérer les conteneurs actifs.
Le pilote SQLTools for InterSystems IRIS et SqlTools - sont deux extensions très pratiques qui fonctionnent conjointement. En les utilisant, vous pouvez créer et exécuter les requêtes SQL de la base de données dans VS Code sans avoir à aller dans le portail de gestion et à effectuer des requêtes sql pour interagir avec le contenu des tableaux qui s'y trouvent.
Aujourd'hui, il est difficile d'imaginer développer un projet sans utiliser le contrôle de version. Le plus souvent, il s'agit de Git, et le code Visual Studio a un support minimal dès sa sortie de la boîte. Mais si cela ne vous suffit pas, jetez un coup d'œil aux deux extensions suivantes :
Git Graph - montre les branches et leur statut de manière schématique. Ceci est utile dans les situations où vous avez besoin de comprendre rapidement l'état des branches, par exemple lorsqu'elles fusionnent.
Git Lens - permet de voir l'historique des modifications apportées à la ligne surlignée et à son auteur.
Il est indispensable au travail d'équipe !
EditorConfig - une extension pour améliorer l'apparence du code, elle nécessite l'écriture d'un fichier .editorconfig, dans lequel vous pouvez spécifier tous les paramètres de formatage du code. Il est important de noter que, par défaut, cette fonctionnalité peut être mise en œuvre par l'extension du serveur de langage InterSystems pour VS Code. Pour appliquer le formatage de code ObjectScript standard dans VS Code, vous devez utiliser une combinaison de touches : Windows - [Shift + Alt + F], Mac - [Shift + Option + F], Ubuntu - [Ctrl + Shift + I]. Mais en utilisant le fichier .editorconfig, vous pouvez spécifier votre propre formatage de code pour différents fichiers au sein du projet.
Dans cet article, je n'ai abordé que les extensions utilisées par moi-même. Je vous serais reconnaissante de prendre le temps d'écrire dans les commentaires ce qui peut encore être utilisé pour rendre le développement plus pratique. Cet article n'en sera que plus utile !
Article
Guillaume Rongier · Fév 28, 2022

Cet article contient le matériel, les exemples, les exercices pour apprendre les concepts de base de IAM.
Toutes les ressources sont disponibles sur ce git : https://github.com/grongierisc/iam-training.
Les solutions sont dans la [branche training](https://github.com/grongierisc/iam-training/tree/training).
Cet article couvre les sujets suivants :
- [1. Introduction](#1-introduction)
- [1.1. Qu'est-ce que IAM ?](#11-what-is-iam-)
- [1.2. Qu'est-ce que la gestion d''API ?](#12-what-is-an-api-management-)
- [1.3. Portail IAM](#13-iam-portal)
- [1.4. Flux de cette formation](#14-flow-of-this-training)
- [2. Installation](#2-installation)
- [2.1. Que devez-vous installer ?](#21-what-do-you-need-to-install)
- [2.2. Comment IAM fonctionne avec IRIS](#22-how-iam-works-with-iris)
- [2.3. Configuration](#23-setup)
- [2.4. Installer IAM](#24-install-iam)
- [2.4.1. Image Iris](#241-iris-image)
- [2.4.2. Image IAM](#242-iam-image)
- [2.4.3. Mettre le fichier docker à jour](#243-update-the-docker-file)
- [2.4.4. Mettre le docker-compose à jour](#244-update-the-docker-compose)
- [2.4.5. Option : add IRIS_PASSWARD comme .env](#245-option--add-iris_passward-as-env)
- [2.4.6. Essayez !](#246-test-it-)
- [3. Premier service/route](#3-first-serviceroute)
- [3.1. Créer un service](#31-create-a-service)
- [3.2. Créer une route](#32-create-a-route)
- [3.3. Essayez !](#33-test-it-)
- [3. Ensuite, allez plus loin avec le plugin](#4-second-go-further-with-plugin)
- [4.1. Ajouter un plugin au service](#41-add-a-plugin-to-the-service)
- [4.2. Essayez !](#42-test-it-)
- [5. Troisièmement, ajoutez votre propre authentification](#5-third-add-our-own-authentication)
- [5.1. Ajouter des consommateurs](#51-add-consumers)
- [5.2. Ajouter un plugin d'authentification basique](#52-add-basic-auth-plugin)
- [5.3. Ajouter un plugin ACL](#53-add-acl-plugin)
- [5.4. Configurer USER avec ACL et des identifiants](#54-configure-user-with-acl-and-credentials)
- [5.5. Essayez !](#55-test-it-)
- [6. Exercice, limitation du débit](#6-exercice-rate-limiting)
- [6.1. Solution](#61-solution)
- [7. Portail développeur](#7-dev-portal)
- [7.1. Vue d'ensemble](#71-overview)
- [7.2. Activez-le !](#72-enable-it-)
- [7.3. Ajoutez votre première spécification](#73-add-your-first-spec)
- [7.4. Essayez !](#74-test-it-)
- [7.5. Exercice](#75-exercise)
- [7.5.1. Solution](#751-solution)
- [8. Portail développeur, partie deux, authentification](#8-dev-portal-part-two-authentication)
- [8.1. Activer l'authentification de base](#81-enable-basic-auth)
- [8.2. Limiter l'accès](#82-limit-access)
- [8.2.1. Créer un rôle](#821-create-a-role)
- [8.2.2. Ajouter un rôle à la spec](#822-add-role-to-spec)
- [8.2.3. Essayez !](#823-test-it-)
- [8.2.3.1. Inscrire un nouveau développeur](#8231-register-a-new-developer)
- [8.2.3.2. Approuver ce développeur](#8232-approve-this-developer)
- [8.2.3.3. Ajouter un rôle pour ce développeur](#8233-add-role-for-this-developer)
- [8.3. Ajouter Oauth2 pour le développeur](#83-add-oauth2-for-developer)
- [8.3.1. Tout d'abord, retirez l'authentification de base](#831-first-remove-basic-auth)
- [8.3.2. Ensuite, ajoutez le plugin de demande d'inscription](#832-second-add-application-registration-plugin)
- [8.3.3. Associez le service et la documentation](#833-link-service-and-documentation)
- [8.3.3.1. Essayez !](#8331-test-it-)
- [9. Portail de gestion sécurisé](#9-secure-management-portal)
- [9.1. Créer un administrateur](#91-create-an-admin)
- [9.2. Activer l'authentification de base pour Kong Manager](#92-enable-basic-auth-for-kong-manager)
- [9.3. Utiliser l'API Kong Admin avec RBAC](#93-use-kong-admin-api-with-rbac)
- [9.3.1. Créer un utilisateur administrateur avec un jeton](#931-create-and-admin-user-with-a-token)
- [10. Plug-ins](#10-plugins)
- [10.1. Importer un plugin communautaire](#101-import-a-community-plugin)
- [10.1.1. Compliez une nouvelle image Kong/IAM avec le plugin communautaire](#1011-build-a-new-kongiam-docker-image-with-the-community-plugin)
- [10.1.2. Essayez !](#1012-test-it-)
- [10.1.2.1. Utilisez-le !](#10121-use-it-)
- [10.2. Créer un nouveau plugin](#102-create-a-new-plugin)
- [10.2.1. Structure de fichiers](#1021-file-structure)
- [10.2.1.1. handler.lua](#10211-handlerlua)
- [10.2.1.1.1. Exemple](#102111-example)
- [10.2.1.2. schema.lua](#10212-schemalua)
- [10.2.1.3. *.rockspec](#10213-rockspec)
- [10.2.2. Compilez-le](#1022-build-it)
- [10.2.3. Astuces](#1023-tips)
- [11. CI / CD](#11-cicd)
- [11.1. Créer la collection Postman](#111-create-the-postman-collection)
- [11.1.1. IAM est-il démarré ?](#1111-is-iam-startup-)
- [11.1.2. Supprimer les anciennes données](#1112-delete-old-datas)
- [11.1.3. Créer un service/route](#1113-create-serviceroute)
- [11.1.3.1. Astuces](#11131-tips)
- [11.2. Exécutez-le avec newman](#112-run-it-with-newman)
# 1. Introduction

## 1.1. Qu'est-ce que IAM ?
IAM signifie InterSystems API Manager, il est basé sur **Kong Enterprise Edition**.
Cela signifie que vous avez accès, en plus de l'édition Kong Open Source, au :
* Portail gestionnaire
* Portail des développeurs
* Plugin avancé
* Oauth2
* Mise en cache
* ...

## 1.2. Qu'est-ce que la gestion d''API ?
La gestion des API est le processus de création et de publication d'interfaces de programmation d'applications (API) Web, d'application de leurs politiques d'utilisation, de contrôle de l'accès, d'entretien de la communauté d'abonnés, de collecte et d'analyse des statistiques d'utilisation et de production de rapports sur les performances. Les composants de gestion des API fournissent des mécanismes et des outils pour soutenir la communauté des développeurs et des abonnés.

## 1.3. Portail IAM
Kong et IAM sont conçus comme des API d'abord, ce qui signifie que tout ce qui est fait dans Kong/IAM peut être fait par des appels REST ou le portail du gestionnaire.
Au cours de cet article, tous les exemples/exercices présenteront les deux de cette façon :
| Portail IAM | API Rest |
| ----------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
|  |  |
## 1.4. Flux de cet article
Le but de cet article est d'utiliser IAM comme proxy d'une API rest IRIS.
La définition de cette API rest peut être trouvée ici :
```url
http://localhost:52773/swagger-ui/index.html#/
```
ou ici
```url
https://github.com/grongierisc/iam-training/blob/training/misc/spec.yml
```
Commencez cet article avec la branche principale.
A la fin de l'article, vous devriez avoir le même résultat que la branche d'entraînement.
# 2. Installation

## 2.1. Que devez-vous installer ?
* [Git](https://git-scm.com/downloads)
* [Docker](https://www.docker.com/products/docker-desktop) (si vous utilisez Windows, assurez-vous de configurer votre installation Docker pour utiliser les « conteneurs Linux »).
* [Docker Compose](https://docs.docker.com/compose/install/)
* [Visual Studio Code](https://code.visualstudio.com/download) + [l'extension VSCode InterSystems ObjectScript](https://marketplace.visualstudio.com/items?itemName=daimor.vscode-objectscript)
* Fichier de licence IRIS IAM InterSystems activé.
* Image Docker IAM
## 2.2. Comment IAM fonctionne avec IRIS
Au démarrage de Kong/IAM, le conteneur vérifie la licence Kong/IAM avec un appel curl.
Le point de terminaison de cet appel est une API REST sur le conteneur IRIS.
Info : la licence Kong est incorporée dans celle d'IRIS.

## 2.3. Configuration
Clonez Git ce dépôt.
git clone https://github.com/grongierisc/iam-training
Exécutez l'API rest initiale :
docker-compose up
Testez-la :
```url
http://localhost:52773/swagger-ui/index.html#/
```
Identifiant/mot de passe : SuperUser/SYS
## 2.4. Installer IAM
### 2.4.1. Image Iris
Vous devez d'abord passer de l'édition communautaire à une édition sous licence.
Pour ce faire, vous devez configurer votre accès à InterSystems Container Registry pour télécharger les images IRIS à accès limité.
Jetez un œil à la [Présentation d'InterSystems Container Registry](https://community.intersystems.com/post/introducing-intersystems-container-registry) dans la [Communauté des développeurs](https://community.intersystems.com).
* Connectez-vous à https://containers.intersystems.com/ en utilisant vos informations d'identification du WRC et obtenez un *jeton*.
* Configurez la connexion docker sur votre ordinateur :
```bash
docker login -u="user" -p="token" containers.intersystems.com
```
* Obtenez l'image IRIS InterSystems :
```bash
docker pull containers.intersystems.com/intersystems/irishealth:2020.4.0.524.0
```
### 2.4.2. Image IAM
Dans la [distribution logicielle WRC](https://wrc.intersystems.com/wrc/coDistribution.csp) :
* Composants > Téléchargez le fichier *IAM-1.5.0.9-4.tar.gz*, décompressez & untar puis chargez l'image :
```bash
docker load -i iam_image.tar
```
### 2.4.3. Mettre le fichier docker à jour
Remplacer l'édition communautaire d'IRIS par une édition sous licence.
* containers.intersystems.com/intersystems/irishealth:2020.4.0.524.0
* ajoutez iris.key dans le dossier key
Modifiez le dockerfile pour ajouter par-dessus cette partie
```dockerfile
ARG IMAGE=containers.intersystems.com/intersystems/irishealth:2020.4.0.524.0
# Première étape
FROM $IMAGE as iris-iam
COPY key/iris.key /usr/irissys/mgr/iris.key
COPY iris-iam.script /tmp/iris-iam.script
RUN iris start IRIS \
&& iris session IRIS < /tmp/iris-iam.script \
&& iris stop IRIS quietly
# Seconde étape
FROM iris-iam
```
Cette partie va créer un dockerfile à plusieurs étapes.
* la première étape consiste à permettre à IRIS de servir la licence IAM.
* la deuxième étape est pour la compliation de l'API REST
Créez un nouveau fichier iris-iam.script pour compiler une nouvelle image IRIS afin d'activer le point de terminaison et l'utilisateur IAM.
```objectscript
zn "%SYS"
write "Création d'une application Web ...",!
set webName = "/api/iam"
set webProperties("Enabled") = 1
set status = ##class(Security.Applications).Modify(webName, .webProperties)
write:'status $system.Status.DisplayError(status)
write "Web application "_webName_" a été mis à jour !",!
set userProperties("Enabled") = 1
set userName = "IAM"
Do ##class(Security.Users).Modify(userName,.userProperties)
write "User "_userName_" a été mis à jour !",!
halt
```
### 2.4.4. Mettre le docker-compose à jour
Metez le fichier docker-compose à jour vers :
* db
* base de données postgres pour IAM
* iam-migration
* amorcer la base de données
* iam
* instance IAM réelle
* un volume pour les données persistantes
Ajoutez cette partie à la fin du fichier docker-compose.
```yml
iam-migrations:
image: intersystems/iam:1.5.0.9-4
command: kong migrations bootstrap up
depends_on:
- db
environment:
KONG_DATABASE: postgres
KONG_PG_DATABASE: ${KONG_PG_DATABASE:-iam}
KONG_PG_HOST: db
KONG_PG_PASSWORD: ${KONG_PG_PASSWORD:-iam}
KONG_PG_USER: ${KONG_PG_USER:-iam}
KONG_CASSANDRA_CONTACT_POINTS: db
KONG_PLUGINS: bundled,jwt-crafter
ISC_IRIS_URL: IAM:${IRIS_PASSWORD}@iris:52773/api/iam/license
restart: on-failure
links:
- db:db
iam:
image: intersystems/iam:1.5.0.9-4
depends_on:
- db
environment:
KONG_ADMIN_ACCESS_LOG: /dev/stdout
KONG_ADMIN_ERROR_LOG: /dev/stderr
KONG_ADMIN_LISTEN: '0.0.0.0:8001'
KONG_ANONYMOUS_REPORTS: 'off'
KONG_CASSANDRA_CONTACT_POINTS: db
KONG_DATABASE: postgres
KONG_PG_DATABASE: ${KONG_PG_DATABASE:-iam}
KONG_PG_HOST: db
KONG_PG_PASSWORD: ${KONG_PG_PASSWORD:-iam}
KONG_PG_USER: ${KONG_PG_USER:-iam}
KONG_PROXY_ACCESS_LOG: /dev/stdout
KONG_PROXY_ERROR_LOG: /dev/stderr
KONG_PORTAL: 'on'
KONG_PORTAL_GUI_PROTOCOL: http
KONG_PORTAL_GUI_HOST: '127.0.0.1:8003'
KONG_ADMIN_GUI_URL: http://localhost:8002
KONG_PLUGINS: bundled
ISC_IRIS_URL: IAM:${IRIS_PASSWORD}@iris:52773/api/iam/license
volumes:
- ./iam:/iam
links:
- db:db
ports:
- target: 8000
published: 8000
protocol: tcp
- target: 8001
published: 8001
protocol: tcp
- target: 8002
published: 8002
protocol: tcp
- target: 8003
published: 8003
protocol: tcp
- target: 8004
published: 8004
protocol: tcp
- target: 8443
published: 8443
protocol: tcp
- target: 8444
published: 8444
protocol: tcp
- target: 8445
published: 8445
protocol: tcp
restart: on-failure
db:
image: postgres:9.6
environment:
POSTGRES_DB: ${KONG_PG_DATABASE:-iam}
POSTGRES_PASSWORD: ${KONG_PG_PASSWORD:-iam}
POSTGRES_USER: ${KONG_PG_USER:-iam}
volumes:
- 'pgdata:/var/lib/postgresql/data'
healthcheck:
test: ["CMD", "pg_isready", "-U", "${KONG_PG_USER:-iam}"]
interval: 30s
timeout: 30s
retries: 3
restart: on-failure
stdin_open: true
tty: true
volumes:
pgdata:
```
Ajoutez le fichier .env dans le dossier racine :
```env
IRIS_PASSWORD=SYS
```
NB : Voici la définition des ports Kong :
| Port | Protocole | Description |
| ----- | --------- | ---------------------------------------------------------------------------------------------------------- |
| :8000 | HTTP | Prend le trafic HTTP entrant des Consommateurs, et le transmet aux Services en amont. |
| :8443 | HTTPS | Reçoit le trafic HTTPS entrant des consommateurs et le transmet aux services en amont. |
| :8001 | HTTP | API d'administration. Écoute les appels de la ligne de commande via HTTP. |
| :8444 | HTTPS | API d'administration. Écoute les appels de la ligne de commande via HTTPS. |
| :8002 | HTTP | Kong Manager (GUI). Écoute le trafic HTTP. |
| :8445 | HTTPS | Kong Manager (GUI). Écoute le trafic HTTPS. |
| :8003 | HTTP | Portail des développeurs. Écoute le trafic HTTP, en supposant que Portail des développeurs est activé. |
| :8446 | HTTPS | Portail des développeurs. Écoute le trafic HTTPS, en supposant que Portail des développeurs est activé. |
| :8004 | HTTP | Portail des développeurs /écoute le trafic HTTP, en supposant que le portail des développeurs est activé. |
| :8447 | HTTPS | Portail des développeurs /écoute le trafic HTTPS, en supposant que le portail des développeurs est activé. |
### 2.4.5. Option : add IRIS_PASSWARD comme .env
Pour des raisons de facilité d'utilisation (et peut-être de sécurité), vous pouvez utiliser le fichier .env dans le dockerfile IRIS.
Pour ce faire, modifiez le docker-compose avec ceci dans la partie service iris :
```yml
build:
context: .
dockerfile: dockerfile
args:
- IRIS_PASSWORD=${IRIS_PASSWORD}
```
Et le dockerfile (deuxième ou première étape de la compilation) :
```dockerfile
ARG IRIS_PASSWORD
RUN echo "${IRIS_PASSWORD}" > /tmp/password.txt && /usr/irissys/dev/Container/changePassword.sh /tmp/password.txt
```
### 2.4.6. Essayez !
docker-compose -f "docker-compose.yml" up -d --build
# 3. Premier service/route

Vous vous souvenez comment fonctionne Kong/IAM ?

Ici, nous compilerons :
* un service
* pour notre API crud
* une route
* pour accéder à ce service
## 3.1. Créer un service
Portail IAM
API Rest
# Créer un service
curl -i -X POST \
--url http://localhost:8001/services/ \
--data 'name=crud' \
--data 'url=http://iris:52773/crud/'
Par défaut, tout est accessible pour un utilisateur non authentifié.
## 3.2. Créer une route
Portail IAM
API Rest
# Créer une route
curl -i -X POST \
--url http://localhost:8001/services/crud/routes \
--data 'name=crud-route' \
--data 'paths=/persons/*' \
--data 'strip_path=false'
Que voyons-nous ici, pour créer une route nous avons besoin de :
* son nom de service
* un chemin ou les RegEx sont autorisées
## 3.3. Essayez !
**API originale**
# Obsolète
curl –i --location --request GET 'http://localhost:52773/crud/persons/all' \
--header 'Authorization: Basic U3VwZXJVc2VyOlNZUw=='
**API proxy**
# KONG
curl –i --location --request GET 'http://localhost:8000/persons/all' \
--header 'Authorization: Basic U3VwZXJVc2VyOlNZUw=='
Ce que nous voyons ici :
* Rien de nouveau du côté hérité.
* Du côté kong :
* Nous changeons le port
* Le chemin correspond à la route
* Nous devons toujours nous authentifier
# 4. Ensuite, allez plus loin avec le plugin
Pour aller plus loin, nous allons essayer d'auto-authentifier Kong au point de terminaison IRIS.
Pour ce faire, nous utiliserons un plugin, resquest-transformer.

## 4.1. Ajouter un plugin au service
Portail IAM
API Rest
# Créer un plugin
curl -i -X POST \
--url http://localhost:8001/services/crud/plugins \
--data 'name=request-transformer' \
--data 'config.add.headers=Authorization:Basic U3VwZXJVc2VyOlNZUw==' \
--data 'config.replace.headers=Authorization:Basic U3VwZXJVc2VyOlNZUw=='
## 4.2. Essayez !
# Obsolète
**API originale**
curl –i --location --request GET 'http://localhost:52773/crud/persons/all'
**API proxy**
# KONG
curl –i --location --request GET 'http://localhost:8000/persons/all'
Ce que nous voyons ici :
* Erreur 401 sur l'API originale
* Nous atteignons les données sans authentification
# 5. Troisièmement, ajoutez votre propre authentification
Ce que nous voulons réaliser ici est d'ajouter notre propre authentification sans aucun dérangement de l'API originale.

## 5.1. Ajouter des consommateurs
Portail IAM
API Rest
# Ajouter un consommateur anonyme
curl -i -X POST \
--url http://localhost:8001/consumers/ \
--data "username=anonymous" \
--data "custom_id=anonymous"
# Ajouter un utilisateur consommateur
curl -i -X POST \
--url http://localhost:8001/consumers/ \
--data "username=user" \
--data "custom_id=user"
## 5.2. Ajouter un plugin d'authentification basique
Portail IAM
API Rest
# Activer l'authentification de base pour le service
curl -i -X POST http://localhost:8001/routes/crud-route/plugins \
--data "name=basic-auth" \
--data "config.anonymous=5cc8dee4-066d-492e-b2f8-bd77eb0a4c86" \
--data "config.hide_credentials=false"
Où :
* config.anonymous = uuid du consommateur anonyme
## 5.3. Ajouter un plugin ACL
Portail IAM
API Rest
# Activer ACL
curl -i -X POST http://localhost:8001/routes/crud-route/plugins \
--data "name=acl" \
--data "config.whitelist=user"
## 5.4. Configurer USER avec ACL et des identifiants
Portail IAM
API Rest
# Ajouter un groupe consommateur
curl -i -X POST \
--url http://localhost:8001/consumers/user/acls \
--data "group=user"
# Add consumer credentials
curl -i -X POST http://localhost:8001/consumers/user/basic-auth \
--data "username=user" \
--data "password=user"
## 5.5. Essayez !
**API originale**
# Obsolète
curl –i --location --request GET 'http://localhost:52773/crud/persons/all' \
--header 'Authorization:Basic dXNlcjp1c2Vy'
**API proxy **
# KONG
curl –i --location --request GET 'http://localhost:8000/persons/all' \
--header 'Authorization:Basic dXNlcjp1c2Vy'
# 6. Exercice, limitation du débit
1. Activer un utilisateur non authentifié
2. Limiter le débit à 2 appels par minutes pour un utilisateur non authentifié
## 6.1. Solution
1. Activer un utilisateur non authentifié
Portail IAM
API Rest
# Ajouter un groupe consommateur
curl -i -X POST \
--url http://localhost:8001/consumers/anonymous/acls \
--data "group=user"
2. Limiter le débit à 2 appels par minutes pour un utilisateur non authentifié
Portail IAM
API Rest
# Ajouter une limitation du débit consommateur
curl -i -X POST \
--url http://localhost:8001/consumers/anonymous/plugins \
--data "name=rate-limiting" \
--data "config.limit_by=consumer" \
--data "config.minute=2"
# 7. Portail des développeurs

## 7.1. Vue d'ensemble
Le Portail des développeurs Kong fournit :
* une source unique de vérité pour tous les développeurs
* une gestion intuitive du contenu de la documentation
* une intégration simplifiée des développeurs
* un contrôle d'accès basé sur les rôles (RBAC)

## 7.2. Activez-le !
Portail IAM
API Rest
curl -X PATCH http://localhost:8001/workspaces/default --data "config.portal=true"
## 7.3. Ajoutez votre première spécification
**Portail IAM**
**API Rest**
curl -X POST http://localhost:8001/default/files -F "path=specs/iam-training.yml" -F "contents=@misc/spec.yml"
## 7.4. Essayez !
```url
http://localhost:8003/default/documentation/iam-training
```
Que s'est-il passé ?
Comment résoudre ce problème ?
## 7.5. Exercice
1. Ajouter un plugin CORS à la route
### 7.5.1. Solution
Portail IAM
API Rest
# Activer CORS
curl -i -X POST http://localhost:8001/routes/crud-route/plugins \
--data "name=cors"
# 8. Portail développeur, partie deux, authentification
## 8.1. Activer l'authentification de base
Portail IAM
Configuration de la session (JSON)
{
"cookie_secure": false,
"cookie_name": "portal_session",
"secret": "SYS",
"storage": "kong"
}
L'authentification est maintenant activée pour le portail des développeurs.
## 8.2. Limiter l'accès
Par défaut, tout est accessible pour un utilisateur non authentifié.
Nous pouvons créer un rôle pour limiter certains accès.
Par exemple, limitons l'accès à la documentation de notre API CRUD.
### 8.2.1. Créer un rôle
Portail IAM
API Rest
# Activer le rôle
curl -i -X POST http://localhost:8001/default/developers/roles \
--data "name=dev"
### 8.2.2. Ajouter un rôle à la spec
**Portail IAM**
**API Rest**
# Activer le rôle
curl 'http://localhost:8001/default/files/specs/iam-training.yml' -X PATCH -H 'Accept: application/json, text/plain, */*' --compressed -H 'Content-Type: application/json;charset=utf-8' -H 'Origin: http://localhost:8002' -H 'Referer: http://localhost:8002/default/portal/permissions/' --data-raw $'{"contents":"x-headmatter:\\n readable_by:\\n - dev\\nswagger: \'2.0\'\\ninfo:\\n title: InterSystems IRIS REST CRUD demo\\n description: Demo of a simple rest API on IRIS\\n version: \'0.1\'\\n contact:\\n email: apiteam@swagger.io\\n license:\\n name: Apache 2.0\\n url: \'http://www.apache.org/licenses/LICENSE-2.0.html\'\\nhost: \'localhost:8000\'\\nbasePath: /\\nschemes:\\n - http\\nsecurityDefinitions:\\n basicAuth:\\n type: basic\\nsecurity:\\n - basicAuth: []\\npaths:\\n /:\\n get:\\n description: \' PersonsREST general information \'\\n summary: \' Server Info \'\\n operationId: GetInfo\\n x-ISC_CORS: true\\n x-ISC_ServiceMethod: GetInfo\\n responses:\\n \'200\':\\n description: (Expected Result)\\n schema:\\n type: object\\n properties:\\n version:\\n type: string\\n default:\\n description: (Unexpected Error)\\n /persons/all:\\n get:\\n description: \' Retreive all the records of Sample.Person \'\\n summary: \' Get all records of Person class \'\\n operationId: GetAllPersons\\n x-ISC_ServiceMethod: GetAllPersons\\n responses:\\n \'200\':\\n description: (Expected Result)\\n schema:\\n type: array\\n items:\\n $ref: \'#/definitions/Person\'\\n default:\\n description: (Unexpected Error)\\n \'/persons/{id}\':\\n get:\\n description: \' Return one record fo Sample.Person \'\\n summary: \' GET method to return JSON for a given person id\'\\n operationId: GetPerson\\n x-ISC_ServiceMethod: GetPerson\\n parameters:\\n - name: id\\n in: path\\n required: true\\n type: string\\n responses:\\n \'200\':\\n description: (Expected Result)\\n schema:\\n $ref: \'#/definitions/Person\'\\n default:\\n description: (Unexpected Error)\\n put:\\n description: \' Update a record in Sample.Person with id \'\\n summary: \' Update a person with id\'\\n operationId: UpdatePerson\\n x-ISC_ServiceMethod: UpdatePerson\\n parameters:\\n - name: id\\n in: path\\n required: true\\n type: string\\n - name: payloadBody\\n in: body\\n description: Request body contents\\n required: false\\n schema:\\n type: string\\n responses:\\n \'200\':\\n description: (Expected Result)\\n default:\\n description: (Unexpected Error)\\n delete:\\n description: \' Delete a record with id in Sample.Person \'\\n summary: \' Delete a person with id\'\\n operationId: DeletePerson\\n x-ISC_ServiceMethod: DeletePerson\\n parameters:\\n - name: id\\n in: path\\n required: true\\n type: string\\n responses:\\n \'200\':\\n description: (Expected Result)\\n default:\\n description: (Unexpected Error)\\n /persons/:\\n post:\\n description: \' Creates a new Sample.Person record \'\\n summary: \' Create a person\'\\n operationId: CreatePerson\\n x-ISC_ServiceMethod: CreatePerson\\n parameters:\\n - name: payloadBody\\n in: body\\n description: Request body contents\\n required: false\\n schema:\\n type: string\\n responses:\\n \'200\':\\n description: (Expected Result)\\n default:\\n description: (Unexpected Error)\\ndefinitions:\\n Person:\\n type: object\\n properties:\\n Name:\\n type: string\\n Title:\\n type: string\\n Company:\\n type: string\\n Phone:\\n type: string\\n DOB:\\n type: string\\n format: date-time\\n"}'
Ce qui est important ici, c'est cette partie :
```yml
x-headmatter:
readable_by:
- dev
```
Référez-vous à cette documentation : [readable_by attribute](https://docs.konghq.com/enterprise/1.5.x/developer-portal/administration/developer-permissions/#readable_by-attribute)
### 8.2.3. Essayez !
#### 8.2.3.1. Inscrire un nouveau développeur

#### 8.2.3.2. Approuver ce développeur

#### 8.2.3.3. Ajouter un rôle pour ce développeur

curl 'http://localhost:8001/default/developers/dev@dev.com' -X PATCH --compressed -H 'Content-Type: application/json;charset=utf-8' -H 'Cache-Control: no-cache' -H 'Origin: http://localhost:8002' -H 'DNT: 1' -H 'Connection: keep-alive' -H 'Referer: http://localhost:8002/default/portal/permissions/dev/update' -H 'Pragma: no-cache' --data-raw '{"roles":["dev"]}'
## 8.3. Ajouter Oauth2 pour le développeur
Dans cette partie, nous allons ajouter une authentification Oauth2 pour que les développeurs puissent utiliser notre API crud de manière sécurisée.
Ce flux permettra l'auto-enregistrement du développeur et lui donnera accès à l'API crud.
### 8.3.1. Tout d'abord, retirez l'authentification de base
Pour ce faire, nous allons remplacer notre authentification de base par une authentification bearToken.
Désactivez d'abord notre authentification/acl de base.
**Portail IAM**
**API Rest**
# Désactiver le plugin ACL
curl 'http://localhost:8001/default/routes/afefe836-b9be-49a8-927a-1324a8597a9c/plugins/3f2e605e-9cb6-454a-83ec-d1b1929b1d30' -X PATCH --compressed -H 'Content-Type: application/json;charset=utf-8' -H 'Cache-Control: no-cache' -H 'Origin: http://localhost:8002' -H 'DNT: 1' -H 'Connection: keep-alive' -H 'Referer: http://localhost:8002/default/plugins/acl/3f2e605e-9cb6-454a-83ec-d1b1929b1d30/update' -H 'Pragma: no-cache' --data-raw '{"enabled":false,"name":"acl","route":{"id":"afefe836-b9be-49a8-927a-1324a8597a9c"},"config":{"hide_groups_header":false,"whitelist":["user","dev","crud"]}}'
### 8.3.2. Ensuite, ajoutez le plugin de demande d'inscription
Portail IAM
API Rest
# Créer un plugin d'enregistrement d'application
curl -i -X POST \
--url http://localhost:8001/services/crud/plugins \
--data 'name=application-registration' \
--data 'config.auth_header_name=authorization' \
--data 'config.auto_approve=true' \
--data 'config.display_name=auth' \
--data 'config.enable_client_credentials=true'
### 8.3.3. Associez le service et la documentation
**Portail IAM**
**API Rest**
curl 'http://localhost:8001/default/document_objects' --compressed -H 'Content-Type: application/json;charset=utf-8' -H 'Cache-Control: no-cache' -H 'Origin: http://localhost:8002' -H 'DNT: 1' -H 'Connection: keep-alive' -H 'Referer: http://localhost:8002/default/services/create-documentation' -H 'Pragma: no-cache' --data-raw '{"service":{"id":"7bcef2e6-117c-487a-aab2-c7e57a0bf61a"},"path":"specs/iam-training.yml"}'
#### 8.3.3.1. Essayez !
À partir du portail des développeurs, connecté en tant que dev@dev.com, créez une nouvelle demande.

Cela vous donnera client_id et client_secret.
Il peuvent être utilisé dans le portail développeur.
Inscrivez cette demande dans le service crud :

Obtenez un jeton :
curl --insecure -X POST https://localhost:8443/persons/oauth2/token \
--data "grant_type=client_credentials" \
--data "client_id=2TXNvDqjeVMHydJbjv9t96lWTXOKAtU8" \
--data "client_secret=V6Vma6AtIvl04UYssz6gAxPc92eCF4KR"
Utilisez le jeton :
curl --insecure -X GET https://localhost:8443/persons/all \
--header "authorization: Bearer u5guWaYR3BjZ1KdwuBSC6C7udCYxj5vK"
# 9. Portail de gestion sécurisé
## 9.1. Créer un administrateur
Comme nous avons amorcé Kong sans mot de passe de démarrage.
Nous devons créer un administrateur avant d'appliquer RBAC.
Pour cela :
* Allez dans Équipes
* Invitez un administrateur
* Définissez l'adresse e-mail
* Définissez le nom d'utilisateur
* Définissez le rôle sur super administrateur
* Invitez
* Allez dans Administrateur invité
* Affichez
* Créez un lien

## 9.2. Activer l'authentification de base pour Kong Manager
Pour activer cette fonctionnalité, nous devons modifier le fichier docker-compose.
Ajoutez ceci au service iam, environnement
```yml
KONG_ENFORCE_RBAC: 'on'
KONG_ADMIN_GUI_AUTH: 'basic-auth'
KONG_ADMIN_GUI_SESSION_CONF: '{"secret":"${IRIS_PASSWORD}","storage":"kong","cookie_secure":false}'
```
Redémarrez le conteneur
docker-compose down && docker-compose up -d
Allez au lien administrateur invité :
```url
http://localhost:8002/register?email=test.test%40gmail.com&username=admin&token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MTYzMzYzNzEsImlkIjoiY2JiZGE5Y2UtODQ3NS00MmM2LTk4ZjItNDgwZTI4MjQ4NWNkIn0.sFeOc_5UPIr3MdlQrgyGvmvIjRFvSn3nQjo2ph8GrJA
```
## 9.3. Utiliser l'API Kong Admin avec RBAC
Comme RBAC est défini, nous ne pouvons plus utiliser l'api kong admin :
curl -s -X GET \
--url http://localhost:8001/routes
Revoie cette erreur :
```json
{"message":"Identifiants incorrects. Jeton ou identifiants utilisateurs requis"}
```
### 9.3.1. Créer un utilisateur administrateur avec un jeton
* Allez dans Équipes
* Utilisateurs RBAC
* Ajouter un nouvel utilisateur

curl -s -X GET \
--url http://localhost:8001/routes \
--header "Kong-Admin-Token: SYS"
# 10. Plug-ins

Kong est livré avec des plugins de haute qualité.
Mais et si nous avions besoin de plugins qui ne soient pas intégrés ? Si nous voulons des plugins communautaires ?
Dans ce chapitre, nous allons parler des plugins communautaires et comment les importer.
Ensuite, nous verrons comment compiler notre propre plugin.
## 10.1. Importer un plugin communautaire
Pour cette partie, nous allons utiliser le plugin jwt-crafter.
Ce plugin ajoute la possibilité de générer un jeton JWT au sein même de Kong, éliminant ainsi le besoin d'un service en amont effectuant la génération du jeton.
Voici le plugin :
```
https://github.com/grongierisc/kong-plugin-jwt-crafter
```
Pour installer ce plugin, comme nous utilisons la version docker, nous devons compiler une nouvelle image qui intègre le plugin.
### 10.1.1. Compliez une nouvelle image Kong/IAM avec le plugin communautaire
1. Créez un dossier nommé iam à la racine de ce git.
2. Créez un dockerfile dans ce nouveau dossier
3. Créez un dossier nommé plugins
1. C'est ici que nous ajouterons tous nos plugins communautaires
4. Mettez à jour le fichier docker-compose pour activer le nouveau plug-in
Dans le dossier des plugins, git clonez notre plugin communautaire.
git clone https://github.com/grongierisc/kong-plugin-jwt-crafter
Le dockerfile doit ressembler à ceci :
```dockerfile
FROM intersystems/iam:1.5.0.9-4
USER root
COPY ./plugins /custom/plugins
RUN cd /custom/plugins/kong-plugin-jwt-crafter && luarocks make
USER kong
```
Que voyons-nous dans ce dockerfile ?
Pour installer simplement un plugin communautaire, nous devons nous rendre dans son dossier racine (où se trouve le rockspec) et appeler luarocks make. C'est tout. Vous avez installé le plugin.
Pour la partie docker-compose :
1. Modifiez la balise iam iamge
1. intersystems/iam:1.5.0.9-4 -> intersystems/iam-custom:1.5.0.9-4
2. Ajoutez un contexte de compilation
```yml
build:
context: iam
dockerfile: dockerfile
```
3. Activez le plugin dans les variables d'environnement
```yml
KONG_PLUGINS: 'bundled,jwt-crafter'
```
Maintenant, compilons notre nouvelle image iam :
docker-compose build iam
### 10.1.2. Essayez !
docker-compose up -d
Si vous allez dans plugin -> nouveau, en bas de la liste vous devriez voir le plugin jwt-crafter.

#### 10.1.2.1. Utilisez-le !
1. Créez un nouveau service :
Portail IAM
API Rest
# Créer un service
curl -i -X POST \
--url http://localhost:8001/services/ \
--data 'name=crud-persons' \
--data 'url=http://iris:52773/crud/persons/'
2. Créez une route
Portail IAM
API Rest
# Créer une route
curl -i -X POST \
--url http://localhost:8001/services/crud-persons/routes \
--data 'name=crud-route-jwt' \
--data 'paths=/crud/persons/*' \
--data 'strip_path=true'
3. Réutilisez notre authentification automatique
Portail IAM
API Rest
# Créer un plugin
curl -i -X POST \
--url http://localhost:8001/services/crud-persons/plugins \
--data 'name=request-transformer' \
--data 'config.add.headers=Authorization:Basic U3VwZXJVc2VyOlNZUw==' \
--data 'config.replace.headers=Authorization:Basic U3VwZXJVc2VyOlNZUw=='
Maintenant tout est prêt. La véritable utilisation de jwt-crafter.
```bash
# Ajouter acl à la route
curl -i -X POST http://localhost:8001/routes/crud-route-jwt/plugins \
--data "name=acl" \
--data "config.whitelist=test" \
--data "config.hide_groups_header=false"
# Créer le service
curl -i -X POST \
--url http://localhost:8001/services/ \
--data 'name=jwt-login' \
--data 'url=http://neverinvoked/'
# Créer une route
curl -i -X POST \
--url http://localhost:8001/services/jwt-login/routes \
--data 'name=jwt-login-route' \
--data 'paths=/jwt/log-in'
# Activer l'authentification de base pour le service
curl -i -X POST http://localhost:8001/routes/jwt-login-route/plugins \
--data "name=basic-auth" \
--data "config.hide_credentials=false"
# Activer l'authentification de base pour le service
curl -i -X POST http://localhost:8001/routes/jwt-login-route/plugins \
--data "name=jwt-crafter" \
--data "config.expires_in=86400"
# Ajouter un consommateur
curl -i -X POST \
--url http://localhost:8001/consumers/ \
--data "username=test"
# Ajouter un groupe consommateur
curl -i -X POST \
--url http://localhost:8001/consumers/test/acls \
--data "group=test"
# Ajouter des identifiants consommateur
curl -i -X POST http://localhost:8001/consumers/test/basic-auth \
--data "username=test" \
--data "password=test"
curl -i -X POST http://localhost:8001/consumers/test/jwt \
--data "key=test" \
--data "algorithm=HS256"
# Plugins JWT
curl -i -X POST http://localhost:8001/routes/crud-route-jwt/plugins \
--data "name=jwt"
```
Essayez !
```bash
# test:test est en base64
curl -H 'Authorization: basic dGVzdDp0ZXN0' localhost:8000/jwt/log-in
```
```bash
curl --location --request GET 'http://localhost:8000/crud/persons/all' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW0iOiJ0ZXN0Iiwic3ViIjoiODJiNjcwZDgtNmY2OC00NDE5LWJiMmMtMmYxZjMxNTViN2E2Iiwicm9sIjpbInRlc3QiXSwiZXhwIjoxNjE2MjUyMTIwLCJpc3MiOiJ0ZXN0In0.g2jFqe0hDPumy8_gG7J3nYsuZ8KUz9SgZOecdBDhfns'
```
## 10.2. Créer un nouveau plugin
Ce n'est pas l'endroit pour apprendre le lua.
Mais je vous donnerai quelques astuces comme la façon de redémarrer rapidement IAM pour tester notre nouveau développement.
### 10.2.1. Structure de fichiers
```
kong-plugin-helloworld
├── kong
│ └── plugins
│ └── helloworld
│ ├── handler.lua
│ └── schema.lua
└── kong-plugin-helloworld-0.1.0-1.rockspec
```
Par convention, les plugins kong doivent être préfixés par kong-plugin.
Dans notre exemple, le nom du plugin est helloworld.
Trois fichiers sont obligatoires :
* handler.lua : le cœur de votre plugin. Il s'agit d'une interface à mettre en œuvre, dans laquelle chaque fonction sera exécutée au moment souhaité dans le cycle de vie d'une demande/connexion.
* schema.lua : votre plugin doit probablement conserver une configuration saisie par l'utilisateur. Ce module contient le schéma de cette configuration et définit des règles sur celui-ci, afin que l'utilisateur ne puisse saisir que des valeurs de configuration valides.
* *.rockspec : Rockspec : un fichier de spécification de paquetage Un script Lua déclaratif, avec des règles sur la façon de compiler et d'empaqueter rocks *.rockspec - un fichier Lua contenant quelques tableaux.
#### 10.2.1.1. handler.lua
L'interface du plugin vous permet de remplacer l'une des méthodes suivantes dans votre fichier handler.lua pour mettre en œuvre une logique personnalisée à divers points d'entrée du cycle de vie de Kong :
| Nom de la fonction | Phase | Description |
| ------------------ | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| :init_worker() | init_worker | Exécuté au démarrage de chaque processus worker Nginx. |
| :certificate() | ssl_certificate | Exécuté pendant la phase de service du certificat SSL de la poignée de main SSL. |
| :rewrite() | rewrite | Exécuté pour chaque demande à sa réception d'un client en tant que gestionnaire de la phase de réécriture. NOTE : dans cette phase, ni le Service ni le Consommateur n'ont été identifiés, donc ce gestionnaire ne sera exécuté que si le plugin a été configuré comme un plugin global ! |
| :access() | access | Exécuté pour chaque demande d'un client et avant qu'elle ne soit transmise par proxy au service en amont. |
| :response() | access | Remplace à la fois header_filter() et body_filter(). Exécuté après la réception de la réponse complète du service en amont, mais avant d'en envoyer une partie au client. |
| :header_filter() | header_filter | Exécuté lorsque tous les octets d'en-tête de réponse ont été reçus du service en amont. |
| :body_filter() | body_filter | Exécuté pour chaque fragment du corps de la réponse reçu du service en amont. Comme la réponse est renvoyée au client en continu, elle peut dépasser la taille du tampon et être envoyée par morceaux. cette méthode peut donc être appelée plusieurs fois si la réponse est importante. Consultez la documentation de lua-nginx-module pour plus de détails. |
| :log() | journal | Exécuté lorsque le dernier octet de réponse a été envoyé au client. |
##### 10.2.1.1.1. Exemple
```lua
local BasePlugin = require "kong.plugins.base_plugin"
local HelloWorldHandler = BasePlugin:extend()
function HelloWorldHandler:new()
HelloWorldHandler.super.new(self, "helloworld")
end
function HelloWorldHandler:access(conf)
HelloWorldHandler.super.access(self)
if conf.say_hello then
ngx.log(ngx.ERR, "============ Hello World! ============")
ngx.header["Hello-World"] = "Hello World!!!"
else
ngx.log(ngx.ERR, "============ Bye World! ============")
ngx.header["Hello-World"] = "Bye World!!!"
end
end
return HelloWorldHandler
```
#### 10.2.1.2. schema.lua
Simplement le fichier de configuration vu dans le portail.
```lua
return {
no_consumer = true,
fields = {
say_hello = { type = "boolean", default = true },
say_hello_body = { type = "boolean", default = true }
}
}
```
#### 10.2.1.3. *.rockspec
```rockspec
package = "kong-plugin-helloworld" -- hint : renommer, doit correspondre à l'info dans le nom de fichier de ce rockspec !
-- comme convention ; tenez-vous en au préfixe : « kong-plugin- »
version = "0.1.0-1" -- indice : n'oubliez pas, il doit correspondre à l'info dans le nom de fichier de ce rockspec !
-- La version « 0.1.0 » est la version du code source, le « 1 » suivant est la version de ce rockspec.
-- à chaque fois que la version de la source change, le rockspec doit être réinitialisé à 1. La version rockspec est seulement
-- mise à jour (incrémentée) lorsque ce fichier change, mais la source reste la même.
-- TODO : C'est le nom à définir dans le paramètre « plugins » de la configuration Kong.
-- Ici, nous l'extrayons du nom du paquet.
local pluginName = package:match("^kong%-plugin%-(.+)$") -- "myPlugin"
supported_platforms = {"linux", "macosx"}
source = {
url = "https://github.com/grongierisc/iam-training",
branch = "master",
-- tag = "0.1.0"
-- hint: "tag" could be used to match tag in the repository
}
description = {
summary = "Ceci est une démo pour le plugin Kong",
homepage = "https://github.com/grongierisc/iam-training",
license = "Apache 2.0"
}
dependencies = {
"lua >= 5.1"
-- other dependencies should appear here
}
build = {
type = "builtin",
modules = {
["kong.plugins."..pluginName..".handler"] = "kong/plugins/"..pluginName.."/handler.lua",
["kong.plugins."..pluginName..".schema"] = "kong/plugins/"..pluginName.."/schema.lua",
}
}
```
### 10.2.2. Compilez-le
Nous ferons la même chose qu'ici : [11.1.1. Compilez une nouvelle image Kong/IAM avec le plugin communautaire](#1111-build-a-new-kongiam-docker-image-with-the-community-plugin)
Mais adapté à notre plugin :
Dockerfile :
```dockerfile
FROM intersystems/iam:1.5.0.9-4
USER root
COPY ./plugins /custom/plugins
RUN cd /custom/plugins/kong-plugin-jwt-crafter && luarocks make
RUN cd /custom/plugins/kong-plugin-helloworld && luarocks make
#USER kong #Rester root, nous verrons pourquoi plus tard
```
Activez le plugin dans les variables d'environnement
```yml
KONG_PLUGINS: 'bundled,jwt-crafter,helloworld'
```
Maintenant, compilons notre nouvelle image iam :
docker-compose build iam
Puis docker-compose up et testez-le.
### 10.2.3. Astuces
Pour exécuter le conteneur IAM en « mode débogage », pour l'arrêter/le redémarrer facilement, modifier le dockerfile pour ajouter/supprimer le plugin et ainsi de suite.
Vous pouvez arrêter le service iam :
docker-compose stop iam
Et lancez-le en mode exécution avec un shell :
docker-compose run -p 8000:8000 -p 8001:8001 -p 8002:8002 iam sh
Dans le conteneur :
./docker-entrypoint.sh kong
Bonne programmation :)
# 11. CI / CD

Nous sommes proches de la fin de cet article.
Pour finir, parlons de DevOps/CI/CD. L'objectif de ce chapitre est de vous donner quelques idées sur la manière d'implémenter/scripter ci/cd pour IAM/Kong.
Comme Kong est d'abord une API, l'idée est de scripter tous les appels rest et de jouer ensuite sur chaque environnement.
La façon la plus simple de scripter les appels Rest est avec postman et son meilleur ami newman (version en ligne de commande de postman).
## 11.1. Créer la collection Postman
Une chose pratique avec postman est sa capacité à exécuter un script avant et après un appel rest.
Nous utiliserons cette fonctionnalité dans la plupart des cas.
### 11.1.1. IAM est-il démarré ?
Notre premier script va vérifier si IAM est en place et fonctionne.

```javascript
var iam_url = pm.environment.get("iam_url");
var iam_config_port = pm.environment.get("iam_config_port");
var url = "http://" + iam_url + ":" + iam_config_port + "/";
SenReq(20);
async function SenReq(maxRequest) {
var next_request = "end request";
const result = await SendRequest(maxRequest);
console.log("result:",result);
if(result == -1)
{
console.error("IAM starting .... failed !!!!");
}
}
function SendRequest(maxRequest) {
return new Promise(resolve => {
pm.sendRequest(url,
function (err) {
if (err) {
if (maxRequest > 1) {
setTimeout(function () {}, 5000);
console.warn("IAM not started...retry..next retry in 5 sec");
SendRequest(maxRequest - 1);
} else {
console.error("IAM starting .... failed");
resolve(-1);
}
} else {
console.log("IAM starting .... ok");
resolve(1);
}
}
);
});
}
```
### 11.1.2. Supprimer les anciennes données
```javascript
var iam_url=pm.environment.get("iam_url");
var iam_config_port=pm.environment.get("iam_config_port");
pm.sendRequest("http://"+iam_url+":"+iam_config_port+"/plugins", function (err, res) {
if (err) {
console.log("ERROR : ",err);
}
else {
var body_json=res.json();
if(body_json.data)
{
for( i=0; i < body_json.data.length; i++)
{
// Example with a full fledged SDK Request
route_id = body_json.data[i].id;
const delete_route = {
url: "http://"+iam_url+":"+iam_config_port+"/plugins/" + route_id,
method: 'DELETE',
};
pm.sendRequest(delete_route, function(err, res){
console.log(err ? err : res);
});
}
}
}
});
```
Faites de même pour les routes, les services et les consommateurs.
Cet ordre est important car vous ne pouvez pas supprimer les services avec des routes.
### 11.1.3. Créer un service/route
Les routes dépendent des services. Pour ce type de cas, nous pouvons utiliser la fonction Test de postman pour récupérer les données :

Écran
Script
var id = pm.response.json().id;
var name = pm.response.json().name;
pm.globals.set("service_crud_id", id);
pm.globals.set("service_crud_name", name);
Ici, nous sauvegardons de la réponse l'ID et le nom des nouveaux services.
Ensuite, nous pouvons l'utiliser dans la prochaine création de route :
Écran
Script
service_crud_name = pm.globals.get("service_crud_name");
Ici, nous récupérons la variable globale « service_crud_name ».
Ensuite, utilisez-le dans l'appel réel.
Écran
Script
{
"paths": [
"/persons/*"
],
"protocols": [
"http"
],
"name": "crud-persons",
"strip_path": false,
"service": {
"name": "{{service_crud_name}}"
}
}
#### 11.1.3.1. Astuces
* le contenu peut être soit au format json, soit au format form-data
* form-data :

* json :

Une façon simple d'obtenir le format json, allez sur le portail du gestionnaire, affichez, copiez le json :

## 11.2. Exécutez-le avec newman
docker run --rm -v "`pwd`/ci/":"/etc/newman" \
--network="iam-training_default" \
-t postman/newman run "DevOps_IAM.postman_collection.json" \
--environment="DevOps_IAM.postman_environment.json"
Merci Guillaume! Quel article utile (j'ai pas trouvé de mot à la hauteur...)
A quand les traductions de la documentation, dans la documentation?
Je transmet ton article chez CFAO de ce pas!
Salut Fabien,
Nous n'allons pas traduire la documentation.
Mais tu vas voir de plus en plus d'article anglais traduit en français.
Annonce
Irène Mykhailova · Mai 11, 2022
Salut la communauté,
Nous sommes ravis d'inviter tous les développeurs au prochain webinaire de lancement du concours InterSystems Grand Prix 2022!
Nous partagerons les détails de notre méga concours Grand Prix Contest 2022 et décrirons comment vous pouvez gagner jusqu'à 22 000 $ en prix ! Contrairement à nos autres concours InterSystems Developer Community, ce concours vous permet d'utiliser n'importe quel élément de notre plateforme de données - IntegratedML, Native API, multi-modèle, Analytics et NLP, Open API and Interoperability, IKO etc. - dans votre projet.
Dans ce webinaire, nous parlerons des sujets attendus des participants et vous montrerons comment développer, créer et déployer des applications sur la plate-forme de données InterSystems IRIS.
Date et heure: lundi 9 mai à 11:00 EDT
Haut-parleurs: 🗣 @Alexander.Woodhead, InterSystems Technical Specialist🗣 @Robert.Kuszewski, InterSystems Product Manager🗣 @Jeffrey.Fried, InterSystems Director of Product Management🗣 @Dean.Andrews2971, InterSystems Head of Developer Relations🗣 @Evgeny.Shvarov, InterSystems Developer Ecosystem Manager
Nous serons heureux de vous parler lors de notre webinaire sur Zoom.
✅ Inscrivez-vous pour le coup d'envoi dès aujourd'hui !
Annonce
Irène Mykhailova · Mai 16, 2022
Salut les développeurs !
InterSystems Grand Prix réunit toutes les fonctionnalités clés des plateformes de données InterSystems !
Ainsi, nous vous invitons à utiliser les fonctionnalités suivantes et à collecter des bonus techniques supplémentaires qui vous aideront à gagner le prix !
Nous y voilà!
InterSystems FHIR - 5
IntegratedML - 4
Native API - 3
Interoperability - 3
Production EXtension(PEX) - 4
Embedded Python - 5
Adaptive Analytics (AtScale) Cubes usage - 4
Tableau, PowerBI, Logi usage - 3
InterSystems IRIS BI - 3
Docker container usage - 2
ZPM Package deployment - 2
Online Demo - 2
Unit Testing - 2
Premier article sur la communauté des développeurs - 2
Deuxième article sur la communauté des développeurs - 1
Code Quality pass - 1
Video sur YouTube - 3
InterSystems FHIR as a Service et IRIS For Health - 5 points
Nous invitons tous les développeurs à créer de nouvelles applications ou à tester des applications existantes à l'aide du service d'accélération InterSystems IRIS FHIR (FHIRaaS).Connectez-vous au portail, effectuez le déploiement et commencez à utiliser votre serveur InterSystems FHIR sur AWS dans votre candidature pour le concours de programmation.
Vous pouvez également créer une application FHIR à l'aide d'InterSystems IRIS for Health, version docker. Vous pouvez prendre le modèle IRIS-FHIR-Template qui prépare le serveur FHIR lors de la création de l'image Docker. La documentation de l'API FHIR 4.0.1 est disponible ici. Pour en savoir plus, consultez la documentation InterSystems IRIS for Health.
Utilisation d'IntegratedML - 4 points
1. Utilisez InterSystems IntegratedML dans votre solution AI/ML. Voici le modèle qui l'utilise.
InterSystems IntegratedML template
2. Outils d'importation de données :
Data Import Wizard
CSVGEN - CSV import
CSVGEN-UI - web UI pour CSVGEN
3. Documentation:
Using IntegratedML
4. Cours et vidéos en ligne :
Learn IntegratedML in InterSystems IRIS
Preparing Your Data for Machine Learning
Predictive Modeling with the Machine Learning Toolkit
IntegratedML Resource Guide
Getting Started with IntegratedML
Machine Learning with IntegratedML & Data Robot
Utilisation de l'InterSystems Native API - 3 points
Vous obtenez ce bonus si vous accédez aux données de votre application Full-Stack à l'aide de l'une des options de l'InterSystems Native API : .NET, Java, Python, Node.js. En savoir plus here.
Interoperability Productions avec BPL ou DTL - 3 points
L'une des principales caractéristiques d'Interoperability Productions de IRIS est un processus métier, qui pourrait être décrit par BPL (Business Process Language).
En savoir plus sur les Business Processes dans la documentation.
Business Rule est une approche no-code/low-code pour gérer la logique de traitement de la production d'interopérabilité. Dans InterSystems IRIS, vous pouvez créer une business rule que vous pouvez créer visuellement ou via la représentation ObjectScript.
Vous pouvez collecter la prime de Business Process/Business Rule bonus si vous créez et utilisez le processus métier ou la règle métier dans votre Interoperability Production.
Exemple de Business
En savoir plus sur les Business Rules dans la documentatio
Utilisation de Production EXtension (PEX) - 4 points
PEX est une extension Python, Java ou.NET de l'Interoperability Productions.
Vous obtenez ce bonus si vous utilisez PEX avec Python, JAVA ou .NET dans votre Interoperability Production.
PEX Demo.
En savoir plus sur PEX dans la documentation.
InterSystems IRIS dispose du module Python Pex qui offre la possibilité de développer des productions InterSystems Interoperability à partir de Python. Utilisez-le et collectez 3 points supplémentaires pour votre candidature. Il est également possible d'utiliser la roue alternative python.pex introduite par @Guillaume.Rongier7183.
Embedded Python - 4 points
Utilisez Embedded Python dans votre application et collectez 4 points supplémentaires. Vous aurez besoin d'au moins InterSystems IRIS 2021.2 pour cela.
Utilisation d'Adaptive Analytics (AtScale) Cubes - 4 points
InterSystems Adaptive Analytics offre la possibilité de créer et d'utiliser des cubes AtScale pour les solutions d'analyse.
Vous pouvez utiliser le serveur AtScale que nous avons configuré pour le concours (l'URL et les informations d'identification peuvent être collectées sur le Discord) pour utiliser des cubes ou en créer un nouveau et vous connecter à votre serveur IRIS via JDBC.
La couche de visualisation de votre solution Analytics avec AtScale peut être conçue avec Tableau, PowerBI, Excel ou Logi.
Documentation, documentation AtScal
Formation
Utilisation de Tableau, PowerBI, Logi - 3 points
Collectez 3 points pour la visualisation que vous avez réalisée avec Tableau, PowerBI ou Logi - 3 points chacun.
La visualisation peut se faire via un serveur IRIS BI direct ou via la connexion avec AtScale.
Logi est disponible pour le compte de la solution InterSystems Reports - vous pouvez télécharger le composeur sur InterSystems WRC. Une licence temporaire peut être collectée sur discord.
Documentation
Formation
InterSystems IRIS BI - 3 points
InterSystems IRIS Business Intelligence est une fonctionnalité d'IRIS qui vous donne la possibilité de créer des cubes BI et des pivots par rapport aux données persistantes dans IRIS et de fournir ensuite ces informations aux utilisateurs à l'aide de tableaux de bord interactifs.
Apprendre plus
Le modèle de base iris-analytics-template contient des exemples d'un cube IRIS BI, d'un pivot et d'un dashbord.
Voici l'ensemble des exemples de solutions IRIS BI :
Samples BI
Covid19 analytics
Analyze This
Game of Throne Analytics
Pivot Subscriptions
Error Globals Analytics
Creating InterSystems IRIS BI Solutions Using Docker & VSCode (video)
The Freedom of Visualization Choice: InterSystems BI (video)
InterSystems BI(DeepSee) Overview (online course)
InterSystems BI(DeepSee) Analyzer Basics (online course)
Utilisation du conteneur Docker - 2 points
L'application obtient un bonus "Conteneur Docker" si elle utilise InterSystems IRIS s'exécutant dans un conteneur Docker. Voici est le modèle le plus simple pour commencer.
Déploiement du package ZPM - 2 points
Vous pouvez percevoir le bonus si vous créez et publiez le package ZPM (InterSystems Package Manager) pour votre application Full-Stack afin qu'elle puisse être déployée avec :
zpm "install your-multi-model-solution"
commande sur IRIS avec le client ZPM installé.
Client ZPM. Documentation.
Démo en ligne de votre projet - 2 points
Collectez 2 points bonus supplémentaires si vous provisionnez votre projet dans le cloud en tant que démo en ligne. Vous pouvez le faire vous-même ou vous pouvez utiliser ce modèle - voici un Exemple. Voici la video sur la façon de l'utiliser.
Unit Testing - 2 points
Les applications qui ont des Unit Testing pour le code InterSystems IRIS recevront le bonus.
En savoir plus sur l'ObjectScript Unit Testing dans la Documentation et sur la Communauté des Développeurs.
Article sur la Communauté des Développeurs - 2 points
Publiez un article sur la Communauté des Développeurs qui décrit les fonctionnalités de votre projet et collectez 2 points pour l'article.
Deuxième article sur la Communauté des Développeurs - 1 point
Vous pouvez collecter un point bonus supplémentaire pour le deuxième article ou la traduction concernant l'application. Le 3ème et plus n'apportera pas plus de points mais toute l'attention sera à vous.
Passe de la qualité du code avec zéro bogue - 1 point
Incluez code quality Github action pour le contrôle statique du code et affichez 0 bugs pour ObjectScript.
Video sur YouTube - 3 points
Réalisez la vidéo Youtube qui montre votre produit en action et collectez 3 points bonus pour chacun.
La liste des bonus est susceptible d'être modifiée. Restez à l'écoute !
Annonce
Robert Bira · Juin 13, 2022
Un webinaire a été organisé le mardi 8 juin pour vous faire découvrir l'usage de Python dans InterSystems IRIS ® et InterSystems IRIS for Health™ version 2022.1.
Dans cette présentation technique, nous détaillons l'étendue du support dont bénéficient les développeurs Python™ en utilisant la plateforme de gestion de données InterSystems IRIS®, notamment :
- l'exécution de Python à l'intérieur du noyau de la base de données pour un accès rapide aux données et une interaction transparente avec ObjectScript. - Le SDK InterSystems IRIS Python, qui comprend - Une API native pour l'accès aux structures de données natives d'InterSystems IRIS pour une flexibilité ultime. - Un pilote DB-API, qui permet un accès transparent à InterSystems IRIS à partir d'applications conformes. - Une passerelle Python qui permet à InterSystems IRIS d'exécuter du code Python hors processus.
Ce webinaire est désormais disponible en replay
Article
Lorenzo Scalese · Juin 18, 2022
InterSystems API Management (IAM) - c'est une nouvelle fonctionnalité de la plate-forme de données InterSystems IRIS, qui vous permet de surveiller, de contrôler et de gérer le trafic vers et à partir des API basées sur le Web au sein de votre infrastructure informatique. Au cas où vous l'auriez manqué, voici le [lien vers l'annonce](https://community.intersystems.com/post/announcing-release-intersystems-api-manager). Et voici un article expliquant comment commencer à travailler avec [IAM](https://community.intersystems.com/post/introducing-intersystems-api-manager).
Dans cet article, nous allons utiliser InterSystems API Management pour assurer l'équilibrage de charge d'une API.
Dans notre cas, nous avons 2 instances InterSystems IRIS avec `/api/atelier` REST API que nous voulons publier pour nos clients.
Il y a de nombreuses raisons différentes pour lesquelles nous pourrions vouloir faire cela, par exemple :
* Équilibrage de la charge pour répartir la charge de travail entre les serveurs.
* Déploiement bleu-vert : nous avons deux serveurs, l'un "prod", l'autre "dev" et nous pouvons vouloir passer de l'un à l'autre.
* Déploiement canary: nous pourrions publier la nouvelle version sur un seul serveur et y transférer 1% des clients.
* Configuration de haute disponibilité
* etc.
Pourtant, les mesures que nous devons prendre sont assez similaires.
### **Conditions préalables**
* 2 instances InterSystems IRIS
* L'instance InterSystems API Managemen
### **Allons-y**
Voici ce que nous devons faire :
**1. Créer un flux ascendant.**
Un flux ascendant représente un nom d'hôte virtuel et peut être utilisé pour équilibrer la charge des demandes entrantes sur plusieurs services (cibles). Par exemple, un flux ascendant nommé `service.v1.xyz` recevrait des demandes pour un service dont l'hôte est `service.v1.xyz`. Les requêtes pour ce service seront envoyées par procuration aux cibles définies dans l'amont.
Un flux ascendant comprend également un vérificateur de santé, qui peut activer et désactiver les cibles en fonction de leur capacité ou de leur incapacité à répondre aux demandes.
Pour commencer :
* Ouvrir le portail d'administration IAM
* Allez dans Workspaces
* Choisissez votre espace de travail
* Ouvrez les flux ascendants (Upstreams)
* Cliquez sur le bouton "New Upstream"
Après avoir cliqué sur le bouton "New Upstream", vous verrez apparaître un formulaire où vous pourrez saisir quelques informations de base sur le flux ascendant (il y a beaucoup d'autres propriétés) :
Saisissez _nom_ - il s'agit d'un nom d'hôte virtuel que nos services utiliseraient. Il n'est pas lié aux enregistrements DNS. Je recommande de lui attribuer une valeur inexistante pour éviter toute confusion. Si vous voulez en savoir plus sur les autres propriétés, [consultez la documentation](https://docs.intersystems.com/irislatest/csp/docbook/apimgr/1.0.x/admin-api.html#upstream-object). Sur la capture d'écran, vous pouvez voir que j'ai nommé de manière imaginative le nouveau flux ascendant comme `myupstream`.
**2. Créer des cibles.**
Les cibles sont des serveurs backend qui exécutent les requêtes et renvoient les résultats au client. Allez dans Upstreams et cliquez sur le nom du flux ascendant que vous venez de créer (et NON sur le bouton de mise à jour) :
Vous verrez toutes les cibles existantes (aucune jusqu'à présent) et le bouton "Nouvelle cible". Cliquez dessus :
Ensuite, définissez une cible dans le nouveau formulaire. Seuls deux paramètres sont disponibles :
* cible - hôte et port du serveur backend
* Pondération - priorité relative donnée à ce serveur (plus de pondération - plus de demandes sont envoyées à cette cible)
J'ai ajouté deux cibles :
**3. Créer un service**
A présent que nous avons notre flux ascendant, nous devons lui envoyer des requêtes. Pour cela, nous utilisons Service.
Les entités Service, comme leur nom l'indique, sont des abstractions de chacun de vos services en amont. Des exemples de services seraient un microservice de transformation des données,
une API de facturation, etc.
Nous allons créer un service ciblant notre instance IRIS, allez dans Services et cliquez sur le bouton "Nouveau service" :
Définissez les valeurs suivantes :
| champ | valeur | description |
| -------- | ------------ | -------------------------------- |
| nom | myservice | nom logique de ce service |
| hôte | myupstream | nom en amont |
| chemin | /api/atelier | chemin d'accès associé à une racine que nous voulons servir |
| protocole | http | les protocoles que nous voulons supporter |
Conservez les valeurs par défaut pour tout le reste (y compris le port : 80).
Après avoir créé le service, vous le verrez dans une liste de services. Copiez l'ID du service quelque part, nous en aurons besoin plus tard.
**4. Créer un itinéraire**
Les Itinéraires définissent les règles permettant de répondre aux demandes des clients. Chaque Itinéraire est associé à un Service, et un Service peut avoir plusieurs Itinéraires associés. Chaque demande correspondant à un Itinéraire donné sera transmise par proxy au Service qui lui est associé.
La combinaison des Itinéraires et des Services (et la séparation des préoccupations entre eux) offre un mécanisme de routage puissant avec lequel il est possible de définir des points d'entrée très fins dans l'IAM menant à différents services en amont de votre infrastructure.
Maintenant, créons un itinéraire. Allez dans le menu Routes et appuyez sur le bouton "New Route".
Définissez les valeurs dans le formulaire de création de l'Itinéraire :
champ
valeur
description
lien
/api/atelier
lien racine que nous voulons servir
protocole
http
les protocoles que nous voulons supporter
service.id
guid de 3
valeur de l'identifiant du service (guide de l'étape précédente)
Et c'est fini !
Envoyez une requête à `http://localhost:8000/api/atelier/` (notez la barre oblique à la fin) et elle sera servie par l'un de nos deux backends.
### **Conclusion**
IAM offre une infrastructure de gestion des API hautement personnalisable, permettant aux développeurs et aux administrateurs de prendre le contrôle de leurs API.
### **Liens**
* [Documentation](https://docs.intersystems.com/irislatest/csp/docbook/apimgr/index.html)
* [IAM Announcement](https://community.intersystems.com/post/announcing-release-intersystems-api-manager)
* [Working with IAM article](https://community.intersystems.com/post/introducing-intersystems-api-manager)
### **Question**
Quelle fonctionnalité souhaitez-vous voir configurée avec IAM ?
Annonce
Irène Mykhailova · Juil 17, 2022
Salut la communauté,
Nous sommes ravis d'annoncer que les rencontres de développeurs InterSystems sont enfin de retour en personne !
Le premier meetup lié au Python aura lieu le 21 juillet à 18h00 à Democracy Brewing, Boston, MA. Il y aura 2-3 courtes présentations liées au Python, des questions-réponses, des sessions de réseautage ainsi que de la bière gratuite avec des collations et des visites de la brasserie.
AGENDA:
18h00 à 18h20 Première tournée de boissons et d'amuse-gueule
18h20-18h40 "Run Your Python Code & Your Data Together" par @Robert.Kuszewski, chef de produit - Developer Experience chez InterSystems.
18h40-19h00 "Enterprise Application Integration in Python" par @Michael.Breen, Senior Support Specialist chez InterSystems
19h00-19h20 : Open Mic et discussion sur les projets : Vous travaillez sur quelque chose de passionnant ? Vous ressentez le besoin de le partager ? Envoyez-nous un message et nous pourrons vous ajouter à la liste des intervenants !
19h20 - 20h30 Visite d'une brasserie et réseautage
Ne manquez pas cette excellente occasion de discuter de nouvelles solutions en compagnie de pairs partageant les mêmes idées. Le réseautage est fortement recommandé ! :)
>> INSCRIVEZ-VOUS ICI <<
⏱ Heure : Le 21 juillet, de 18 h à 20 h 30.
📍Place: Democracy Brewing35 Temple Place in Downtown Crossing, Boston, MAhttps://www.democracybrewing.com/