Как обновить соединение базы данных для аутентификации iam - PullRequest
1 голос
/ 01 ноября 2019

При использовании аутентификации базы данных 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 Ответ

1 голос
/ 03 ноября 2019

Как предложил vitaly-t, я использовал функцию пароля. Чтобы избежать задержки, эта функция обновляет пароль только каждые 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,
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...