2015-02-01 11 views
7

ich eine AWS Lambda-Funktion erstellt, die:conecting AWS Lambda Rotverschiebung - Zeiten heraus nach 60 Sekunden

  • Protokolle auf Redshift über JDBC URL
  • führt eine Abfrage

Lokal Knoten mit Ich kann über JDBC eine Verbindung zur Redshift-Instanz herstellen und eine Abfrage ausführen.

var conString = "postgresql://USER_NAME:[email protected]_URL”; 
var client = new pg.Client(conString); 
client.connect(function(err) { 
    if(err) {
    
     console.log('could not connect to redshift', err);
   
    } 
   
// omitted due to above error 

Allerdings, wenn ich die Funktion auf AWS Lambda ausführen (wo es in einem async#waterfall Block gewickelt wird), AWS Cloudwatch-Protokolle sagen mir, dass die AWS Lambda-Funktion nach 60 Sekunden abgelaufen.

Irgendwelche Ideen, warum meine Funktion keine Verbindung herstellen kann?

Antwort

3

Ich finde es ist entweder Sie öffnen Ihre Redshift Sicherheitsgruppe für alle Quellen, oder keine. Weil eine Lambda-Funktion nicht auf einer festen Adresse oder sogar einem festen Bereich von IP-Adressen läuft, was für die Benutzer völlig transparent ist (AKA Server-less).

Ich habe gerade gesehen Amazon hat die neue Lambda-Funktion angekündigt, um VPC gestern zu unterstützen. Ich denke, wenn wir einen Redshift-Cluster in einer VPC ausführen können, könnte dies das Problem lösen.

1

Wenn Sie serverless-Framework v1.5.0 verwenden, sollten Sie hinzufügen:

iamRoleStatements: - Effect: Allow Action: - ec2:CreateNetworkInterface Resource: '*' - Effect: Allow Action: - ec2:DeleteNetworkInterface - ec2:DescribeNetworkInterfaces Resource: 'arn:aws:ec2:${self:provider.region}:*:network-interface/*'

auch alle securityGroupIds zu Inbounds Regeln hinzufügen sollte, wie unten: screenshot 2017-01-09 23 02 33

Weitere Informationen: https://serverless.com/framework/docs/providers/aws/guide/functions/#vpc-configuration

1

Wenn ich einen Schritt zurück gehe, würde ich empfehlen, Kinesis [1] Firehose zu verwenden, um Lambda und Rotverschiebung zu verbinden. Dies ist der bessere Ansatz, wie in den Dokumenten [2] vorgeschlagen.

Kinesis kann s3 als Zwischenspeicher verwenden, um Daten mithilfe des Kopierbefehls automatisch zur Rotverschiebung zu verschieben.

„Ein COPY-Befehl ist der effizienteste Weg, um eine Tabelle zu laden. Sie können auch Daten in den Tabellen INSERT-Befehle, obwohl es viel weniger effizient als die Verwendung von COPY ist“

Fußnoten: [1] http://docs.aws.amazon.com/firehose/latest/dev/what-is-this-service.html

[2] http://docs.aws.amazon.com/redshift/latest/dg/t_Loading_data.html.