Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Ngrok to connect to local PostgreSQL from AWS Lamba

Tags:

I'm trying to use node-postgres (PG) to connect to my localhost PostgreSQL database running on port 5432. To do this, I've setup ngrok to tunnel my request.

./ngrok tcp 5432

The code below works when running locally (even when tunneling using ngrok). It also works on lambda when I connect to an external database - in my case hosted by Heroku.

'use strict';

const PG = require('pg');

// These credentials work locally
var credentials = {
    user: 'MyUsername',
    host: 'tcp://0.tcp.ngrok.io',
    database: 'MyDatabase',
    password: 'MyPassword',
    port: '12829',
    ssl: true
};

const pool = new PG.Pool(credentials);

const connectionPromise = function(){
    return new Promise(function (resolve, reject) {
        pool.connect(function (err, client, done) {
            if(err) console.log(err);
            err ? reject(err) : resolve({
                client: client,
                done: done
            })
        })
    });
};


exports.handler = Handler;

function Handler(event, context, callback) {
    context.callbackWaitsForEmptyEventLoop = false;

    console.log("Calling handler in Lambda");
    return connectionPromise().then(function (conn) {
        console.log("Success");
        callback(null);
    }).catch(function (err) {
        console.log("Error");
        callback(err);
    });
};

// Uncomment this code to run locally.
// Handler(null, {}, function(){
//     console.log("Exiting");
//     process.exit();
// });

However, when I attempt to use node-postgres + Ngrok to connect to my localhost database via Lambda ...

Error: getaddrinfo ENOTFOUND tcp://0.tcp.ngrok.io tcp://0.tcp.ngrok.io:12829

Full Error Message

START RequestId: 3ac634ef-310e-41ab-b20f-14c86271b5d7 Version: $LATEST 2019-01-21T16:14:27.020Z 3ac634ef-310e-41ab-b20f-14c86271b5d7 Calling handler in Lambda 2019-01-21T16:14:27.117Z 3ac634ef-310e-41ab-b20f-14c86271b5d7 { Error: getaddrinfo ENOTFOUND tcp://0.tcp.ngrok.io tcp://0.tcp.ngrok.io:12829 at errnoException (dns.js:50:10) at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:92:26) code: 'ENOTFOUND', errno: 'ENOTFOUND', syscall: 'getaddrinfo',
hostname: 'tcp://0.tcp.ngrok.io', host: 'tcp://0.tcp.ngrok.io',
port: 12829 } 2019-01-21T16:14:27.118Z 3ac634ef-310e-41ab-b20f-14c86271b5d7 Error 2019-01-21T16:14:27.155Z 3ac634ef-310e-41ab-b20f-14c86271b5d7 {"errorMessage":"getaddrinfo ENOTFOUND tcp://0.tcp.ngrok.io tcp://0.tcp.ngrok.io:12829","errorType":"Error","stackTrace":["errnoException (dns.js:50:10)","GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:92:26)"]} END RequestId: 3ac634ef-310e-41ab-b20f-14c86271b5d7 REPORT RequestId: 3ac634ef-310e-41ab-b20f-14c86271b5d7 Duration: 136.26 ms Billed Duration: 200 ms Memory Size: 128 MB Max Memory Used: 23 MB

Is lambda blocking ngrok?

like image 980
Will Lovett Avatar asked Jan 21 '19 16:01

Will Lovett


People also ask

Is using ngrok secure?

The communication between the ngrok edge and agent is secure and encrypted. Traffic from the user to the ngrok edge, and from the ngrok agent to the upstream service rely on the protocol you are using for encryption. For protocols that support end to end encryption using TLS, we provide a TLS tunnel option.


1 Answers

Remove tcp:// from ngrok hostname:

var credentials = {
    user: 'MyUsername',
    host: '0.tcp.ngrok.io',
    database: 'MyDatabase',
    password: 'MyPassword',
    port: '12829',
    ssl: true
};
like image 146
Dani Korniliev Avatar answered Nov 30 '22 05:11

Dani Korniliev