SQS Timeout จาก Lambda ภายใน VPC

Aug 28 2020

ฉันมีแลมด้าที่ต้องอยู่บน VPC เพื่อพูดคุยกับทรัพยากรที่มีการป้องกันเช่น RDS และ AWSDocumentDB นอกจากนี้ยังต้องสามารถมองเห็นโลกภายนอกได้สำหรับการเรียก API ของบุคคลที่สาม ในการทำเช่นนี้ฉันใช้วิซาร์ด VPC เพื่อสร้าง VPC ที่มีทั้งเครือข่ายย่อยสาธารณะและส่วนตัว ตัวช่วยสร้างยังสร้างและเชื่อมต่ออินเทอร์เน็ตเกตเวย์

หลังจากนี้ฉันได้แนบอินสแตนซ์ Lambda, RDS และคลัสเตอร์ DocumentDb เข้ากับ VPC อย่างไรก็ตามตั้งแต่นั้นมาฉันไม่สามารถพูดคุยกับคิว SQS ของฉันจากภายในแลมด้าโดยใช้ NodeJS aws-sdk

ฉันต้องการเพิ่มว่าฉันได้อ่านและใช้งานบางจุดจาก: AWS Lambda: ไม่สามารถเข้าถึง SQS Queue จากฟังก์ชัน Lambda ด้วยการเข้าถึง VPCแต่ฉันยังไม่สามารถเชื่อมต่อได้

นี่คือสิ่งที่ฉันมี:

  1. VPC:

    • VPC มีเครือข่ายย่อยสาธารณะและส่วนตัวและ IG Gateway ฉันใช้ตัวช่วยสร้างมันขึ้นมา ฉันไม่เข้าใจพื้นฐานของที่นี่มากนัก
    • VPC Config (ขออภัยมันเป็นลิงค์ แต่ยังไม่ยอมให้ฝัง)
    • CIDR - ตัวช่วยสร้างทั้งหมดยกเว้นบล็อกสุดท้าย ฉันไม่แน่ใจว่าฉันทำถูกต้องหรือไม่หรือว่ามันมีความสำคัญเนื่องจากวิซาร์ดทำให้ฉันสร้างอย่างน้อยหนึ่งตัวและฉันทำเช่นนั้นเพื่อหลีกเลี่ยงการทับซ้อนกันของ IP
    • เนื่องจากนี่เป็นโครงการพัฒนา / ต้นแบบกลุ่มความปลอดภัยที่แนบมากับ VPC จึง 'เปิดกว้าง' อนุญาตให้เข้าและออกได้ทั้งหมด
    • แจ้งให้ฉันทราบว่ามีการกำหนดค่า VPC อื่นใดบ้างที่จะแสดงเนื่องจากฉันไม่แน่ใจว่ามีประโยชน์อะไร
  2. ปลายทางบริการ:

    • ฉันพยายามสร้างจุดสิ้นสุดบริการสำหรับ SQS ตามบทความที่เชื่อมโยงด้านบนนี่คือสิ่งที่ฉันมี: endpoint config
    • ฉันจะพูดเพิ่มเติมเกี่ยวกับวิธีที่ฉันบริโภคสิ่งนี้ในส่วน Lambda
    • จุดสิ้นสุดแนบกับ VPC
  3. แลมด้า:

    • ฉันได้แลมบ์ดาที่แนบมากับ VPC ตามที่แสดงไว้ที่นี่
    • สิ่งนี้ทำให้ฉันสามารถพูดคุยกับ API ของบุคคลที่สามที่เป็นสาธารณะและทรัพยากรที่ได้รับการป้องกันของฉัน ฉันหวังว่าการมี SG ที่เปิดกว้างจะทำให้แลมด้าของฉันคุยกับ SQS ได้ แต่มันก็หมดเวลา
    • ฉันไม่แน่ใจว่าจะใช้URL ใดในแลมบ์ดาสำหรับปลายทางของฉัน ตัวอย่างที่นี่:https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-sending-messages-from-vpc.html ดูเหมือนว่ายังคงใช้ปลายทางของภูมิภาค
  4. รหัส

    • นี่คือลักษณะการเรียกร้อง 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 แนะนำ

ขอบคุณอีกครั้ง!

คำตอบ

1 ChrisTrahey Aug 29 2020 at 05:28

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

สามสิ่งที่อยู่ในใจ:

  1. การกำหนดเส้นทาง: ตรวจสอบให้แน่ใจว่าเครือข่ายย่อยและตารางเส้นทางมีเส้นทางที่เหมาะสมเพื่อรับแพ็กเก็ตกลับไปยังเครือข่ายย่อยส่วนตัวของคุณจากจุดที่ปลายทาง SQS อยู่
  2. กลุ่มความปลอดภัย - พิจารณา SG ที่เกี่ยวข้องอย่างรอบคอบ SQS อาจอยู่ใน SG ที่ จำกัด การเข้าถึงตัวอย่างเช่น
  3. ACL ของเครือข่าย - สิ่งเหล่านี้ไม่มีสถานะดังนั้นคุณจะต้องตรวจสอบให้แน่ใจว่าทั้งสองฝ่ายเปิดอยู่และจำไว้ว่าส่วนใหญ่แล้วจะมีหมายเลขพอร์ตแบบสุ่มที่เกี่ยวข้องกลับไปยังผู้ร้องขอ

โชคดี!

3 JohnRotenstein Aug 28 2020 at 04:51

ควรแนบฟังก์ชัน 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 หรืออินเทอร์เน็ต หากใช้งานได้ฉันขอแนะนำให้ใช้ต่อไป ฉันไม่เห็นปัญหาการปรับขนาดใด ๆ โดยใช้วิธีนี้ อย่างไรก็ตามโปรดทราบว่ามันจะทำงานเฉพาะสำหรับการโทรไม่ตรงกันจะแลมบ์ดาและจะไม่ทำงานเช่นเมื่อเรียกใช้ฟังก์ชั่นพร้อมกันหรือโดยการกดทดสอบปุ่ม