При использовании аутентификации по базе данных IAM срок действия пароля истекает примерно через 15 минут. Поэтому в идеале мне нужно обновить соединение с базой данных до истечения срока действия пароля. Я устанавливаю таймер при первой инициализации базы данных и запрашиваю прошедшее время по каждому запросу. Как я могу обновить пароль соединения до истечения срока действия пароля? Или как я могу уничтожить старый объект базы данных и при необходимости обновить объект?
Сообщение об ошибке: «Аутентификация PAM не удалась для пользователя iam_user».
Код для получения IAM пароля:
const pgp = require('pg-promise')();
const AWS = require('aws-sdk');
const ca =
'-----BEGIN CERTIFICATE-----\nMIID9DCCAtyg...
...wZfTUU=\n-----END CERTIFICATE-----\n';
const signer = new AWS.RDS.Signer({
region: process.env.REGION,
username: process.env.DATABASE_USER,
hostname: process.env.DATABASE_HOST,
port: parseInt(`${process.env.DATABASE_PORT}`, 10),
});
module.exports = pgp({
host: process.env.DATABASE_HOST,
port: process.env.DATABASE_PORT,
database: process.env.DATABASE_NAME,
user: process.env.DATABASE_USER,
ssl: { ca },
dialectOptions: { ssl: { require: true } },
password: signer.getAuthToken(),
});
Вставка объекта db в graphql:
const db = require('../db/init');
server.use(
mount(
'/graphql',
graphqlHTTP( () => ({
schema: schema,
context: { startTime: Date.now(), db },
graphiql: true
})),
),
);
Использование базы данных в резолверах.
Я мог запросить время создания соединения с базой данных. Есть ли возможность обновить пароль при необходимости? Или как лучше всего уничтожить старый объект базы данных и создать новый объект базы данных?
const resolvers = {
Query: {
Post: (root, args, {db}) => {
console.log(args.id);
console.log(db.$config.options)
const postQuery = new PQ({
text:
'SELECT post_id as id FROM tbl_post where post_id = $1',
values: [parseInt(args.id, 10)],
});
return db.one(postQuery).catch((err) => console.log(err));
}
}
1 ответ
Как предложил Виталий-т, я использовал функцию пароля. Чтобы избежать увеличения задержки, эта функция обновляет пароль только каждые 15 минут. Если пул постоянно используется с интервалами менее 10 секунд, то соединение остается открытым без вызова функции пароля вообще. По моим тестам новых подключений к БД вообще не открывается.
const ca = '-----BEGIN CERTIFICATE-----\9DC...-----END CERTIFICATE-----\n';
const signer = new AWS.RDS.Signer({
region: process.env.REGION,
username: process.env.DATABASE_USER,
hostname: process.env.DATABASE_HOST,
port: parseInt(`${process.env.DATABASE_PORT}`, 10),
});
const SIGNER = { time: 0, password: undefined};
function getSignedPassword() {
const time = Date.now();
if (time - SIGNER.time > 900000) {
SIGNER.time = new Date().getTime();
SIGNER.password = signer.getAuthToken();
return SIGNER.password;
}
return SIGNER.password;
}
module.exports = pgp({
host: process.env.DATABASE_HOST,
port: process.env.DATABASE_PORT,
database: process.env.DATABASE_NAME,
user: process.env.DATABASE_USER,
ssl: { ca },
password: getSignedPassword,
});
Похожие вопросы
Новые вопросы
aws-sdk
Комплект для разработки программного обеспечения для использования с API Amazon Web Services.