2017-04-21 4 views
0

Ich habe eine einfache Abfrage Aufruf geschrieben, My hallo Handler ist dieseServerless Funktion Timeout immer auf Lambda

'use strict'; 

const pg = require('pg'); 
const conn = 'pg://postgres:user:[email protected]_host:5432/database_name'; 

module.exports.hello = (event, context, callback) => { 
    const client = new pg.Client(conn); 
    client.connect(); 

    client.query('SELECT column_a FROM table_b', function(err, result) { 
    client.end(); 
    if (err) { 
     callback(null, {error: err}); 
    } else { 
     const response = { 
     statusCode: 200, 
     body: JSON.stringify({ 
      data: result.rows 
     }), 
     }; 

     callback(null, response); 
    } 
    }); 

    // Use this code if you don't use the http event with the LAMBDA-PROXY integration 
    // callback(null, { message: 'Go Serverless v1.0! Your function executed successfully!', event }); 
}; 

ich dieses Skript auf meinem lokalen ausgeführt wurden durch manuelle

const handler = require('../server/handler'); 

handler.hello({}, {}, function(err, response) { 
    console.log(err, response); 
}); 

und Werke nennen, wenn ich

$ serverless invoke local -f hello -l 

auch anrufen funktioniert, aber Aufruf Lambda nicht immer,

$ SLS_DEBUG=* serverless invoke -f hello -l 


{ 
    "errorMessage": "2017-04-21T01:11:19.580Z 697e69bc-262f-11e7-8fee-0331cc761e9a Task timed out after 6.00 seconds" 
} 
-------------------------------------------------------------------- 
START RequestId: 697e69bc-262f-11e7-8fee-0331cc761e9a Version: $LATEST 
END RequestId: 697e69bc-262f-11e7-8fee-0331cc761e9a 
REPORT RequestId: 697e69bc-262f-11e7-8fee-0331cc761e9a Duration: 6000.71 ms Billed Duration: 6000 ms  Memory Size: 1024 MB Max Memory Used: 20 MB 
2017-04-21T01:11:19.580Z 697e69bc-262f-11e7-8fee-0331cc761e9a Task timed out after 6.00 seconds 



    Error -------------------------------------------------- 

    Invoked function failed 

    For debugging logs, run again after setting the "SLS_DEBUG=*" environment variable. 

    Stack Trace -------------------------------------------- 

Error: Invoked function failed 
    at AwsInvoke.log (/home/rkmax/my-project/node_modules/serverless/lib/plugins/aws/invoke/index.js:122:31) 
From previous event: 
    at Object.invoke:invoke [as fn] (/home/rkmax/my-project/node_modules/serverless/lib/plugins/aws/invoke/index.js:22:10) 
    at BbPromise.reduce (/home/rkmax/my-project/node_modules/serverless/lib/classes/PluginManager.js:210:55) 
    at runCallback (timers.js:672:20) 
    at tryOnImmediate (timers.js:645:5) 
    at processImmediate [as _immediateCallback] (timers.js:617:5) 
From previous event: 
    at PluginManager.invoke (/home/rkmax/my-project/node_modules/serverless/lib/classes/PluginManager.js:210:22) 
    at PluginManager.run (/home/rkmax/my-project/node_modules/serverless/lib/classes/PluginManager.js:225:17) 
    at Serverless.run (/home/rkmax/my-project/node_modules/serverless/lib/Serverless.js:97:31) 
    at serverless.init.then (/home/rkmax/my-project/node_modules/serverless/bin/serverless:23:50) 

    Get Support -------------------------------------------- 
    Docs:   docs.serverless.com 
    Bugs:   github.com/serverless/serverless/issues 
    Forums:  forum.serverless.com 
    Chat:   gitter.im/serverless/serverless 

    Your Environment Information ----------------------------- 
    OS:     linux 
    Node Version:  7.9.0 
    Serverless Version: 1.11.0 
+0

Ich kann wirklich nicht herausfinden, warum dies nicht funktioniert auf Lambda, tryied viel jetzt Ich benutze eine Abfrage baed auf Ereignisse alles funktioniert gut auf lokale, aber nicht auf lamba sogar versucht verschiedene Beispiele von pg Seite funktioniert nicht – rkmax

Antwort

1

Ist Ihr Lambda im selben VPC und Subnetz wie Ihre Postgres-Datenbank? Wenn Sie das Lambda erstellt haben und nicht explizit angegeben haben, zu welchem ​​Subnetz es gehört, ist es effektiv "public", dh es kann auf Internetressourcen, DynamoDB, SNS, S3, ... zugreifen, aber es kann nicht mit privat kommunizieren RDS-Instanzen. Um Ihre Lambda zum VPC hinzufügen, wo die Datenbank Leben auf die Registerkarte gehen Configuration-> Erweiterte Einstellungen und Einrichtung etwas Ähnliches wie die folgenden Regeln, die den Verkehr zeigen innerhalb der VPC aktiviert ... Advanced Settings with VPC & Subnets & Security Groups configured

+0

RDS ist öffentlich Ich kann von meinem Laptop darauf zugreifen – rkmax

+0

Hat Ihr Lambda die richtigen IAM-Berechtigungen? Vielleicht erhöhen Sie es zu FullAdmin und sehen, ob die Abfrage zurückgibt, und dann später abschneiden. –

+0

Ja, es hat AdministratorAccess richtlinie Vollzugriff auf alle Ressourcen – rkmax

0

Fügen Sie die folgende Zeile am Anfang deines Lambda.

Aus irgendeinem Grund verursacht das Abfragen von Datenbanken, dass das Lambda nur so lange hängt, bis es abläuft. Diese Einstellung sagt dem Lambda, dass es stoppt, wenn Sie den Callback aufrufen.

Wir hatten dieses Problem bei der Abfrage von MySQL und mussten es an Amazon Support eskalieren, bevor wir unsere Antwort erhielten.

+0

hat leider nicht für mich funktioniert – rkmax

+0

Warum geben Sie einen Erfolgsrückruf zurück, wenn Sie einen Fehler von der Datenbank erhalten? Wie viel Speicher hast du deinem Lambda gegeben? – JamesENL

+0

Ich versuche nur, den Fehler herauszufinden, aber es gibt keinen Fehler ist wie lambda weiterlaufen wie wenn Sie nicht aufrufen process.exit() – rkmax

Verwandte Themen