Тайм-аут при подключении к DocumentDB из Lambda

#node.js #mongodb #amazon-web-services #aws-lambda #aws-documentdb

#node.js #mongodb #amazon-веб-сервисы #aws-lambda #aws-documentdb

Вопрос:

Я могу успешно подключиться к кластеру (на данный момент 1 экземпляр) с консоли Cloud9, используя оболочку mongo, однако потратил впустую часы, пытаясь подключиться к нему из лямбда-функции.

Настройка:

  • Оба кластера и lambda находятся в одном и том же VPC (по умолчанию)
  • Включен протокол TLS
  • Кластер находится в группе безопасности DemoDocDB, которая имеет входящие правила для 27017 для двух групп безопасности: cloud9 и DefaultSG
  • Lambda находится в VPC по умолчанию, а также в группе безопасности DefaultSG

Код:

  • config.js
 module.exports = {
    CONNECTION_STRING: 'mongodb://<user>:<pwd>@xxx.us-east-1.docdb.amazonaws.com:27017',
    SSL_CERTIFICATE: returnCerts(), // SSL Cert
    DB_NAME: 'documentdb', // Database name
    COLLECTION_NAME: 'events' // Tablename;
}

function returnCerts() {
    // Trick to avoid filesystem read of https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem
    return `-----BEGIN CERTIFICATE-----bla blah blah`
}
  
  • index.js
 const {CONNECTION_STRING, SSL_CERTIFICATE, DB_NAME, COLLECTION_NAME} = require('./config');
const MongoClient = require('mongodb').MongoClient;

let client = null;

exports.handler = (event, context, callback) => {
    
    client = MongoClient.connect(CONNECTION_STRING, 
    { 
      sslValidate: true,
      sslCA:SSL_CERTIFICATE,
      useNewUrlParser: true
    },
    function(err, client) {
        console.log('connection callback invoked')
        
        if(err){
            console.log(err)
        }    })              
    //callback();
    return {
        statusCode: 200,
        body: JSON.stringify({"message":"hey"})
    };
};
  
  • Другое: Nodejs 12.x, mongodb 3.6.2
  • Ошибка:
 START RequestId: 5e135853-063b-4d5a-8a21-9a29d15c8750 Version: $LATEST
2020-11-01T02:21:43.912Z    5e135853-063b-4d5a-8a21-9a29d15c8750    ERROR   (node:9) DeprecationWarning: current Server Discovery and Monitoring engine is deprecated, and will be removed in a future version. To use the new Server Discover and Monitoring engine, pass option { useUnifiedTopology: true } to the MongoClient constructor.
2020-11-01T02:21:54.053Z    5e135853-063b-4d5a-8a21-9a29d15c8750    INFO    connection callback invoked
2020-11-01T02:21:54.091Z    5e135853-063b-4d5a-8a21-9a29d15c8750    INFO    MongoNetworkError: failed to connect to server [docdb-2020-10-31-23-57-52.cluster-cgzg3t2i3zpn.us-east-1.docdb.amazonaws.com:27017] on first connect [MongoNetworkTimeoutError: connection 0 to docdb-2020-10-31-23-57-52.cluster-cgzg3t2i3zpn.us-east-1.docdb.amazonaws.com:27017 timed out
    at Socket.<anonymous> (/var/task/LambdaDBTest/node_modules/mongodb/lib/core/connection/connection.js:421:7)
    at Object.onceWrapper (events.js:421:28)
    at Socket.emit (events.js:315:20)
    at Socket._onTimeout (net.js:482:8)
    at listOnTimeout (internal/timers.js:549:17)
    at processTimers (internal/timers.js:492:7) {
  [Symbol(beforeHandshake)]: true
}]
    at Pool.<anonymous> (/var/task/LambdaDBTest/node_modules/mongodb/lib/core/topologies/server.js:438:11)
    at Pool.emit (events.js:315:20)
    at /var/task/LambdaDBTest/node_modules/mongodb/lib/core/connection/pool.js:562:14
    at /var/task/LambdaDBTest/node_modules/mongodb/lib/core/connection/pool.js:995:11
    at callback (/var/task/LambdaDBTest/node_modules/mongodb/lib/core/connection/connect.js:75:5)
    at /var/task/LambdaDBTest/node_modules/mongodb/lib/core/connection/connect.js:101:9
    at _callback (/var/task/LambdaDBTest/node_modules/mongodb/lib/core/connection/connection.js:329:7)
    at Connection.errorHandler (/var/task/LambdaDBTest/node_modules/mongodb/lib/core/connection/connection.js:344:7)
    at Object.onceWrapper (events.js:422:26)
    at Connection.emit (events.js:315:20)
  

Комментарии:

1. Вы подключаетесь к общедоступной конечной точке вашего кластера? Если это так, у lambda в VPC по умолчанию не будет доступа в Интернет, что объясняет ваш тайм-аут.

2. Подключение к единственной конечной точке, указанной в деталях кластера (предполагаю, что это общедоступная?). Кроме того, DefaultSG имеет разрешения на входящий трафик из DemoDocDB

3. Проблема специфична для lambda? Если вы раскручиваете экземпляр с использованием того же SG, что и lambda, работает ли соединение?

4. Ну, я просто попытался сделать то же самое с Python, и это сработало почти сразу. Т.Е. моя конфигурация кажется правильной, и вместо этого проблема может быть в драйвере MongoClient. Итак, собираемся отказаться от javascript и переключиться на Python

5. Спасибо, что дали мне знать. Вы можете ответить на свой собственный вопрос, для дальнейшего использования для других:-)

Ответ №1:

Недавно у меня была аналогичная проблема с таймаутом при подключении к кластеру DocumentDB с включенным TLS, когда я не указал MongoClient использовать SSL… У меня были установлены параметры sslValidate и sslCA, но не был установлен параметр SSL.

Вы должны либо добавить ssl: true в свои MongClient.connect параметры, либо добавить ssl=true в строку запроса URL-адреса подключения. Не похоже (из фрагментов кода), что вы тоже используете?