Kesalahan: sambungkan ETIMEDOUT rds lambda

Saya mencoba menyambung ke RDS menggunakan fungsi Lambda, tetapi saya mendapatkan kesalahan:

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');
  }
  });

 };

Kesalahan yang saya dapatkan adalah:

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

person user1042327    schedule 08.03.2016    source sumber
comment
bagi saya fungsi pengendali lamda adalah async. Saya baru saja menghapus kata kunci async sekarang saya dapat melakukan operasi CRUD di DB(RDS) saya   -  person vikas kv    schedule 29.10.2019


Jawaban (4)


Saya memiliki masalah yang sama seperti ini dan baru saja memperbaikinya. Mengingat ini adalah hasil pencarian teratas untuk masalah ini di stackoverflow, saya akan memposting solusi saya di sini.

Jawaban ini untuk instans RDS di dalam VPC

  1. tempatkan fungsi Lambda di VPC yang sama dengan instans RDS Anda
  2. peran eksekusi lambda Anda, Anda harus memiliki kebijakan eksekusi VPC AWSLambdaVPCAccessExecutionRole

  3. tetapkan grup keamanan ke fungsi lambda

  4. Dalam keamanan yang melekat pada instans RDS, tambahkan aturan masuk untuk mysql/aurora (port 3306) dan alih-alih menambahkannya untuk alamat IP, tambahkan aturan tersebut untuk grup keamanan fungsi lambda Anda.

Singkatnya, ini menempatkan lambda di VPC yang sama dengan RDS dan memberikan akses masuk fungsi lambda ke MYSQL terlepas dari IP fungsi lambda.

person ajmcgarry    schedule 16.02.2017

Saya memiliki masalah yang sama dan menemukan entri Anda saat mencari di Google, tetapi sekarang saya menyelesaikannya. Sayangnya saya tidak yakin, tindakan mana yang benar-benar menyelesaikannya tetapi periksa:

  • Jika Anda tidak menggunakan VPC, lihat apakah VPC berfungsi dengan RDS yang dapat diakses publik, setidaknya untuk tujuan pengujian
  • Berikan Peran Anda (misalnya lambda_basic_execution) AmazonRDSFullAccess dalam area Manajemen Identitas dan Akses
  • Dalam Ikhtisar RDS instans DB Anda, Anda dapat mengklik grup keamanan yang dipilih untuk mengeditnya: di jendela berikut Anda dapat menentukan aturan lalu lintas masuk dan keluar. Dalam contoh kerja saya, saya mengizinkan semua lalu lintas dari semua port dan semua IP (0.0.0.0/0) untuk kedua arah. Tentu saja ini bukan solusi yang aman tetapi mengenai contoh Anda, saya rasa Anda - seperti saya - baru saja masuk ke AWS dan mencoba membuat contoh yang berfungsi terlebih dahulu. Anda selalu dapat mengedit aturan tersebut nanti untuk membatasi lalu lintas secara bertahap. Saya melakukan ini untuk menguji akses saya ke RDS melalui komputer saya sendiri pada awalnya

Saya membuatnya berfungsi tanpa mengatur opsi VPC atau titik akhir API di fungsi lambda dan membuat koneksi melalui

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);
});
};

Anda juga dapat melakukannya secara berbeda namun perlu diingat untuk selalu berhasil dan gagal (atau menyelesaikan) fungsi lambda, sebaiknya dalam klausa if setelah pernyataan. Jika tidak, Anda mungkin mendapatkan masalah karena fungsi lambda berhasil sebelum kueri dapat menentukan hasil dan Anda tidak mendapatkan hasil yang tepat. Jika Anda tidak mengakhiri fungsi lambda dengan cara apa pun, waktu fungsi itu sendiri akan habis, namun tampilannya akan berbeda.

Ingat juga untuk selalu mengakhiri koneksi, ini tersirat dengan menggunakan kueri secara langsung - metode ini menghubungkan dan mengakhiri dengan sendirinya. Menurut apa yang saya baca di thread berbeda, masalah ini secara teoritis juga bisa terjadi karena koneksi masih terbuka yang pernah Anda panggil.

person kopaka    schedule 22.03.2016

Saya ingin melengkapi jawaban ajmcgarry karena saya memerlukan kerja ekstra untuk menemukan apa yang saya butuhkan untuk menyelesaikan masalah ini:

  1. Ya, Anda perlu membuat peran khusus untuk Lambda untuk mengakses dan mengontrol VPC, ikuti petunjuk halaman ini: https://docs.aws.amazon.com/lambda/latest/dg/vpc-rds-create-iam-role.html
  2. Setelah peran baru ini ditetapkan ke Lambda Anda, Anda perlu menggunakan VPC yang sama tempat instans RDS Anda berjalan.
  3. Anda perlu menggunakan Grup Keamanan yang sama di fungsi Lambda Anda. Pertama, di instans RDS Anda, temukan Grup Keamanan, ubah & tambahkan aturan masuk untuk mengakses port DB dari mana saja untuk tujuan pengujian.
  4. Tetapkan Grup Keamanan yang baru saja Anda modifikasi ke fungsi Lambda Anda

Apakah Anda memerlukan instruksi visual? Video ini tidak terlalu panjang dan meskipun untuk Python, petunjuknya berlaku untuk kasus ini: https://www.youtube.com/watch?v=-CoL5oN1RzQ

person Sergio D.    schedule 20.06.2018

Bagi saya itu hanyalah peran keamanan RDS yang membatasi koneksi masuk ke alamat ip saya, jadi tentu saja saya dapat terhubung dari mesin lokal saya tetapi fungsi lambda saya tidak bisa, setelah saya membukanya untuk umum (seperti yang ditulis Scherwin , ini tidak ideal tetapi berfungsi untuk menguji dan bermain-main) dan menerapkan ulang fungsi lambda saya (ya, saya harus menerapkan ulang kode yang sama, tidak yakin bagaimana hal itu memengaruhinya) fungsi lambda saya dapat terhubung.

Saya tidak perlu menyertakan lambda saya di VPC yang sama karena database saya dapat diakses publik.

Saya tidak perlu mengubah atau menambahkan peran keamanan apa pun ke lambda saya.

person Naguib Ihab    schedule 21.06.2018