ข้อผิดพลาด: เชื่อมต่อแลมบ์ดา ETIMEDOUT rds

ฉันกำลังพยายามเชื่อมต่อกับ 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');
  }
  });

 };

ข้อผิดพลาดที่ฉันได้รับคือ:

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 แหล่งที่มา
comment
สำหรับฉันฟังก์ชั่นตัวจัดการแลมดาเป็นแบบอะซิงโครนัส ฉันเพิ่งลบคีย์เวิร์ด async ตอนนี้ฉันสามารถดำเนินการ CRUD บน DB (RDS) ของฉันได้   -  person vikas kv    schedule 29.10.2019


คำตอบ (4)


ฉันมีปัญหาเดียวกันกับสิ่งนี้และเพิ่งได้รับการแก้ไข เนื่องจากนี่คือผลการค้นหาอันดับต้นๆ สำหรับปัญหานี้ใน Stackoverflow ฉันจะโพสต์วิธีแก้ปัญหาของฉันที่นี่

คำตอบนี้มีไว้สำหรับอินสแตนซ์ RDS ภายใน VPC

  1. วางฟังก์ชัน Lambda ใน VPC เดียวกันกับอินสแตนซ์ RDS ของคุณ
  2. บทบาทการดำเนินการแลมบ์ดาของคุณ คุณจะต้องมีนโยบายการดำเนินการ VPC AWSLambdaVPCAccessExecutionRole

  3. กำหนดกลุ่มความปลอดภัยให้กับฟังก์ชันแลมบ์ดา

  4. ในการรักษาความปลอดภัยที่แนบมากับอินสแตนซ์ RDS ให้เพิ่มกฎขาเข้าสำหรับ mysql/aurora (พอร์ต 3306) และแทนที่จะเพิ่มกฎสำหรับที่อยู่ IP ให้เพิ่มกฎนั้นสำหรับกลุ่มความปลอดภัยของฟังก์ชัน lambda ของคุณ

โดยสรุป สิ่งนี้จะวางแลมบ์ดาไว้ใน VPC เดียวกันกับ RDS และให้ฟังก์ชันแลมบ์ดาเข้าถึง MYSQL ขาเข้า โดยไม่คำนึงถึง IP ของฟังก์ชันแลมบ์ดา

person ajmcgarry    schedule 16.02.2017

ฉันมีปัญหาเดียวกันและพบข้อความของคุณในขณะที่ใช้ Google แต่ตอนนี้ฉันแก้ไขได้แล้ว น่าเศร้าที่ฉันไม่แน่ใจอย่างแน่นอนว่าการกระทำใดที่แก้ไขได้จริง แต่ให้ตรวจสอบ:

  • หากคุณไม่ได้ใช้ VPC ให้ดูว่ามันใช้งานได้กับ RDS ที่เข้าถึงได้แบบสาธารณะหรือไม่ อย่างน้อยก็เพื่อวัตถุประสงค์ในการทดสอบ
  • มอบบทบาทของคุณ (เช่น lambda_basic_execution) AmazonRDSFullAccess ภายในพื้นที่ Identity and Access Management
  • ภายในภาพรวม RDS ของอินสแตนซ์ DB ของคุณ คุณสามารถคลิกที่กลุ่มความปลอดภัยที่เลือกเพื่อแก้ไข: ในหน้าต่างต่อไปนี้ คุณสามารถระบุกฎการรับส่งข้อมูลขาเข้าและขาออกได้ ในตัวอย่างการทำงานของฉัน ฉันอนุญาตการรับส่งข้อมูลทั้งหมดจากพอร์ตทั้งหมดและ IP ทั้งหมด (0.0.0.0/0) สำหรับทั้งสองวิธี แน่นอนว่านี่ไม่ใช่โซลูชันที่ปลอดภัย แต่สำหรับตัวอย่างของคุณ ฉันเดาว่าคุณเป็นเหมือนฉัน เพียงแค่เข้าสู่ AWS และพยายามสร้างตัวอย่างการทำงานก่อน คุณสามารถแก้ไขกฎเหล่านั้นได้ในภายหลังเพื่อค่อยๆ จำกัดการรับส่งข้อมูล ฉันทำสิ่งนี้เพื่อทดสอบการเข้าถึง RDS ผ่านคอมพิวเตอร์ของฉันเองในตอนแรก

ฉันทำให้มันทำงานได้โดยไม่ต้องตั้งค่าตัวเลือก VPC หรือจุดสิ้นสุด API ในฟังก์ชัน lambda และสร้างการเชื่อมต่อผ่าน

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

