Amazon Cognito のユーザプールのバックアップおよびリストアを行う方法について調査した内容を備忘録として残しておく
方法
以下の2つの方法が考えられる
- Cognito User Profiles Export リファレンスアーキテクチャ
- Lambda でユーザプールの一覧を取得して csv で出力して S3 に保存する
※リストアはユーザ CSV インポート機能で行う
実際のコード
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 のバックアップが完了しました。"}`,
};
};