🚀

Amazon Cognito から CSV でユーザーリストを取得する

2023/11/02に公開

はじめに

業務にて、AWS Cognito のユーザープールからユーザーの一覧を取得する必要があり、
自作のスクリプトを作成してみました。

張りぼてに近い完成度ですが、どなたかのお役に立てれば大変嬉しいです!👍

サンプルリポジトリ

以下の github にソースコードがございますので、こちらからクローンください。

https://github.com/TaroYamada1997/cognito-user-export

Node.js のインストール

初めに、今回作成したスクリプトは JavaScript で書かれていますので、
Node.js をインストールし、npm も一緒にインストールしてくださいませ。

https://nodejs.org/en

Node.js がインストールされているか分からない方は、
PowerShell や ターミナル等のコマンドラインで以下を実行してください。
バージョンが表示されればOKです。

$ node -v

私は 18 系のバージョンを利用しています。

パッケージのインストール

ソースコードをクローンし、プロジェクト配下で以下のコマンドを実行します。

$ npm install

各種パッケージがインストールされますので、確認してみてください。

.env の準備

.env ファイルを作成し、必要な情報を入れます。
ご自身のリージョン、アクセスキー等シビアな情報を入れておきます。

AWS_REGION = ap-northeast-1
USER_POOL_ID = ap-northeast-1_xxxxxx
AWS_ACCESS_KEY_ID = xxxxxxx
AWS_AWS_SECRET_ACCESS_KEY = xxxxxxx

Cognito のカスタム属性等の追加

カスタム属性を出力したい場合、
サンプルのコードの以下の記述箇所を修正ください。

例えば、custom:userId等の属性があれば、キーと値を必要に応じて変更頂ければと思います。

// 初回のリクエスト
(async () => {
const users = await paginateUsers({ UserPoolId: userPoolId });
if (users) {
	const userData = users.map(user => {
	const emailAttribute = user.Attributes.find(attr => attr.Name === 'email');
	const emailVerified = user.Attributes.find(attr => attr.Name === 'email_verified');

	return {
		email: emailAttribute ? emailAttribute.Value : '',
		email_verified: emailVerified ? emailVerified.Value : false,

		// カスタム属性等があれば追加
	};
});

	csv
	.write(userData, { headers: true })
	.pipe(writeStream);
}
})();

スクリプトの実行

以下のコマンドを実行し、CSV ファイルを作成します。

$ node script.js

最終的に以下のように表示されていればOKです。
プロジェクト直下に user-list.csv ファイルが完成しているはずです🎉

CSVファイルのエクスポートが完了しました。

Cognito への CSV ファイルのインポート

以下の公式ドキュメントにインポート手順について記載があります。
簡単にインポートをすることができますので、こちらも試してみる価値ありです。
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-pools-using-import-tool.html

おわりに

自作スクリプトを作ってみて、楽しみながら実装できました。
Cognito のユーザーのエクスポートについて書かれている記事をあまり見かけなかったので、
もしかしたら、本記事が誰かのお役に立てる日が来るかもしれません。

今回は Cognito に限った話ですが、
Auth0 等の他の認証サービスもエクスポート、インポートは簡単にできるものなのでしょうか。。

色々調べつつアウトプットしていければと思います。

コラボスタイル Developers

Discussion