- Рівень володіння
- Експерт

Вступ
AWS Cognito — це потужний безсерверний продукт для керування користувачами. Але жоден продукт чи сервіс не є на 100% завершеним, і, на жаль, AWS Cognito — не виняток.
Філософія Amazon — 80% — диктує, що при досягненні цього порогу «готовності» керований сервіс публікується для ранніх користувачів. Відтоді він вдосконалюється на основі відгуків ентузіастів, переважно через GitHub та власну спільноту AWS re:Post, одна скарга за раз.
AWS Cognito, безсумнівно, зазнає постійних змін. Це дуже зрілий продукт, але деякі речі все ще відстають, тому розчаровані розробники підписуються на довгі гілки обговорень на GitHub, сподіваючись, що їх скоро вирішать. Відповідно, деякі операції все ще вимагають засукати рукави та стряхнути пил із ваших навичок роботи з командним рядком. Масове оновлення користувачів AWS Cognito — одна з таких операцій.

Проблема
Якщо ви керуєте своїми пулами користувачів за допомогою AWS Cognito, ви швидко помітите, що цей сервіс значно менш «гнучкий», ніж інші керовані сервіси AWS. Деякі з цих обмежень зроблені навмисно, наприклад, неможливість легко перенести користувачів з одного пулу в інший через те, що паролі не зберігаються. Однак деякі є побічним продуктом того, що команда розробників не встигає за запитами на нові функції.
Наприклад, немає способу масово редагувати атрибути користувачів. Це стосується всіх інструментів: AWS CLI, AWS Web Console, AWS CloudFormation, AWS SAM, AWS SDK, AWS CDK тощо. Якщо ви хочете впорядкувати великі обсяги атрибутів користувачів, на момент написання статті вам доведеться трохи погіківствувати.

Рішення
Примітка: AWS Cognito не дозволяє змінювати глобальні налаштування атрибутів на рівні пулу. Те, що ми можемо змінити — це атрибути на рівні користувача. Якщо вам потрібно змінити глобальні налаштування пулу користувачів, у вас не буде іншого вибору, окрім як створити новий пул та реалізувати механізм поступової міграції користувачів для перенесення їх зі старого пулу в новий. Зверніться до нас, якщо вам потрібна допомога з цим.
Крок 1: Встановлення та налаштування AWS CLI
Оскільки веб-консоль AWS не дозволяє це зробити, ми звернемося до AWS CLI. Тому першою передумовою є встановлення та належне налаштування цього основного інструменту.
Встановлення та налаштування командного рядка AWS виходить за межі цієї статті, тому якщо ви ще його не налаштували, дотримуйтесь офіційних інструкцій. Будь ласка, переконайтеся, що ви встановлюєте останню версію — v2 на момент написання.
Крок 2: Встановлення утиліти командного рядка jq
Вам також знадобиться утиліта командного рядка jq — найзручніший спосіб роботи з JSON-даними у вашому улюбленому середовищі оболонки. Дізнатися більше про неї можна на її офіційному вебсайті.
За допомогою Homebrew виконайте наступне:
brew install jq && jq --versionКрок був успішним, якщо консоль відобразила версію пакета, подібну до виводу нижче.
jq-1.7.1
Крок 3: Створення та виконання команди
Оскільки ми працюємо з AWS Cognito, відповідна команда CLI буде cognito-idp. Щоб дізнатися більше про використання CLI-інтерфейсу цього сервісу, виконайте aws cognito-idp help. Зробивши це, ви знову переконаєтесь, що жодна з команд не може впливати на кількох користувачів одночасно.
Ми будемо виконувати команду admin-delete-user-attributes для ілюстрації. Проте ви можете екстраполювати цей підхід на інші операції, які інакше дозволені лише для одного користувача. Знову ж таки, ви можете виконати наступну команду, щоб дізнатися більше про деталі.
aws cognito-idp admin-delete-user-attributes helpПерше, що ми хочемо зробити — це отримати всі імена користувачів з нашого пулу.
aws cognito-idp list-users --user-pool-id yourUserPoolID --no-paginate --profile yourCustomAWSProfileУ цьому прикладі ми не фільтруємо жодних користувачів, але якщо вам це потрібно, використовуйте прапорець --filter. Дізнатися більше можна, виконавши
aws cognito-idp list-users helpВи вже знаєте порядок дій.
Ми також хочемо отримати всі результати одночасно, без пагінації — звідси прапорець --no-paginate.
Результатом наведеного вище блоку коду буде JSON-файл, відформатований приблизно так:
{
"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"
}
]
}Вміст Attributes може відрізнятися, але структура буде подібною.
Тепер нам потрібно обробити цей вивід за допомогою jq.
jq -r '.Users.[].Username'Наведений вище фрагмент обходить попередньо визначену деревоподібну структуру даних JSON, яку повертає aws cognito-idp list-users. Ми починаємо з кореня ., розпаковуємо атрибут Users, значенням якого є масив [], і нарешті отримуємо значення атрибута Username для кожного елемента цього списку. Прапорець -r просто вказує jq, що значення слід повертати без початкових і кінцевих лапок. Якщо ви не використаєте цей прапорець, лапки будуть вважатися частиною значення для пошуку на наступному кроці, що не дасть жодних результатів. Тому цей прапорець тут необхідний.
Об'єднаємо наведені вище операції, щоб отримати чистий список імен користувачів, по одному на рядок:
aws cognito-idp list-users --user-pool-id yourUserPoolID --no-paginate --profile yourCustomAWSProfile | jq -r '.Users.[].Username'Символ | передає (або «пайпить») вивід першої команди як вхідні дані другої команди. Таким чином, вивід запиту AWS CLI Cognito буде оброблений за допомогою jq.
Тепер давайте ітеруємо по цьому чистому списку імен користувачів для виконання операцій над окремими користувачами:
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Як бачите, на цьому етапі можливості необмежені. Для завершення прикладу давайте видалимо атрибут:
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 Вуаля, ваш пул користувачів впорядковано. Майже всі CRUD-операції на рівні користувача можна автоматизувати таким чином. І тепер ви маєте все необхідне для цього.
Висновок
AWS Cognito — це потужне, гнучко налаштовуване рішення для керування користувачами з можливістю розширення. Воно повинно покривати більшість ваших потреб в автентифікації. Проте деякі базові операції, які ви очікували б побачити, відсутні або за задумом, або через те, що функція все ще в беклозі команди, наприклад, автоматичне перенаправлення після верифікації реєстрації через посилання. Що ж, буває.
Хоча досвідчені користувачі, ймовірно, зіткнуться з обмеженнями, у більшості випадків існують обхідні шляхи, навіть якщо вони вимагають «аварійного виходу», подібного до описаного вище, де вам доводиться «вирватися» з набору інструментів AWS і пропустити дані через зовнішній обробник, перш ніж «залити» їх назад, щоб досягти бажаного ефекту. І, якщо це хоч якось втішає, це робить усіх нас кращими інженерами.
