Cognito IdP でユーザーのリストを単に取得してもグループの情報は含まれない
内容
listUsers
ではグループの情報が一切取得できない。代わりに listGroups
でグループ名を取得してから listUsersInGroup
でグループごとにユーザーのリストを取得 & 良い感じに結合するしかなさそう。
下記を参考にして、
TypeScript 版に書き換えるとこんな感じ。内容はグループごとユーザー名を表示するスクリプト。
import * as CognitoIdp from 'aws-sdk/clients/cognitoidentityserviceprovider'; const COGNITO_USER_POOL_ID = 'xxx'; const CognitoIdpClient = new CognitoIdp({ apiVersion: '2016-04-18', region: 'ap-northeast-1', }); (async () => { const params = { UserPoolId: COGNITO_USER_POOL_ID, }; const result = await CognitoIdpClient.listGroups(params).promise(); if (!result.Groups) { throw new Error(); } const groupNameList = result.Groups.filter((group) => group.GroupName).map( (group) => group.GroupName!, ); groupNameList.forEach(async (groupName) => { const params = { GroupName: groupName, UserPoolId: COGNITO_USER_POOL_ID, }; const result = await CognitoIdpClient.listUsersInGroup(params).promise(); if (!result.Users) { return; } console.log(`${groupName} has ${result.Users.length} users`); result.Users.forEach((user) => { if (!user.Username) { return; } console.log(user.Username); }); }); })()
とはいえ、これだとグループに属していないユーザーが取得できない。あと、複数のグループに属するユーザーの取り扱いも気にする必要がある。うーん、Cognito って使いづらいなあ。。