Amazon Cognito のユーザプールのバックアップおよびリストアを行う方法について調査した内容を備忘録として残しておく

方法

以下の2つの方法が考えられる

実際のコード

const { stringify } = require("csv-stringify/sync");

module.exports = async (params) => {
    const csvString = stringify(params, {
        header: true,
        quoted_string: false
    })

    return csvString;
};
const { CognitoIdentityProvider } = require("@aws-sdk/client-cognito-identity-provider");
const cognito = new CognitoIdentityProvider();

module.exports = async (param) => {
    let cognitoUsers = new Array();
    let cognitoData;
    try {
        let params = {
            UserPoolId: process.env.USER_POOL_ID,
        };
        let paginationToken = "";
        while (paginationToken !== undefined) {
            cognitoData = await cognito.listUsers(params);
            paginationToken = cognitoData.PaginationToken;
            params.PaginationToken = paginationToken;
            if (cognitoData.Users.length > 0) {
                cognitoData.Users.forEach((user) => {
                    // ① を参照
                    let userAttributes = {};
                    userAttributes["email"] = (user["Attributes"].find(attr => attr["Name"] === "email") || {})["Value"] || "";
                    userAttributes["email_verified"] = (user["Attributes"].find(attr => attr["Name"] === "email_verified") || {})["Value"];
                    userAttributes["cognito:mfa_enabled"] = "FALSE";
                    userAttributes["cognito:username"] = userAttributes["email"];

                    cognitoUsers.push(userAttributes);
                });
            } else {
                console.error("登録ユーザーが存在しません。");
                return cognitoUsers;
            }
        }
    } catch (error) {
        console.error(error);
        return cognitoUsers;
    }

    return cognitoUsers;
};

※① CSV ファイルヘッダーのダウンロード (AWS CLI)で必要な項目を取得して設定する

const { S3Client, PutObjectCommand } = require("@aws-sdk/client-s3");
const convertCsvString = require("./convertCsvString");
const getCognitoUsers = require("./getCognitoUsers");

exports.handler = async (event) => {
    let statusCode = 200;
    const headers = {
        "Access-Control-Allow-Origin": "*",
    };
    let cognitoUsers = await getCognitoUsers()

    if (cognitoUsers.length === 0) {
        return {
            isBase64Encoded: false,
            statusCode: 404,
            headers: headers,
            multiValueHeaders: {},
            body: `{"message" : "登録ユーザーが存在しません。"}`,
        };
    }

    const csvString = await convertCsvString(cognitoUsers);

    const client = new S3Client({
        region: process.env.AWS_REGION
    });

    const input = {
        Bucket: process.env.BUCKET,
        Key: "{任意の S3 フォルダパス}/backup_user_pool.csv",
        Body: csvString
    };

    const command = new PutObjectCommand(input)
    statusCode = await client.send(command)

    return {
        isBase64Encoded: false,
        statusCode: statusCode,
        headers: headers,
        multiValueHeaders: {},
        body: `{"message" : "Cognito User Pool のバックアップが完了しました。"}`,
    };
};