Thời gian chờ SQS từ Lambda trong VPC
Tôi có một Lambda cần phải ở trên VPC để nói chuyện với các tài nguyên được bảo vệ như RDS và AWSDocumentDB. Nó cũng cần có khả năng nhìn ra thế giới bên ngoài đối với một số lệnh gọi tới API của bên thứ ba. Để thực hiện việc này, tôi đã sử dụng trình hướng dẫn VPC để tạo một VPC có cả mạng con công cộng và riêng tư. Trình hướng dẫn cũng tạo và đính kèm Cổng Internet.
Sau đó, tôi đính kèm Lambda, phiên bản RDS và cụm DocumentDb vào VPC. Tuy nhiên, kể từ đó, tôi đã không thể nói chuyện với hàng đợi SQS của mình từ bên trong lambda của mình bằng NodeJS aws-sdk.
Tôi muốn nói thêm rằng tôi đã đọc và triển khai một số điểm từ: AWS Lambda: Không thể truy cập Hàng đợi SQS từ một hàm Lambda có quyền truy cập VPC tuy nhiên tôi vẫn không thể kết nối.
Đây là những gì tôi có:
VPC:
- VPC có các mạng con công cộng và riêng tư, và một Cổng IG. Tôi đã sử dụng trình hướng dẫn để tạo nó. Tôi không hiểu nhiều cơ sở ở đây.
- VPC Config (xin lỗi vì đây là một liên kết, nó sẽ không cho phép tôi nhúng.)
- CIDR's - trình hướng dẫn đã tạo tất cả trừ khối cuối cùng. Tôi không chắc liệu mình đã làm điều này có đúng không hay nó thậm chí còn quan trọng vì trình hướng dẫn đã yêu cầu tôi tạo ít nhất một cái và tôi đã làm vậy để tránh chồng chéo IP.
- Vì đây là một dự án dành cho nhà phát triển / nguyên mẫu nên nhóm bảo mật gắn liền với VPC là 'rộng mở'. Tất cả gửi đến và đi đều được phép.
- Hãy cho tôi biết cấu hình VPC nào khác sẽ hiển thị vì tôi không chắc cái gì hữu ích
Điểm cuối dịch vụ:
- Tôi đã thử tạo điểm cuối dịch vụ cho SQS theo bài viết được liên kết ở trên, đây là những gì tôi có: cấu hình điểm cuối
- Tôi sẽ nói thêm về cách tôi tiêu thụ thứ này trong phần Lambda.
- Điểm cuối được gắn với VPC
Lambda:
- Tôi có Lambda gắn với VPC như được hiển thị ở đây .
- Điều này cho phép tôi nói chuyện với api của bên thứ 3 công khai và các tài nguyên được bảo vệ của tôi. Tôi hy vọng rằng có một SG rộng mở sẽ vẫn cho phép lambda của tôi nói chuyện với SQS nhưng nó cứ hết thời gian.
- Tôi không chắc sẽ sử dụng url nào trong Lambda cho điểm cuối của mình. Ví dụ ở đây:https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-sending-messages-from-vpc.html có vẻ như nó vẫn sử dụng điểm cuối khu vực.
Mã
Đây là lệnh gọi SQS trông như thế nào từ trong mã của tôi:
-
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();
-
Đánh giá cao bất kỳ sự giúp đỡ nào, vui lòng cho tôi biết những thông tin khác mà tôi có thể cung cấp.
Cảm ơn!
** Biên tập **
Tôi cũng nên đề cập rằng để tránh toàn bộ vấn đề này, tôi bắt đầu đi xuống con đường sử dụng SQS làm Đích Lambda. Mặc dù điều này thực hiện đưa các thông báo vào hàng đợi đích, nhưng nó có thể sẽ không mở rộng với trường hợp sử dụng của tôi. Tôi có thể giải thích thêm về điều đó nếu cần vì nó không hoàn toàn phù hợp với câu hỏi thực tế.
** CHỈNH SỬA 8/31/20 **
Cảm ơn vì tất cả các câu trả lời, đó là một sự trợ giúp tuyệt vời và giúp tôi giải quyết. Tôi sẽ nói rằng với bất kỳ ai khác tìm thấy bài đăng này là hãy xem trước:
https://www.youtube.com/watch?v=JcRKdEP94jM
Đây là thứ mà tôi ước mình tìm thấy trước khi bắt đầu tất cả vì, mặc dù nó nhắm mục tiêu cụ thể để cấp cho lambdas truy cập internet, nhưng nó trải qua quá trình ánh xạ IG và Nats tới các mạng con, đây thực sự là nơi tôi đã định cấu hình sai vpc của mình. Với video này, tôi đã đi và tạo lại toàn bộ VPC của mình và việc kết nối các điểm trở nên gọn gàng và dễ dàng hơn rất nhiều. 10/10 giới thiệu.
Cảm ơn một lần nữa!
Trả lời
Linh cảm của tôi về điều này là có một quy tắc bị thiếu ở đâu đó trong cấu hình mạng của bạn - Các gói tin bị rơi về phía SQS của bạn hoặc trên đường quay trở lại (cả hai đều cần suy nghĩ thông qua từng bước nhảy).
Ba điều tôi nghĩ đến:
- Định tuyến: Đảm bảo rằng các mạng con và (các) bảng định tuyến có các tuyến đường thích hợp để đưa các gói trở lại mạng con riêng tư của bạn từ mạng nơi có điểm cuối SQS.
- Các nhóm bảo mật - Xem kỹ từng SG có liên quan. Ví dụ: SQS có thể nằm trong SG hạn chế quyền truy cập vào nó.
- Mạng ACL - đây là những mạng không trạng thái, vì vậy bạn sẽ cần đảm bảo cả hai bên đều mở và hãy nhớ rằng hầu hết thời gian, sẽ có số cổng ngẫu nhiên liên quan đến việc quay trở lại người yêu cầu.
Chúc may mắn!
Hàm AWS Lambda phải được gắn vào một mạng con riêng trong VPC.
Amazon SQS hoạt động trên Internet, vì vậy hàm Lambda cần một cách để truy cập điểm cuối SQS.
Tùy chọn 1: Điểm cuối VPC
Điểm cuối VPC cho Amazon SQS có thể cung cấp liên kết trực tiếp giữa VPC và điểm cuối SQS mà không yêu cầu truy cập Internet. Sau khi được tạo, VPC sẽ tự động gửi các yêu cầu SQS qua VPC Endpoint. Đây là một lựa chọn tốt, đơn giản.
Tùy chọn 2: Cổng NAT
Nếu bạn có thêm tài nguyên trong (các) mạng con riêng tư yêu cầu truy cập Internet, bạn có thể cân nhắc việc đặt NAT Gateway trong một mạng con công cộng . (Các) mạng con riêng sẽ cần một mục nhập Bảng tuyến hướng lưu lượng truy cập liên kết Internet ( 0.0.0.0/0) đến Cổng NAT.
Phụ phí được áp dụng.
Tùy chọn 3: Điểm đến Lambda
Nếu bạn có hàm Lambda giao tiếp thành công SQS qua Lambda Destination, thì đây có vẻ là một lựa chọn tuyệt vời ! Tôi chưa thử, nhưng có vẻ như dịch vụ Lambda chịu trách nhiệm gửi đầu ra trực tiếp đến SQS mà không cần phải chuyển qua VPC hoặc Internet. Nếu điều này đang hoạt động, thì tôi thực sự khuyên bạn nên tiếp tục sử dụng nó. Tôi không nhận thấy bất kỳ vấn đề mở rộng nào khi sử dụng phương pháp này. Tuy nhiên, xin lưu ý rằng nó chỉ hoạt động đối với các lệnh gọi không đồng bộ đến Lambda và sẽ không hoạt động, ví dụ: khi gọi hàm đồng bộ hoặc bằng cách nhấn nút Kiểm tra .