Massa-update van gebruikers in AWS Cognito


Massa-update van gebruikers in AWS Cognito

queue

Inleiding

AWS Cognito is een krachtig serverloos gebruikersbeheersproduct. Maar geen enkel product of dienst is ooit 100% compleet, en helaas is AWS Cognito daar geen uitzondering op.

Amazon's filosofie van 80% houdt in dat, zodra deze drempel van "gereedheid" is bereikt, de beheerde dienst wordt gepubliceerd voor vroege adopters. Vanaf dat moment wordt het verbeterd op basis van feedback van enthousiastelingen, voornamelijk via GitHub en AWS's eigen re:Post, één klacht tegelijk.

AWS Cognito ondergaat ongetwijfeld voortdurende veranderingen. Het is een zeer volwassen product, maar sommige dingen zijn nog steeds niet up-to-date, waardoor gefrustreerde ontwikkelaars zich abonneren op langdurige GitHub-discussies in de hoop dat deze problemen binnenkort worden opgelost. Als gevolg hiervan vereisen sommige bewerkingen nog steeds dat je je mouwen opstroopt en je vaardigheden met de opdrachtregel opfrist. Het bulkgewijs bijwerken van AWS Cognito-gebruikers is daar een van.

cognito-logo

Het probleem

Als je je gebruikerspools beheert met AWS Cognito, zul je snel merken dat deze service veel minder "buigzaam" is dan andere beheerde AWS-diensten. Sommige van deze beperkingen zijn opzettelijk, zoals het niet gemakkelijk kunnen migreren van gebruikers van de ene pool naar de andere omdat wachtwoorden niet worden opgeslagen. Andere beperkingen zijn een bijproduct van het feit dat het ontwikkelingsteam niet snel genoeg op verzoeken om nieuwe functies heeft gereageerd.

Bijvoorbeeld, er is geen manier om gebruikersattributen in bulk te bewerken. Dit geldt voor alle tools en interfaces: AWS CLI, AWS Web Console, AWS CloudFormation, AWS SAM, AWS SDK, AWS CDK, enzovoort. Als je grote hoeveelheden gebruikersattributen wilt bijwerken, moet je, op het moment van schrijven, een beetje geeky worden.

cognito-dashboard

De oplossing

Let op: AWS Cognito staat niet toe om globale attribuutinstellingen op poolniveau te wijzigen. Wat we wél kunnen wijzigen, zijn deze attributen op gebruikersniveau. Als je de globale instellingen van je gebruikerspool wilt aanpassen, heb je geen andere keuze dan een nieuwe pool te maken en een geleidelijk migratiemechanisme te implementeren om gebruikers van de oude pool naar de nieuwe pool te verplaatsen. Neem contact met ons op als je hulp nodig hebt bij dit proces.

Stap 1: Installeer en Configureer AWS CLI

Omdat de AWS-webconsole dit niet toestaat, zullen we terugvallen op AWS CLI. Daarom is de eerste vereiste het installeren en correct configureren van deze fundamentele tool.

De installatie en configuratie van de AWS CLI vallen buiten de reikwijdte van dit artikel, dus als je het nog niet hebt ingesteld, volg dan de officiële instructies om dit te doen. Zorg ervoor dat je de nieuwste versie, v2, installeert op het moment van schrijven.

Stap 2: Installeer de jq Opdrachtregelhulpmiddel

Je hebt ook de opdrachtregeltool jq nodig, wat de meest comfortabele manier is om met JSON-gegevens in je favoriete shellomgeving te werken. Je kunt er meer over leren op de officiële website van jq.

Als je Homebrew gebruikt, kun je jq installeren door de volgende opdracht uit te voeren:

brew install jq && jq --version

De stap was succesvol als de console een versie van het pakket weergeeft die vergelijkbaar is met de onderstaande uitvoer:

jq-1.7.1

Stap 3: Bouw en Voer de Opdracht uit

Aangezien we werken met AWS Cognito, zal de bijbehorende CLI-opdracht cognito-idp zijn. Om meer te leren over het gebruik van de CLI-interface voor deze service, voer je de volgende opdracht uit:

aws cognito-idp help

