Как подключиться через Node.js к кластеру DocDB с локального тестового компьютера?

Я пытаюсь перейти с MongoDB на DocumentDB только для того, чтобы держать все под одной крышей, и хочу протестировать свой код на образце кластера DocDB. Я использую Node.js + Express.js для своего бэкэнда. Тем не менее, это оказалось довольно сложно из-за мысленных прыжков и препятствий, через которые я прохожу.

Инструкции по подключению из-за пределов VPC, содержащиеся в документации AWS DocumentDB, оказались крайне бесполезными.

На самом деле их можно даже считать опасными:

Чтобы подключиться к кластеру Amazon DocumentDB из-за пределов Amazon VPC, используйте следующую команду.

mongo --sslAllowInvalidHostnames --ssl --sslCAFile global-bundle.pem --username <yourUsername> --password <yourPassword> 

Я могу себе представить, как можно использовать это для командной строки оболочки MongoDB. Однако я пытаюсь подключиться программно. (Или есть способ сделать это через CLI mongosh?)

sslAllowInvalidHostnames похоже, что он используется для предотвращения отклонения localhost из-за несоответствия IP-хостам, как показано ниже, когда он принудительно отключен:

MongoServerSelectionError: Hostname/IP does not match certificate's altnames: Host: localhost. is not in the cert's altnames: DNS:sldkfjl.ksdjlfksdjlf.us-east-2.docdb.amazonaws.com, DNS:sldkfjl.cluster-sldkfjlsdk.us-east-2.docdb.amazonaws.com, DNS:sldkfjl.cluster-ro-sldkfjlsdk.us-east-2.docdb.amazonaws.com

Это то, на чем я застрял. Я также использую пакет connect-mongo, чтобы иметь менеджер сеансов для компонента входа в систему моего бэкэнда, но он не позволяет мне включить опцию tslAllowInvalidHostnames. Если я это сделаю, я получаю следующую ошибку:

MongoServerError: Authorization failure

Подключение к DocDB не составило проблем: если я не использовал пакет и пытался что-то загрузить, все было в порядке. Есть ли способ протестировать DocDB с включенным пакетом каким-либо другим способом? Система переадресации портов работает по плану.

По сути, система тестирования выглядит следующим образом:

localhost-frontend --- localhost-backend --- EC2 --- DocDB

Причина, по которой мне нужен connect-mongo, заключается в том, что я хочу использовать трекер сеансов входа в систему для express.js. Я использовал connect-mongo следующим образом, чтобы настроить (точнее, не настраивать, поскольку это приводит к ошибке):

const MongoStore = require('connect-mongo');
var store;
 store = MongoStore.create({
    mongoUrl: uri,
    dbName: 'server',
    collectionName: 'sessions',
    secret: ss,
    stringify: false,
    ttl: fifteen_min,
    mongoOptions: { 
      tlsCAFile: process.env.TLSCAFILE,
      directConnection: true, 
      tls: true,
    }
  });

Есть ли альтернативы, которые не вызывали бы таких проблем?

Примечания:

  1. Мне действительно удалось подключиться к указанным выше настройкам независимо от проблемного пакета. Например, приведенная ниже команда подключения работает отлично. Я планирую удалить опцию tslAllowInvalidHostnames из производственной сборки и надеюсь, что когда я это сделаю, все будет в порядке.
const client = new MongoClient(uri, {
  tlsCAFile: process.env.TLSCAFILE, //Specify the DocDB; cert
  tlsAllowInvalidCertificates: mode !== "prod",
  tlsAllowInvalidHostnames: mode !== "prod",
  directConnection: true,
  auth: {
      username: user,
      password: pass
  }
});

client.connect().then((_) => console.info('Connection successful.'));

🤔 А знаете ли вы, что...
MongoDB предоставляет инструменты для мониторинга и администрирования, такие как MongoDB Compass...


67
1

Ответ:

Решено

Оказывается, ошибка авторизации вообще не связана с tslAllowInvalidHostnames. Я просто забыл пользователя и пароль в поле аутентификации. Как только я это сделал, проблема, похоже, решена.

Внесение следующих изменений ниже устранило мою проблему. На упаковке не указано, что mongoOptions все-таки можно использовать.

const MongoStore = require('connect-mongo');
var store;
 store = MongoStore.create({
    mongoUrl: uri,
    dbName: 'server',
    collectionName: 'sessions',
    secret: ss,
    stringify: false,
    ttl: fifteen_min,
    mongoOptions: { 
      tlsCAFile: process.env.TLSCAFILE,
      directConnection: true, 
      tls: true,
      tlsAllowInvalidCertificates: mode !== "prod",
      tlsAllowInvalidHostnames: mode !== "prod",
      auth: {
          username: user,
          password: pass
      }
    }
  });