ダメ元エンジニアのお勉強おメモ

ほとんど自分用のメモです。AWS をよく触ります。Web アプリとか作ります。Raspberry Pi も好きです。

Cognito IdP でユーザーのリストを単に取得してもグループの情報は含まれない

内容

listUsers ではグループの情報が一切取得できない。代わりに listGroups でグループ名を取得してから listUsersInGroup でグループごとにユーザーのリストを取得 & 良い感じに結合するしかなさそう。

下記を参考にして、

stackoverflow.com

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 って使いづらいなあ。。