2016-03-08 10 views
6

próbuję połączyć się z RDS przy użyciu funkcji Lambda, ale otrzymuję błąd:Error: connect ETIMEDOUT rds lambda

var mysql = require('mysql'); 
exports.handler = function(event, context) { 
      //Connect to RDS 

var connection = mysql.createConnection({ 
host  : 'hostname', 
user  : 'username', 
password : 'password', 
database : 'database' 

}); 

connection.connect(function(err) 
{ 
    if (err) 
    { 
    throw err; 
    } 
else 
    { 
    console.log('DB connection establish'); 
    } 
    }); 

}; 

Błąd Dostaję brzmi:

START RequestId: 9711e650-e582-11e5-af5f-97ba391a42ae Version: $LATEST 

2016-03-08T23:08:06.737Z 9711e650-e582-11e5-af5f-97ba391a42ae  
Error: connect ETIMEDOUT 
    at Connection._handleConnectTimeout (/var/task/node_modules/mysql/lib/Connection.js:412:13)  
     at Socket.g (events.js:180:16) 
    at Socket.emit (events.js:92:17) 
    at Socket._onTimeout (net.js:327:8)  
    at _makeTimerTimeout (timers.js:429:11) 
    at Timer.unrefTimeout [as ontimeout] (timers.js:493:5)  
    -------------------- 
    at Protocol._enqueue (/var/task/node_modules/mysql/lib/protocol /Protocol.js:141:48)  
    at Protocol.handshake (/var/task/node_modules/mysql/lib/protocol /Protocol.js:52:41)  
    at Connection.connect (/var/task/node_modules/mysql  /lib/Connection.js:123:18)  
    at exports.handler (/var/task/exports.js:21:12)  
END RequestId: 9711e650-e582-11e5-af5f-97ba391a42ae   
REPORT RequestId: 9711e650-e582-11e5-af5f-97ba391a42ae 
Duration: 10988.17ms  
Process exited before completing request 

Odpowiedz

2

miałem ten sam problem i znalazłem twój wpis podczas googlowania, ale teraz go rozwiązałem. Niestety nie jestem na pewno pewien, których działanie rzeczywiście rozwiązać go jednak sprawdzić:

  • Jeśli nie korzystają z VPCs zobaczyć czy to działa z publicznie dostępnym RDS, przynajmniej dla celów testowych
  • Grant twoja rola (na przykład lambda_basic_execution) AmazonRDSFullAccess w obszarze zarządzania tożsamością i dostępem
  • W ramach przeglądu RDS Twojej instancji DB możesz kliknąć wybraną grupę zabezpieczeń, aby je edytować: w poniższym oknie możesz określić przychodzące i reguły ruchu wychodzącego. W moim przykładzie roboczym zezwalałem na cały ruch ze wszystkich portów i wszystkich adresów IP (0.0.0.0/0) w obie strony. Oczywiście nie jest to bezpieczne rozwiązanie, ale biorąc pod uwagę twój przykład, myślę, że jesteś - jak ja - właśnie wchodzisz w AWS i próbujesz najpierw budować działające przykłady. Zawsze możesz edytować te zasady później, aby stopniowo ograniczać ruch. Zrobiłem to, aby przetestować dostęp do RDS za pośrednictwem własnego komputera w pierwszej

Zrobiłem to działa bez ustawiania opcji VPC lub punktów końcowych API w funkcji lambda i ustanowił połączenie poprzez

exports.handler = function(event, context) { 
var mysql  = require('mysql'); 
var connection = mysql.createConnection({ 
host  : 'hostwithoutport', 
user  : 'user', 
password : 'password', 
database : 'database' 
}); 

connection.query('SELECT * FROM Xy WHERE ID = "1"', function(err, rows) { 
if (err) { 
console.error('error connecting: ' + err.stack); 
context.fail(); 
return; 
} 

console.log('connected as id ' + connection.threadId); 
context.succeed(rows); 
}); 
}; 

You może też zrobić to inaczej, ale pamiętaj, aby zawsze odnieść sukces i nie wykonać (lub wykonać) funkcji lambda, najlepiej w klauzuli if po instrukcji. W przeciwnym razie mogą pojawić się problemy z powodu powodzenia funkcji lambda, zanim zapytanie może ustalić wyniki i nie otrzymasz poprawnego wyniku. Jeśli w jakiś sposób nie zakończysz funkcji lambda, upłynie limit czasu, który będzie wyglądał inaczej.

Pamiętaj też, aby zawsze kończyć połączenia, co wynika bezpośrednio z zapytania - ta metoda łączy się i kończy sama. Zgodnie z tym, co przeczytałem w innym wątku, problem ten mógł teoretycznie wystąpić również z powodu wciąż otwartego połączenia, które kiedyś wywołałeś.

11

Miałem ten sam problem i właśnie go naprawiłem. Widząc, że jest to najlepszy wynik wyszukiwania dla tego problemu na stackoverflow, zamierzam opublikować moje rozwiązanie tutaj.

Ta odpowiedź jest na przykład RDS wewnątrz VPC

  1. miejscu funkcja lambda w tym samym VPC jako przykład RDS
  2. swoją rolę wykonanie lambda trzeba będzie mieć realizacja VPC dodaje się do niej w IAM
  3. przypisać grupę zabezpieczeń do funkcji lambda
  4. W bezpieczeństwa dołączoną do instancji RDS, dodać regułę przychodzących do mysql/aurora (port 3306) i zamiast dodawania go do adresu IP, dodaj go do swojej lambda funkcje grupa bezpieczeństwa.

Podsumowując, lambda jest umieszczana w tym samym VPC co RDS i zapewnia funkcję wejścia lambda dla MYSQL, niezależnie od adresu IP funkcji lambda.

+0

Rozwiązało to dla mnie problem z przekroczeniem limitu czasu. Dzięki! – SexxLuthor