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}
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件までの取得という文言は見つからなかった。
ちなみに同じようなことが他のアクション及びサービスにも起こるのかどうかは検証できてない。