2015-08-04 17 views
32

Sto provando a connettere la funzione AWS Lambda al database mysql di RDS.
Volevo solo aggiornare il database dalla mia funzione lambda. È possibile accedere a RDS specificando il ruolo IAM e la politica di accesso ?.
Posso connettermi a mysql databse usando mysql client.but quando provo su lambda non posso farlo. ecco il mio codicepuò AWS Lambda connettersi al database mySQL RDS e aggiornare il database?

console.log('Loading function'); 
var doc = require('dynamodb-doc'); 
var dynamo = new doc.DynamoDB(); 
var mysql = require('mysql'); 
exports.handler = function(event, context) { 
    //console.log('Received event:', JSON.stringify(event, null, 2)); 
    var operation = event.operation; 
    delete event.operation; 
    switch (operation) { 
     case 'create': 
      var conn = mysql.createConnection({ 
       host: 'lamdatest.********.rds.amazonaws.com', // RDS endpoint 
       user: 'user', // MySQL username 
       password: 'password', // MySQL password 
       database: 'rdslamda' 
      }); 
      conn.connect(); 
      console.log("connecting..."); 
      conn.query('INSERT INTO login (name,password) VALUES("use6","password6")', function(err, info) { 
       console.log("insert: " + info.msg + " /err: " + err); 
      }); 
      console.log("insert values in to database"); 
      break; 
     case 'read': 
      dynamo.getItem(event, context.done()); 
      break; 

     default: 
      context.fail(new Error('Unrecognized operation "' + operation + '"')); 

    } 
    context.succeed(); 
}; 
+0

Non è possibile usare 'IAM Role' per accedere al tuo' RDS'. – kixorz

+0

quindi qual è la procedura per connettersi a mysql RDS? –

+0

È necessario rendere pubblico il proprio RDS (non in VPC) e quindi utilizzare uno dei nomi host pubblici per connettersi ad esso. – kixorz

risposta

63

Sì. È possibile accedere a un database MySql RDS da AWS Lambda.

È possibile utilizzare la libreria node-mysql.

Tuttavia, v'è un grande avvertimento che va con esso.

AWS Lambda non ha (attualmente) accesso alle sottoreti private all'interno di un VPC. Pertanto, affinché AWS Lambda possa accedere al tuo database RDS, deve essere accessibile al pubblico, il che potrebbe costituire un rischio per la tua sicurezza.

Aggiornamento (2015/10/30): AWS Lambda annunciato imminente supporto VPC (as of re:Invent 2015), quindi questo non sarà un problema per molto più tempo.

Aggiornamento (2015-11-17): AWS Lambda non ha ancora il supporto VPC.

Aggiornamento (2016/02/11): AWS Lambda può ora accedere VPC risorse:

https://aws.amazon.com/blogs/aws/new-access-resources-in-a-vpc-from-your-lambda-functions/

per ottenere questa funzionalità, la vostra funzione Lambda sarà effettivamente eseguire all'interno del vostro VPC in una sottorete. Alcuni avvertimenti sono dotati di questa funzionalità:

  • La sottorete VPC bisogno di abbastanza indirizzi IP liberi di gestire Lambda ridimensionamento
  • Se la funzione lambda ha bisogno di accesso a internet, allora è designato subnet VPC avrà bisogno di un gateway Internet o NAT
+0

okay. ora sto provando a do so.but c'è un errore quando cerco di includere il modulo mysql nella mia funzione lambda. come questo: 'var mysql = require (" mysql ");'. Mostra errore come _ "errorMessage": "Impossibile trovare il modulo 'mysql'_ –

+1

Quindi non stai includendo il modulo in il pacchetto di distribuzione correttamente.Assicurati di averlo incluso nel tuo pacchetto ZIP (nella sottocartella 'node_modules'). –

+0

ho incluso la cartella zip che contiene il mio file 'index.js' e la cartella' node_modules'. ma mostra un messaggio di errore come sotto '{ " errorMessage ":" Impossibile trovare il modulo 'index' ", " errorType ":" Errore "' ecc. –

4

Dal Lambda utilizza Node.js, Java e Python come linguaggio di programmazione/scripting backend, si può sicuramente usarlo per connettersi a RDS. (Link)

Infine, This è la documentazione su come specificare i ruoli IAM durante la connessione a RDS. (Vedi immagine sotto):

enter image description here

+0

ok. ora sto cercando di farlo. ma mostra un errore quando provo ad includere il modulo mysql nella mia funzione lambda. così: 'var mysql = require (" mysql "); '. Mostra errore come _ "errorMessage": "Impossibile trovare il modulo 'mysql'_ –

+0

Non è corretto puntare a IAM Roles per RDS. La connessione RDS da Lambda non è all'interno di un VPC. Devi impostare il tuo RDS come pubblico e usare regolarmente MySQL credenziali per connettersi ad esso – kixorz

+0

Ho appena indicato la documentazione, il downvote non era assolutamente necessario qui.Inoltre, il post originale non aveva nulla a che fare con un VPC. – Jordan

4

provare questo tutorial: http://docs.aws.amazon.com/lambda/latest/dg/vpc-rds.html

In questo tutorial, effettuare le seguenti operazioni:

Avvia un'istanza del motore di database MySQL Amazon RDS nel tuo Amazon VPC predefinito.

Nell'istanza MySQL, si crea un database (ExampleDB) con una tabella di esempio (Dipendente) al suo interno.

Creare una funzione Lambda per accedere al database ExampleDB, creare una tabella (Impiegato), aggiungere alcuni record e recuperare i record dalla tabella.

Richiamare manualmente la funzione Lambda e verificare i risultati dell'interrogazione.

2

I just wanted to update the database from my lambda function. Is it possible to access RDS by specifiying IAM Role and access Policy?.

No, non è possibile. È necessario fornire l'URL/nome utente/password DB per connettersi. Potrebbe essere necessario eseguire Lambda nello stesso VPC se si trova nella sottorete privata. Vedi i miei suggerimenti qui sotto.

I can connect to mysql databse using mysql client.but when i try on lambda i can't do that.

Questo è rigoroso No, No! Il tuo RDS non dovrebbe essere accessibile da Internet a meno che tu non ne abbia davvero bisogno. Prova a eseguirlo nella sottorete privata e configurare di conseguenza altri servizi AWS.

due centesimi dal mio finale, se si stanno ottenendo timeout di accesso a risorse adeguate da Lambda

  1. Per impostazione predefinita Lambda ha accesso a Internet e può accedere a risorse online.
  2. Lambda non può accedere ai servizi che ritorna nella sottorete privata del VPC.
  3. Per connettersi ai servizi nella sottorete privata è necessario eseguire la sottorete privata lambda. Per questo è necessario accedere alla sezione Rete e configurare il VPC, le sottoreti e il gruppo di sicurezza.
  4. Tuttavia, quando si esegue questa operazione si perderà l'accesso a Internet. Se è ancora necessario l'accesso a Internet, è necessario attivare un gateway NAT o un'istanza NAT nella sottorete pubblica e configurare l'instradamento dalla sottorete privata a questo NAT.
  5. Ho affrontato questo quando stavo cercando di connettersi a RDS nella sottorete privata dal mio lambda. Poiché ho usato KMS per crittografare alcune variabili di ambiente e la parte di decodifica richiede l'accesso a Internet, ho dovuto usare un gateway NAT.

Maggiori informazioni - http://docs.aws.amazon.com/lambda/latest/dg/vpc.html#vpc-internet

How to connect to postgres RDS from AWS Lambda