Я пытаюсь перейти с 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,
}
});
Есть ли альтернативы, которые не вызывали бы таких проблем?
Примечания:
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...
Оказывается, ошибка авторизации вообще не связана с 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
}
}
});