Eran Ben-Natan
Eran Ben-Natan

Reputation: 2615

How can I run SQL on PostgreSQL RDS from Lambda function in Node.js?

I have this code in Lambda funcion:

sql="SELECT ...";
var pg = require('pg');
var connectionString = 'postgres://...';

var client = new pg.Client(connectionString);
client.connect();
var query = client.query(sql);
query.on('end', function() { client.end(); });

When I run from EC2, it works fine. When I run from Lambda I get Error: Cannot find module 'pg'

Upvotes: 10

Views: 12533

Answers (3)

Aniket Thakur
Aniket Thakur

Reputation: 68975

Error: Cannot find module 'pg'

In my case I was just uploading index.js. We need to package 3rd party node modules as well.

  1. create index.js (name may vary based on your handler name)
  2. run npm install package
  3. It is better you create package.json will all dependencies you need and run mpn install
  4. Confirm node_modules folder is created in same directory.
  5. Zip these contents (index.js and node_modules folder) and upload the zip.
  6. You can upload directly or use S3.
  7. For more details read their offcial doc - Creating a Deployment Package (Node.js)

Now I get: Unable to import module 'index': Error . Is my function must be called index.js

In my case I was zipping the entire directory instead of it's contents. So you need to really do -

zip -r deploymentpkg.zip ./*

instead of

zip -r deploymentpkg.zip folder

Upvotes: 0

Dmytro Rakovskyi
Dmytro Rakovskyi

Reputation: 1

You can import easily only predifined libs to your lambda. For example You can use just boto3 and core for python, for java You can use just core. http://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html You cannot import any additional libs in simple way. You can try to use "hard way". In this case You should save all necessary libraries to s3(or other place which You can access from lambda) and then copy to lambda environment (/tmp) and import it with the help of reflection.

Upvotes: 0

imTachu
imTachu

Reputation: 3809

I am a super noob in Node JS, but I really wanted to try AWS Lambda. Here are the steps I took. I used a Ubuntu 14.04.

sudo apt-get update
sudo apt-get install nodejs
sudo apt-get install npm
sudo ln -s /usr/bin/nodejs /usr/bin/node

mkdir the_function && cd the_function
mkdir node_modules 
npm install pg

******Now create a file index.js and paste the content of your funcion.
console.log('Loading S2 Function');
var pg = require("pg");

exports.handler = function(event, context) {   
    var conn = "pg://user:password@host:5432/bd_name";

    var client = new pg.Client(conn);
    client.connect();

    var query = client.query("SELECT * FROM BLA WHERE ID = 1");
    query.on("row", function (row, result) {
        result.addRow(row);
    });
    query.on("end", function (result) {
        var jsonString = JSON.stringify(result.rows);
        var jsonObj = JSON.parse(jsonString);
        console.log(jsonString);
        client.end();
        context.succeed(jsonObj);
    });
 };

******Now zip the contents of the_function folder (not the_function folder itself)

You can check the official sample from this AWS link: http://docs.aws.amazon.com/lambda/latest/dg/walkthrough-s3-events-adminuser-create-test-function-create-function.html

Upvotes: 9

Related Questions