2015-02-01 15 views
7

ho creato una funzione di AWS lambda:conecting AWS Lambda di Redshift - scade dopo 60 secondi

  • tronchi sul Redshift tramite JDBC URL
  • esegue una query

A livello locale, utilizzando Nodo , Posso collegarmi con successo all'istanza Redshift tramite JDBC ed eseguire una query.

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 

Tuttavia, quando eseguo la funzione AWS Lambda (dove è avvolto in un blocco async#waterfall), i registri AWS CloudWatch mi dice che la funzione AWS Lambda scaduta dopo 60 secondi.

Qualche idea sul perché la mia funzione non è in grado di connettersi?

risposta

3

Trovo sia che apri il tuo gruppo di sicurezza Redshift pubblico a tutte le fonti, o nessuno. Perché una funzione Lambda non è in esecuzione su un indirizzo fisso o addirittura su un intervallo fisso di indirizzi IP, che è completamente trasparente per gli utenti (senza server AKA).

Ho appena visto che Amazon ha annunciato la nuova funzione Lambda per supportare VPC ieri. Immagino che se potessimo eseguire un cluster Redshift in un VPC, questo potrebbe risolvere il problema.

1

Se si utilizza v1.5.0 serverless-quadro, si dovrebbe aggiungere:

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

Inoltre dovrebbe aggiungere tutti gli articoli securityGroupIds inbounds, come di seguito: screenshot 2017-01-09 23 02 33

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

1

Facendo un passo indietro, consiglierei di usare Kinesis [1] firehose per collegare lambda e redshift. Questo è un approccio migliore come suggerito in docs [2].

Kinesis può utilizzare s3 come memoria intermedia per inviare i dati a redshift utilizzando il comando di copia, automaticamente.

"un comando di copia è il modo più efficace per caricare una tabella. È possibile aggiungere anche i dati per le tabelle utilizzando comandi INSERT, anche se è molto meno efficiente rispetto all'utilizzo COPIA"

Footnotes: [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.