SQS Timeout จาก Lambda ภายใน VPC
ฉันมีแลมด้าที่ต้องอยู่บน VPC เพื่อพูดคุยกับทรัพยากรที่มีการป้องกันเช่น RDS และ AWSDocumentDB นอกจากนี้ยังต้องสามารถมองเห็นโลกภายนอกได้สำหรับการเรียก API ของบุคคลที่สาม ในการทำเช่นนี้ฉันใช้วิซาร์ด VPC เพื่อสร้าง VPC ที่มีทั้งเครือข่ายย่อยสาธารณะและส่วนตัว ตัวช่วยสร้างยังสร้างและเชื่อมต่ออินเทอร์เน็ตเกตเวย์
หลังจากนี้ฉันได้แนบอินสแตนซ์ Lambda, RDS และคลัสเตอร์ DocumentDb เข้ากับ VPC อย่างไรก็ตามตั้งแต่นั้นมาฉันไม่สามารถพูดคุยกับคิว SQS ของฉันจากภายในแลมด้าโดยใช้ NodeJS aws-sdk
ฉันต้องการเพิ่มว่าฉันได้อ่านและใช้งานบางจุดจาก: AWS Lambda: ไม่สามารถเข้าถึง SQS Queue จากฟังก์ชัน Lambda ด้วยการเข้าถึง VPCแต่ฉันยังไม่สามารถเชื่อมต่อได้
นี่คือสิ่งที่ฉันมี:
VPC:
- VPC มีเครือข่ายย่อยสาธารณะและส่วนตัวและ IG Gateway ฉันใช้ตัวช่วยสร้างมันขึ้นมา ฉันไม่เข้าใจพื้นฐานของที่นี่มากนัก
- VPC Config (ขออภัยมันเป็นลิงค์ แต่ยังไม่ยอมให้ฝัง)
- CIDR - ตัวช่วยสร้างทั้งหมดยกเว้นบล็อกสุดท้าย ฉันไม่แน่ใจว่าฉันทำถูกต้องหรือไม่หรือว่ามันมีความสำคัญเนื่องจากวิซาร์ดทำให้ฉันสร้างอย่างน้อยหนึ่งตัวและฉันทำเช่นนั้นเพื่อหลีกเลี่ยงการทับซ้อนกันของ IP
- เนื่องจากนี่เป็นโครงการพัฒนา / ต้นแบบกลุ่มความปลอดภัยที่แนบมากับ VPC จึง 'เปิดกว้าง' อนุญาตให้เข้าและออกได้ทั้งหมด
- แจ้งให้ฉันทราบว่ามีการกำหนดค่า VPC อื่นใดบ้างที่จะแสดงเนื่องจากฉันไม่แน่ใจว่ามีประโยชน์อะไร
ปลายทางบริการ:
- ฉันพยายามสร้างจุดสิ้นสุดบริการสำหรับ SQS ตามบทความที่เชื่อมโยงด้านบนนี่คือสิ่งที่ฉันมี: endpoint config
- ฉันจะพูดเพิ่มเติมเกี่ยวกับวิธีที่ฉันบริโภคสิ่งนี้ในส่วน Lambda
- จุดสิ้นสุดแนบกับ VPC
แลมด้า:
- ฉันได้แลมบ์ดาที่แนบมากับ VPC ตามที่แสดงไว้ที่นี่
- สิ่งนี้ทำให้ฉันสามารถพูดคุยกับ API ของบุคคลที่สามที่เป็นสาธารณะและทรัพยากรที่ได้รับการป้องกันของฉัน ฉันหวังว่าการมี SG ที่เปิดกว้างจะทำให้แลมด้าของฉันคุยกับ SQS ได้ แต่มันก็หมดเวลา
- ฉันไม่แน่ใจว่าจะใช้URL ใดในแลมบ์ดาสำหรับปลายทางของฉัน ตัวอย่างที่นี่:https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-sending-messages-from-vpc.html ดูเหมือนว่ายังคงใช้ปลายทางของภูมิภาค
รหัส
นี่คือลักษณะการเรียกร้อง SQS จากภายในรหัสของฉัน:
-
const {SQS} = require('aws-sdk'); // Constructor Init const sqs = new SQS({ apiVersion: '2012-11-05', endpoint: 'https://sqs.us-west-2.amazonaws.com', // not sure if this is 'invoking' the vpc endpoint or not region: 'us-west-2' }); // Send message await sqs.sendMessage({ MessageBody: 'Test body', QueueUrl: 'https://sqs.us-west-2.amazonaws.com/<rest of URI>', MessageAttributes: {...someAttrs} }).promise();
-
ขอขอบคุณสำหรับความช่วยเหลือใด ๆ โปรดแจ้งให้เราทราบว่าฉันสามารถให้ข้อมูลอื่นใดได้บ้าง
ขอบคุณ!
** แก้ไข **
ฉันควรพูดถึงด้วยว่าเพื่อหลีกเลี่ยงปัญหาทั้งหมดนี้ฉันเริ่มที่จะใช้ SQS เป็น Lambda Destination แม้ว่าสิ่งนี้จะฉีดข้อความลงในคิวเป้าหมาย แต่ก็มีแนวโน้มที่จะไม่ปรับขนาดตามกรณีการใช้งานของฉัน ฉันสามารถอธิบายเพิ่มเติมได้หากจำเป็นเนื่องจากไม่เกี่ยวข้องกับคำถามจริงทั้งหมด
** แก้ไข 31/8/20 **
ขอบคุณสำหรับคำตอบทั้งหมดนี้เป็นความช่วยเหลือที่ดีและช่วยให้ฉันแก้ปัญหาได้ ฉันจะบอกว่าใครก็ตามที่พบโพสต์นี้ต้องดูครั้งแรก:
https://www.youtube.com/watch?v=JcRKdEP94jM
นี่คือสิ่งที่ฉันหวังว่าฉันจะพบก่อนที่จะเริ่มทั้งหมดนี้เพราะแม้ว่าจะมีเป้าหมายเฉพาะเพื่อให้การเข้าถึงอินเทอร์เน็ต lambdas แต่ก็ต้องผ่านขั้นตอนการแมป IG และ Nats กับเครือข่ายย่อยซึ่งเป็นจุดที่ฉันกำหนดค่า vpc ของฉันผิด ด้วยวิดีโอนี้ฉันได้สร้าง VPC ทั้งหมดขึ้นมาใหม่และมันสะอาดกว่าและเชื่อมต่อจุดต่างๆได้ง่ายขึ้นมาก 10/10 แนะนำ
ขอบคุณอีกครั้ง!
คำตอบ
ลางสังหรณ์ของฉันเกี่ยวกับเรื่องนี้คือมีกฎที่ขาดหายไปบางแห่งในการกำหนดค่าเครือข่ายของคุณ - แพ็กเก็ตจะถูกทิ้งไปยัง SQS ของคุณหรือระหว่างทางกลับ (ทั้งคู่ต้องใช้ความคิดผ่านการกระโดดโดยการกระโดด)
สามสิ่งที่อยู่ในใจ:
- การกำหนดเส้นทาง: ตรวจสอบให้แน่ใจว่าเครือข่ายย่อยและตารางเส้นทางมีเส้นทางที่เหมาะสมเพื่อรับแพ็กเก็ตกลับไปยังเครือข่ายย่อยส่วนตัวของคุณจากจุดที่ปลายทาง SQS อยู่
- กลุ่มความปลอดภัย - พิจารณา SG ที่เกี่ยวข้องอย่างรอบคอบ SQS อาจอยู่ใน SG ที่ จำกัด การเข้าถึงตัวอย่างเช่น
- ACL ของเครือข่าย - สิ่งเหล่านี้ไม่มีสถานะดังนั้นคุณจะต้องตรวจสอบให้แน่ใจว่าทั้งสองฝ่ายเปิดอยู่และจำไว้ว่าส่วนใหญ่แล้วจะมีหมายเลขพอร์ตแบบสุ่มที่เกี่ยวข้องกลับไปยังผู้ร้องขอ
โชคดี!
ควรแนบฟังก์ชัน AWS Lambda เข้ากับเครือข่ายย่อยส่วนตัวใน VPC
Amazon SQS อาศัยอยู่บนอินเทอร์เน็ตดังนั้นฟังก์ชัน Lambda จึงต้องการวิธีการเข้าถึงปลายทาง SQS
ตัวเลือกที่ 1: VPC Endpoint
VPC ปลายทางสำหรับ Amazon SQSสามารถให้การเชื่อมโยงโดยตรงระหว่าง VPC และปลายทาง SQS ที่โดยไม่ต้องมีอินเทอร์เน็ต เมื่อสร้างแล้ว VPC จะส่งคำขอ SQS ข้ามปลายทาง VPC โดยอัตโนมัติ นี่เป็นตัวเลือกที่ดีและเรียบง่าย
ตัวเลือกที่ 2: NAT Gateway
ถ้าคุณมีทรัพยากรเพิ่มเติมในเครือข่ายย่อยส่วนตัว (s) ที่จำเป็นต้องมีการเข้าถึงอินเทอร์เน็ตคุณสามารถพิจารณาการวางNAT เกตเวย์ในเครือข่ายย่อยที่สาธารณะ ซับเน็ตส่วนตัวจะต้องมีรายการตารางเส้นทางที่นำการรับส่งข้อมูลที่เชื่อมต่ออินเทอร์เน็ต ( 0.0.0.0/0) ไปยัง NAT Gateway
มีค่าใช้จ่ายเพิ่มเติม
ตัวเลือกที่ 3: Lambda Destination
หากคุณมีฟังก์ชั่น Lambda ที่สามารถสื่อสาร SQS ผ่าน Lambda Destination ได้สำเร็จสิ่งนี้ดูเหมือนจะเป็นตัวเลือกที่ยอดเยี่ยม ! ฉันยังไม่ได้ลองใช้ แต่ดูเหมือนว่าบริการ Lambda จะรับผิดชอบในการส่งเอาต์พุตไปยัง SQS โดยตรงโดยไม่ต้องข้ามผ่าน VPC หรืออินเทอร์เน็ต หากใช้งานได้ฉันขอแนะนำให้ใช้ต่อไป ฉันไม่เห็นปัญหาการปรับขนาดใด ๆ โดยใช้วิธีนี้ อย่างไรก็ตามโปรดทราบว่ามันจะทำงานเฉพาะสำหรับการโทรไม่ตรงกันจะแลมบ์ดาและจะไม่ทำงานเช่นเมื่อเรียกใช้ฟังก์ชั่นพร้อมกันหรือโดยการกดทดสอบปุ่ม