Cognitoを使えば、簡単にかつ激安で認証認可機能を利用することができますよね。Cognitoには、ユーザ管理のユーザープール機能とID管理のフェデレーティッドアイデンティティ機能があります。フェデレーティッドアイデンティティでランダムな文字列として発行されたIDはIDプールに蓄積されるのですが、これが今回の問題点です。サービスの戦略として、ログインしなくても一部機能は利用できるようにする場合があると思います。Cognitoでは、認証されたロールと認証されていないロールに対してIAMレベルで権限を変えることができます。”認証されていない ID に対してアクセスを有効にする”をチェックすると、アプリを利用する度に(一定期間かもしれません)、IDプール内のIDが増えていくのです。そこで、無駄に増えたIDをCLIを使って削除する方法についてお伝えします。

IDのエクスポート
まずは、IDプールに蓄積された全IDをエクスポートします。CLIでは一度に最大60までしかエクスポートできないので、複数回実行する必要があります。この後に行うIDの削除では、エクスポートしたIDを利用するので、ファイルに出力しておきましょう。IDプールIDはID「プールの編集」から確認できます
aws cognito-identity list-identities --identity-pool-id "ap-northeast-1:xxxxx-xxxxx-xxxx-xxxx-xxxxxxx" --max-results 60 >id1.txt
max-results以上のIDが存在する場合は出力されたファイルにnext-tokenが記述されています
{ "IdentityPoolId": "ap-northeast-1:xxxxx-xxxxx-xxxx-xxxx-xxxxxxx", "NextToken": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "Identities": [ { "LastModifiedDate": 1534330971.034, "CreationDate": 1534330971.034, "IdentityId": "ap-northeast-1:e924b6f8-a4b3-418e-8f8e-048d30d4829c" } ] }
next-tokenを下記のように付与して、next-tokenの記述が出力されなくなるまで呼び出します。
aws cognito-identity list-identities --identity-pool-id "ap-northeast-1:xxxxx-xxxxx-xxxx-xxxx-xxxxxxx" --max-results 60 --next-token "xxxxxxxxxxxxxxxxxxxxxxxxxxxx" >id2.txt
エクスポートされたIDファイルの加工
エクスポートされたIDは下記のような形式でファイルに保存されています。IDには、サインアップ後、確認済みのIDと未確認のIDと、そもそもサインアップしていないものがあります。ユーザープール側の状態とあわせて、サインアップ済みのものは残しておきます。
CLIのオプションパラメータ用に、抽出したIDをスペース区切りとして保存しておきましょう。
"Identities": [ { "LastModifiedDate": 1534330971.034, "CreationDate": 1534330971.034, "IdentityId": "ap-northeast-1:xxxxx-xxxxx-xxxx-xxxx-xxxxxxx" }, { "Logins": [ "DISABLED", "ap-northeast-1" ], "LastModifiedDate": 1552210719.871, "CreationDate": 1552209582.615, "IdentityId": "ap-northeast-1:xxxxx-xxxxx-xxxx-xxxx-xxxxxxx" }, { "Logins": [ "cognito-idp.ap-northeast-1.amazonaws.com/xxxxxxxxxxxxxxxxxxxx" ], "LastModifiedDate": 1518824687.308, "CreationDate": 1518824687.274, "IdentityId": "ap-northeast-1:xxxxx-xxxxx-xxxx-xxxx-xxxxxxx" } ]
IDの削除
準備したIDの一覧を下記にように渡して実行します。
aws cognito-identity delete-identities --identity-ids-to-delete "ap-northeast-1:xxxxx-xxxxx-xxxx-xxxx-xxxxxxx" "ap-northeast-1:xxxxx-xxxxx-xxxx-xxxx-xxxxxxx"
実行し、このような出力が得られると成功です!
{ "UnprocessedIdentityIds": [] }
IDが溜まって、コンソールからの削除が大変になった時には試してみてください