Massa-update van gebruikers in AWS Cognito
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.
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.
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.