2017-11-08 7 views
0

クラウドウォッチイベントルールを使用してラムダを暖かく保つためにmongodbに接続する際に問題が発生しました。また、serverless-plugin-warmup 。なぜこれが起こっているのかについて誰でも知っていますか?また、自分のデータベースにIPをホワイトリストに登録し、ラムダ機能にElastic IPを使用します。クラウドがイベントルールによってラムダが別のIPを使用するのを監視できますか?DB接続が利用できないクラウドウォッチイベントルールを使用したラムダ

{"error":{"name":"MongoError","message":"no connection available"}}

私は、データベースがコード

const mongoose = require('mongoose'); 

mongoose.Promise = global.Promise; 
let cachedDB = null; 

module.exports = fn => (...args) => { 
    const [, context] = args; 

    context.callbackWaitsForEmptyEventLoop = false; 

    if (cachedDB && cachedDB.readyState != 0 && cachedDB.readyState != 3) { 
    fn(...args); 
    } else { 
    mongoose.connect(process.env.MONGO_URI); 

    mongoose.connection.on('error', err => { 
     console.log('Connection Error'); 
     console.log(err); 
    }); 

    mongoose.connection.once('open',() => { 
     cachedDB = mongoose.connection; 
     fn(...args); 
    }); 
    } 
}; 
+0

この部分は意味がありません。「ラムダ関数には弾性IPを使用します」では、弾性IPをラムダ関数に割り当てることはできません。 MongoDBサーバーに弾力的なIPを割り当てているということですか?あなたがしなければならないことは、MongoDBサーバーと同じVPCにLambda関数を置き、パブリックまたは弾力的なIPではなくプライベートIPを使用してサーバーにアドレスすることです。 –

+0

@マークB私はElastic IP経由で作成したIPをホワイトリストに登録しているMongo Atlas(データベースとしてサービス)を使用しています。私のlamba機能はVPN内にあります。インターネットゲートウェイ、サブネット、NATゲートウェイ、および弾性IPを設定して、ラムダがmongoアトラスに接続するときに、使用している静的IPが1つあるようにします。 –

+1

これは元の質問にあったはずの情報です。したがって、ラムダ機能はVPC内にあり、NATゲートウェイへのルートを持つプライベートサブネット内にあり、弾性IPはNATゲートウェイに割り当てられていますか?最初に、同じプライベートサブネットのEC2インスタンスからMongoDBに接続し、VPC - > NAT - > Mongoからの接続が機能していることを確認します。 –

答えて

0

を実行する前に、あなたはあなたのハンドラ内の特殊なケースとして、ウォームアップイベントを処理する必要が接続されていることを確認するために、以下に私の関数をラップします。基本的には、ウォーミングアップイベントを介して呼び出されると、ハンドラはすぐに戻る必要があります。 serverless-warmup-pluginに与えられた例では

、あなたはこのようにそれを行うことができ、それはウォームアップイベントだかどうかを確認するために先頭に if文があることが

module.exports.lambdaToWarm = function(event, context, callback) { 
    // Immediate response for WarmUP plugin 
    if (event.source === 'serverless-plugin-warmup') { 
    console.log('WarmUP - Lambda is warm!') 
    return callback(null, 'Lambda is warm!') 
    } 

    // add lambda logic after 
} 

注意してください。そうであれば、すぐに正常に戻ります。

このチェックはMongoDBにまったく接続する必要がないように、最初に行う必要があります。

+0

サーバーレスのウォームアッププラグインでCloudWatchイベントルールを使用することをお勧めします。クラウドウォッチイベントルールから自分のカスタムイベントデータを渡すことができます。早期復帰はここで問題ではありません。私はすでにそれをやっていた。しかし、あなたはおそらく私が高次関数に戻ることができることを私に気付かせてくれました。 –

+0

私はあなたに同意し、カスタムイベントデータを使用します。プラグインを使って簡単に説明することができました。 – dashmug

関連する問題