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

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

Cognito IdP の ListUserPoolClients を1回呼び出した際に返されるアプリクライアントの数が AWS CLI と AWS SDK for JavaScript で異なる(サービスやアクションに限らない話の可能性あり)

環境

% aws --version
aws-cli/2.0.28 Python/3.7.4 Darwin/19.6.0 botocore/2.0.0dev3

% node --version
v14.7.0

% yarn --version
1.22.10

% yarn list --depth=0 | grep aws-sdk
├─ aws-sdk@2.934.0

準備

下記の Shell Script で特定のユーザープールに200個のアプリクライアントを作成する。

for ((i=0 ; i<200 ; i++))
do
name="test-${i}"
aws cognito-idp create-user-pool-client \
  --user-pool-id ${USER_POOL_ID} \
  --client-name ${name}
done

AWS CLI で取得した場合

AWS CLI でアプリクライアントの一覧を取得すると、1回のコマンドで200個取得することができた。

% aws cognito-idp list-user-pool-clients --user-pool-id ${USER_POOL_ID}

AWS CLI のドキュメントを確認すると、

docs.aws.amazon.com

Multiple API calls may be issued in order to retrieve the entire data set of results.

全取得するために内部で複数回 API を叩いているよ的なことが書かれている。

AWS SDK for JavaScript で取得した場合

こちらは1回の呼び出しで60個しか取得できなかった。ということで、全取得できるスクリプトが下記になる。NextToken を取り回す。

import * as CognitoIdp from 'aws-sdk/clients/cognitoidentityserviceprovider';

const COGNITO_API_VERSION = '2016-04-18';
const REGION = 'ap-northeast-1';
const COGNITO_USER_POOL_ID = 'xxx';

const cognitoIdpClient = new CognitoIdp({
  apiVersion: COGNITO_API_VERSION,
  region: REGION,
});

(async () => {
  let appClientList: CognitoIdp.UserPoolClientDescription[] = [];
  let nextToken = undefined;
  do {
    const params: CognitoIdp.ListUserPoolClientsRequest = {
      UserPoolId: COGNITO_USER_POOL_ID,
      NextToken: nextToken,
    };

    const result = await cognitoIdpClient.listUserPoolClients(params).promise();
    if (result.UserPoolClients) {
      appClientList = appClientList.concat(result.UserPoolClients);
    }
    nextToken = result.NextToken;
  } while (nextToken);

  console.log(appClientList);
})();

ドキュメントの方はというと、60件までの取得という文言は見つからなかった。

docs.aws.amazon.com

ちなみに同じようなことが他のアクション及びサービスにも起こるのかどうかは検証できてない。