คุณยังสามารถทำสิ่งนี้ให้แตกต่างออกไปได้ แต่โปรดจำไว้ว่าให้ฟังก์ชัน lambda ประสบความสำเร็จและล้มเหลว (หรือทำเสร็จแล้ว) เสมอ โดยควรอยู่ภายใน if clause หลังคำสั่ง มิฉะนั้น คุณอาจประสบปัญหาเนื่องจากฟังก์ชัน lambda ทำงานสำเร็จก่อนที่แบบสอบถามจะสามารถระบุผลลัพธ์ได้ และคุณจะไม่ได้รับผลลัพธ์ที่เหมาะสม หากคุณไม่สิ้นสุดฟังก์ชัน lambda ในทางใดทางหนึ่ง ฟังก์ชัน เองก็จะหมดเวลาลง ซึ่งจะดูแตกต่างออกไป

นอกจากนี้ อย่าลืมยุติการเชื่อมต่อเสมอ ซึ่งหมายถึงการใช้แบบสอบถามโดยตรง - วิธีนี้จะเชื่อมต่อและสิ้นสุดด้วยตัวเอง จากสิ่งที่ฉันอ่านในเธรดอื่น ในทางทฤษฎีแล้วปัญหานี้อาจเกิดขึ้นได้เช่นกันเนื่องจากการเชื่อมต่อยังคงเปิดอยู่ซึ่งคุณเคยเรียกใช้

person kopaka    schedule 22.03.2016

ฉันต้องการเสริมคำตอบของ ajmcgarry เนื่องจากฉันต้องทำงานพิเศษบางอย่างเพื่อค้นหาสิ่งที่ฉันต้องการเพื่อแก้ไขปัญหานี้:

  1. ใช่ คุณต้องสร้างบทบาทพิเศษสำหรับ Lambda เพื่อเข้าถึงและควบคุม VPC โดยทำตามคำแนะนำในหน้านี้: https://docs.aws.amazon.com/lambda/latest/dg/vpc-rds-create-iam-role.html
  2. เมื่อกำหนดบทบาทใหม่นี้ให้กับ Lambda ของคุณแล้ว คุณจะต้องใช้ VPC เดียวกันกับที่อินสแตนซ์ RDS ของคุณทำงานอยู่
  3. คุณต้องใช้กลุ่มความปลอดภัยเดียวกันในฟังก์ชัน Lambda ของคุณ ขั้นแรก ในอินสแตนซ์ RDS ของคุณ ค้นหากลุ่มความปลอดภัย แก้ไข และเพิ่มกฎขาเข้าเพื่อเข้าถึงพอร์ต DB จากทุกที่เพื่อการทดสอบ
  4. กำหนดกลุ่มความปลอดภัยที่คุณเพิ่งแก้ไขให้กับฟังก์ชัน Lambda ของคุณ

คุณต้องการคำแนะนำด้วยภาพหรือไม่? วิดีโอนี้ไม่ได้ยาวเกินไป และถึงแม้จะเป็นวิดีโอสำหรับ Python คำแนะนำก็ใช้ได้กับกรณีนี้: https://www.youtube.com/watch?v=-CoL5oN1RzQ

person Sergio D.    schedule 20.06.2018

สำหรับฉัน มันเป็นเพียงบทบาทความปลอดภัยของ RDS ที่จำกัดการเชื่อมต่อขาเข้าไปยังที่อยู่ IP ของฉัน ดังนั้นโดยธรรมชาติแล้วฉันสามารถเชื่อมต่อจากเครื่องในพื้นที่ของฉันได้ แต่ฟังก์ชัน lambda ของฉันไม่สามารถทำได้ เมื่อฉันเปิดมันสู่สาธารณะ (อย่างที่ Scherwin เขียนไว้ มันไม่เหมาะ แต่ใช้ได้กับการทดสอบและการเล่น) และปรับใช้ฟังก์ชันแลมบ์ดาของฉันอีกครั้ง (ใช่ฉันต้องปรับใช้โค้ดเดียวกันอีกครั้ง ไม่แน่ใจว่ามันจะส่งผลกระทบอย่างไร) ฟังก์ชันแลมบ์ดาของฉันสามารถเชื่อมต่อได้

ฉัน ไม่ จำเป็นต้องรวม lambda ของฉันไว้ใน VPC เดียวกัน เนื่องจากฐานข้อมูลของฉันสามารถเข้าถึงได้แบบสาธารณะ

ฉันไม่จำเป็นต้องแก้ไขหรือเพิ่มบทบาทความปลอดภัยใดๆ ให้กับแลมบ์ดาของฉัน

person Naguib Ihab    schedule 21.06.2018