Mettre à jour les utilisateurs AWS Cognito en masse
Introduction
AWS Cognito est un puissant produit de gestion des utilisateurs sans serveur. Cependant, aucun produit ou service n'est jamais complet à 100 %, et, malheureusement, AWS Cognito ne fait pas exception.
La philosophie des 80 % d'Amazon dicte qu'une fois ce seuil de "préparation" atteint, le service géré est publié pour les premiers adopteurs. Par la suite, il sera amélioré en fonction des retours des passionnés, principalement à travers GitHub et la communauté red'AWS, une plainte à la fois.
AWS Cognito subit sans aucun doute des changements progressifs. C'est un produit très mature, mais certaines choses ne sont pas encore complètement à jour, ce qui pousse les développeurs frustrés à s'abonner à des fils de discussion GitHub longs, espérant qu'ils seront bientôt résolus. En conséquence, certaines opérations nécessitent encore de retrousser ses manches et de ressortir ses compétences en ligne de commande. La mise à jour des utilisateurs AWS Cognito en masse est l'une d'entre elles.
Le Problème
Si vous gérez vos groupes d'utilisateurs avec AWS Cognito, vous constaterez rapidement que ce service est beaucoup moins "malléable" que d'autres services AWS gérés. Certaines de ces limitations sont délibérées, comme le fait qu'il est impossible de migrer facilement des utilisateurs d'un groupe à un autre en raison du non-stockage des mots de passe. Cependant, d'autres sont le résultat du fait que l'équipe de développement n'a pas suivi les demandes de fonctionnalités.
Par exemple, il n'existe aucun moyen d'éditer les attributs des utilisateurs en masse. C'est le cas dans tous les domaines : AWS CLI, Console Web AWS, AWS CloudFormation, AWS SAM, AWS SDK, AWS CDK, etc. Si vous souhaitez modifier de grandes quantités d'attributs d'utilisateurs, il vous faudra devenir un peu geek au moment de l'écriture.
La Solution
Note : AWS Cognito ne permet pas de modifier les paramètres d'attributs globaux au niveau du groupe d'utilisateurs. Ce que nous pouvons modifier, ce sont ces attributs au niveau de chaque utilisateur. Si vous devez changer les paramètres globaux de votre groupe d'utilisateurs, vous n'aurez d'autre choix que de créer un nouveau groupe et de mettre en place un mécanisme de migration progressive des utilisateurs pour les transférer du vieux groupe vers le nouveau. N'hésitez pas à nous contacter si vous avez besoin d'aide pour le faire.
Étape 1 : Installer et Configurer l'AWS CLI
Puisque la console web d’AWS ne permet pas d’effectuer ces opérations, nous allons recourir à l’AWS CLI. Par conséquent, la première étape est d’installer et de configurer correctement cet outil essentiel.
L’installation et la configuration de l’outil en ligne de commande d’AWS ne sont pas couvertes par cet article. Si vous n’avez pas encore configuré l’AWS CLI, suivez les instructions officielles pour le faire. Assurez-vous de télécharger la version la plus récente, la version 2, au moment de la rédaction.
Étape 2 : Installer l'Utilitaire en Ligne de Commande jq
Vous aurez également besoin de l'utilitaire en ligne de commande jq, qui est le moyen le plus pratique de traiter les données JSON dans votre environnement shell préféré. Vous pouvez en apprendre davantage sur cet outil en visitant son site officiel.
Pour installer jq à l'aide de Homebrew sur macOS, exécutez la commande suivante dans votre terminal :
brew install jq && jq --version
L'étape est réussie si la console affiche une version du package similaire à celle-ci :
jq-1.7.1
Étape 3 : Construire et Exécuter la Commande
Puisque nous travaillons avec AWS Cognito, la commande CLI associée sera cognito-idp. Pour en savoir plus sur l'utilisation de l'interface CLI de ce service, exécutez la commande suivante:
aws cognito-idp help
Cela vous permettra de découvrir que les commandes disponibles ne peuvent pas affecter plusieurs utilisateurs en une seule fois.
Pour illustrer ce point, nous utiliserons la commande admin-delete-user-attributes. Bien que cette commande soit utilisée ici à titre d'exemple, vous pouvez appliquer cette approche à d'autres opérations qui sont normalement autorisées uniquement pour un utilisateur à la fois. Pour obtenir plus de détails sur cette commande spécifique et les options disponibles, vous pouvez exécuter la commande suivante:
aws cognito-idp admin-delete-user-attributes help
La première chose que nous voulons faire est de récupérer tous les noms d'utilisateur de notre groupe.
aws cognito-idp list-users --user-pool-id yourUserPoolID --no-paginate --profile yourCustomAWSProfile
Dans cet exemple, nous ne filtrons aucun utilisateur, mais si vous en avez besoin, utilisez l'option --filter. Vous pouvez en apprendre davantage à son sujet en exécutant :
aws cognito-idp list-users help
Vous connaissez la procédure.
Nous souhaitons également obtenir tous les résultats simultanément, sans pagination. Pour cela, utilisez l'option --no-paginate:
Le résultat de la commande ci-dessus renverra un fichier JSON formaté comme ceci:
{
"Users": [
{
"Username": "some-username-or-uuid",
"Attributes": [
{
"Name": "sub",
"Value": "uuid"
},
{
"Name": "email_verified",
"Value": "true"
},
{
"Name": "custom:yourCustomAttribute",
"Value": "some-value"
},
{
"Name": "email",
"Value": "test@test.com"
}
],
"UserCreateDate": "2024-02-14T00:30:59.508000+08:00",
"UserLastModifiedDate": "2024-02-14T00:31:19.059000+08:00",
"Enabled": true,
"UserStatus": "CONFIRMED"
}
]
}
Le contenu des Attributes peut varier, mais la structure sera similaire.
jq -r '.Users.[].Username'
L'extrait ci-dessus parcourt la structure de données JSON prédéfinie retournée par aws cognito-idp list-users. Nous commençons à la racine . et décompactons l'attribut Users, dont la valeur est un tableau [], puis nous récupérons la valeur de l'attribut Username pour chaque élément de cette liste. L'option -r indique simplement à jq qu'il doit retourner la valeur sans les guillemets de début et de fin. Si vous n'utilisez pas cette option, les guillemets seront considérés comme faisant partie de la valeur à rechercher à l'étape suivante, ce qui ne donnera aucun résultat. Ainsi, cette option est essentielle ici.
Combinons les opérations ci-dessus pour obtenir une liste de noms d'utilisateur purs, un par ligne:
aws cognito-idp list-users --user-pool-id yourUserPoolID --no-paginate --profile yourCustomAWSProfile | jq -r '.Users.[].Username'
Le caractère | passe (ou "transmet") la sortie de la première commande en entrée de la deuxième commande. Ainsi, la sortie de la requête AWS CLI Cognito sera analysée par jq.
Passons maintenant en revue cette liste propre de noms d'utilisateur pour effectuer des opérations sur un utilisateur à la fois:
for username in $(aws cognito-idp list-users --user-pool-id yourUserPoolID --no-paginate --profile yourCustomAWSProfile | jq -r '.Users.[].Username'); do SOME VALUABLE WORK HERE; done
Comme vous pouvez le voir, les possibilités sont infinies à ce stade. Pour compléter l'exemple, supprimons un attribut:
for username in $(aws cognito-idp list-users --user-pool-id yourUserPoolID --no-paginate --profile yourCustomAWSProfile | jq -r '.Users.[].Username'); do aws cognito-idp admin-delete-user-attributes --user-pool-id yourUserPoolID --username $username --user-attribute-names custom:yourCustomUserAttributeToDelete --profile yourCustomAWSProfile; done
Voilà, votre groupe d'utilisateurs est désormais nettoyé. Presque toutes les opérations CRUD au niveau des utilisateurs peuvent être automatisées de cette manière. Vous êtes maintenant prêt à le faire.
Conclusion
AWS Cognito est une solution de gestion d'utilisateurs puissante et hautement personnalisable, avec un potentiel d'extensibilité. Elle devrait couvrir la plupart de vos besoins en matière d'authentification. Cependant, certaines opérations de base que vous pourriez attendre ne sont pas présentes, soit par conception, soit parce que la fonctionnalité est encore dans la liste des tâches de l'équipe, comme la redirection automatique après la vérification d'inscription via un lien. Eh bien.
Bien que les utilisateurs avancés soient susceptibles de rencontrer des limitations, il existe généralement des solutions de contournement, même si elles nécessitent une "issue de secours", comme celle décrite ci-dessus, où vous devez "sortir" de l'écosystème AWS et passer par un processus externe avant de "réintroduire" les données pour obtenir l'effet souhaité. Et si cela peut être une consolation, cela nous rend tous de meilleurs ingénieurs.