Je zult opnieuw merken dat geen van de opdrachten meerdere gebruikers tegelijk kan beïnvloeden. We zullen de opdracht admin-delete-user-attributes uitvoeren om dit punt te illustreren. Je kunt echter dezelfde benadering extrapoleren naar andere bewerkingen die normaal gesproken alleen voor één gebruiker zijn toegestaan. Voer de volgende opdracht uit om meer te leren over de specificaties:

aws cognito-idp admin-delete-user-attributes help

Unknown NodeHet eerste wat we willen doen, is alle gebruikersnamen uit onze gebruikerspool ophalen.

aws cognito-idp list-users --user-pool-id yourUserPoolID --no-paginate --profile yourCustomAWSProfile

In dit voorbeeld filteren we geen gebruikers uit, maar als je dat nodig hebt, gebruik dan de --filter-vlag. Je kunt er meer over leren door de volgende opdracht uit te voeren:

aws cognito-idp list-users help

Je weet hoe het werkt.

We willen ook alle resultaten tegelijkertijd, zonder paginering—vandaar de --no-paginate-vlag.

Het resultaat van de bovenstaande codeblok zou een JSON-bestand opleveren dat er ongeveer als volgt uitziet:

{ "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" } ] }

De inhoud van Attributes kan variëren, maar de structuur zal vergelijkbaar zijn.

Nu moeten we deze uitvoer verwerken met jq.

jq -r '.Users.[].Username'

De bovenstaande snippet doorloopt de vooraf gedefinieerde JSON-boomstructuur die wordt geretourneerd door aws cognito-idp list-users. We beginnen bij de root . , pakken het Users-attribuut uit, waarvan de waarde een array [] is, en halen uiteindelijk de waarde van het Username-attribuut op voor elk item in deze lijst. De vlag -r geeft simpelweg aan aan jq dat het de waarde zonder aanhalingstekens aan het begin en het einde moet retourneren. Als je deze vlag niet gebruikt, worden de aanhalingstekens als onderdeel van de waarde beschouwd die je in de volgende stap zoekt, wat geen resultaten oplevert. Deze vlag is dus essentieel.

Laten we de bovenstaande bewerkingen combineren om een lijst van puur gebruikersnamen te verkrijgen, één per regel:

aws cognito-idp list-users --user-pool-id yourUserPoolID --no-paginate --profile yourCustomAWSProfile | jq -r '.Users.[].Username'

Het |-teken (of "pipe") geeft de uitvoer van de eerste opdracht door als invoer voor de tweede opdracht. Dus, de uitvoer van de AWS CLI Cognito-aanroep wordt door jq verwerkt.

Laten we nu deze schone lijst van gebruikersnamen doorlopen om bewerkingen voor elke individuele gebruiker uit te voeren:

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

Zoals je kunt zien, zijn de mogelijkheden op dit punt vrijwel onbeperkt. Om het voorbeeld te voltooien, laten we een attribuut verwijderen:

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à, je gebruikerspool is aangepast. Bijna alle CRUD-bewerkingen op gebruikersniveau kunnen op deze manier worden geautomatiseerd. En nu ben je klaar om dit te doen.

Conclusie

AWS Cognito is een krachtig, hoogst aanpasbaar gebruikersbeheersysteem met ruimte voor uitbreidbaarheid. Het zou in staat moeten zijn om de meeste van je authenticatiebehoeften te dekken. Toch ontbreken sommige basisoperaties die je zou verwachten, hetzij door ontwerp, hetzij omdat de functie nog in de backlog van het team staat, zoals een automatische omleiding na verificatie via een aanmeldlink. Ach ja.

Hoewel ervaren gebruikers waarschijnlijk tegen beperkingen zullen aanlopen, zijn er in de meeste gevallen werkarounds beschikbaar, zelfs als deze een "escape hatch" vereisen, zoals hierboven beschreven. Dit betekent dat je uit de AWS-toolset moet "breken" en de gegevens via een extern hulpmiddel moet verwerken voordat je ze weer in de AWS-omgeving "giet" om het gewenste resultaat te bereiken. En, als dat enige troost biedt, maakt het ons allemaal betere ingenieurs.


Contact

Hauptquartier
Tone Singleton SPR
6, Rue Henri Werriestr.
1090 Brussels
Belgium
Tone Singleton Ptd Ltd
60 Paya Lebar Road #07-54
Paya Lebar Square
409051 Singapore