Ошибка доступа при подключении приложения Node.js к экземпляру MySQL RDS

Вопрос или проблема

Я работаю над приложением на Node.js, используя mysql2/promise для подключения к экземпляру MySQL Amazon RDS. Несмотря на правильные учетные данные и сетевые настройки, я сталкиваюсь с ошибкой доступа. Вот детали:

Сообщение об ошибке:

Error: Access denied for user 'db_user'@'my.ip.address' (using password: YES)

Код подключения:

const mysql = require('mysql2/promise');
const connection = await mysql.createConnection({
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME,
  port: process.env.DB_PORT
});

Переменные окружения:

DB_HOST=mydatabase.example.com
DB_PORT=3306
DB_USER=db_user
DB_PASSWORD=hidden_password
DB_NAME=my_database

Группы безопасности: настроены для разрешения моего локального IP-адреса.

Я проверил учетные данные и права пользователя, но все равно сталкиваюсь с этой проблемой. Есть ли какие-либо идеи или предложения?

Немного больше информации о том, что я пробовал:

GRANT ALL PRIVILEGES ON admin.* TO 'db_user'@'my.ip.address';
FLUSH PRIVILEGES;

При подключении к экземпляру RDS локально через workbench.

Это привело к Access Denied

Это всего лишь пример одного из моих маршрутов Express:

const express = require('express');
const dotenv = require('dotenv');
const path = require('path');
const mysql = require('mysql2/promise');
const router = express.Router();
const bcrypt = require('bcryptjs');
const authenticateToken = require('./middleware/authenticateToken.cjs');

const env = process.env.NODE_ENV || 'development';
dotenv.config({ path: path.resolve(__dirname, '../.env') });

var pool = mysql.createPool({
    host: process.env.DB_HOST,
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_NAME,
    port: process.env.DB_PORT
  });

// Обработка установления соединения
pool.getConnection((err, connection) => {
    if (err) {
      console.error('Ошибка подключения к базе данных:', err);
      return;
    }
    console.log('Соединение с базой данных установлено');
    connection.release(); // Освобождаем соединение обратно в пул
  });

router.get('/get-locations', authenticateToken, async (req, res) => {
  try {
    const [results] = await pool.query('SELECT * FROM location');
    res.status(200).json(results);
  } catch (error) {
    console.error('Ошибка при получении локаций:', error);
    res.status(500).send('Ошибка при получении локаций');
  }
});

Ответ или решение

Ошибка "Access denied" при подключении Node.js приложения к экземпляру MySQL RDS может быть вызвана несколькими причинами. Ниже приведены шаги и рекомендации для устранения этой проблемы.

1. Проверьте данные для подключения

Убедитесь, что вы используете правильные учетные данные (имя пользователя и пароль) в переменных окружения. Попробуйте протестировать их с помощью клиентского приложения (например, MySQL Workbench), подключаясь к тому же хосту и базе данных.

2. Привилегии пользователя

Убедитесь, что у пользователя db_user есть необходимые привилегии для подключения с указанного IP-адреса. Попробуйте выполнить следующие команды:

GRANT ALL PRIVILEGES ON my_database.* TO 'db_user'@'my.ip.address';
FLUSH PRIVILEGES;

3. Проверьте IP-адрес

При настройке правил в группе безопасности (Security Group) убедитесь, что указанный вами IP-адрес верный. Обычно рекомендуется использовать текущее значение вашего WAN IP-адреса. Вы можете использовать сервисы, такие как whatismyip.com, чтобы получить ваш внешний IP-адрес.

4. Проверка группы безопасности

Убедитесь, что ваша группа безопасности (Security Group), настроенная на вашем RDS, позволяет входящие подключения на порт 3306 с вашего IP-адреса. Для этого выполните следующие действия:

  1. Зайдите в AWS Management Console.
  2. Перейдите в раздел RDS и выберите ваш экземпляр.
  3. Найдите группу безопасности, к которой привязан ваш экземпляр, и откройте её.
  4. Убедитесь, что есть правило, разрешающее входящие подключения с вашего IP-адреса на порт 3306.

5. Проверка настроек RDS

Также проверьте следующие настройки вашего RDS:

  • Параметры VPC: Убедитесь, что экземпляр RDS находится в публичной подсети, если вы пытаетесь подключиться с вашего локального устройства.
  • Public Accessibility: Убедитесь, что ваш экземпляр RDS настроен как "Publicly Accessible", если вы хотите подключаться к нему с локального компьютера.

6. Проверка кода

Посмотрите на ваше подключение:

const pool = mysql.createPool({
    host: process.env.DB_HOST,
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_NAME,
    port: process.env.DB_PORT
});

Убедитесь, что значения переменных окружения корректно загружаются. Вы можете временно добавить вывод этих переменных в консоль для проверки. Например:

console.log('DB_HOST:', process.env.DB_HOST);
console.log('DB_USER:', process.env.DB_USER);
console.log('DB_PASSWORD:', process.env.DB_PASSWORD);
console.log('DB_NAME:', process.env.DB_NAME);
console.log('DB_PORT:', process.env.DB_PORT);

7. Логи подключения

Если ошибка сохраняется, проверьте логи RDS и приложение Node.js для получения дополнительной информации об ошибках подключения.

Заключение

Следуя этим шагам, вы сможете диагностировать и устранить проблему "Access denied". Если проблема сохраняется, возможно, вам стоит обратиться в техническую поддержку AWS для более детального анализа проблемы.

Оцените материал
Добавить комментарий

Капча загружается...