AWS Lambda: Unable to access SQS-Warteschlange aus einer Lambda-Funktion mit VPC auf
Habe ich eine Lambda-Funktion, die Bedürfnisse zum Lesen von Nachrichten aus einer SQS-Warteschlange unter Verwendung Ihrer URL. Dann muss man es einfügen, die Daten zu Cassandra, die auf einem server innerhalb einer VPC.
Ich bin in der Lage, den Zugriff auf die Cassandra-server von meinem Lambda-Funktion, verwenden Sie private IP und die Konfiguration der security-Gruppen richtig.
Allerdings bin ich nicht in der Lage, Lesen von Nachrichten aus der SQS-Warteschlange. Wenn ich ändern Sie die Konfiguration von Lambda-Funktion zu No VPC
bin, dann bin ich in der Lage, die Nachrichten Lesen, die von der SQS Queue. Aber mit VPC Einstellungen, es einfach mal aus.
Wie kann ich das umgehen ? Ich habe die security-Gruppe von meinem Lambda-Funktion hat die volle ausgehenden Zugriff auf alle IP-Adressen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einige Dienste (z.B. S3) bieten VPC-Endpunkte zu lösen dieses problem, aber die SQS ist nicht einer von Ihnen. Ich denke die einzige wirkliche Lösung für dieses problem ist, um einen NAT-innen Ihre VPC, damit der Netzwerkverkehr von der Lambda-Funktion geroutet werden können, die außerhalb der Welt.
0.0.0.0/0
mit dem Ziel die id des neu erstellten NAT-gateway. Allerdings gab es bereits einen Eintrag für Internet-gateway mit dem gleichen Ziel. Ist es sicher zu ersetzen ?In der Ende 2018, AWS angekündigten Unterstützung für die SQS-Endpunkte, die
Gibt es ein tutorial für Das senden von Nachrichten an eine Amazon SQS-Warteschlange aus der Amazon Virtual Private Cloud
Siehe auch die SQS VPC-Endpunkte Dokumentation für weitere Informationen.
Ist es wichtig zu beachten, dass, wenn Sie zugreifen möchten, SQS, die innerhalb der Lambda-VPC-es gibt ein paar andere Dinge, die Sie tun müssen:
endpoint_url
zu "https://sqs.us-west-2.amazonaws.com"Make sure that you have attached a "wide open" security group to the SQS VPC Interface, otherwise SQS will not work.
Wenn Sie fügen einem weiten outbound security group policy, dann brauchen Sie nicht eine VPC Endpunkt mit SQS-service. Sie Lambda kann direkt aufrufen öffentlich zugänglich SQS Endpunkt direkt.Ich lief in die gleiche Art von problem als ich mit einer lambda-Funktion mit Zugriff auf elasticache auf dem VPC. Während die Funktion zum ausführen konfiguriert wurde, die in der VPC, ich war nicht in der Lage zu sprechen, um alle anderen Dienstes (insbesondere codedeploy für mich).
Als @garnaat wies darauf hin NAT zu sein scheint der einzige Weg zu gehen über die Lösung dieses Problems für Dienstleistungen ohne VPC-Endpunkte.
Und wie Sie wies darauf hin, ich lief auch in die gleichen Probleme, wenn ich könnte ' NT SSH in die Maschine(N) einmal ersetzte ich den Eintrag mit der IGW in der route-Tabelle. Scheint abnehmen der IGW verhungert VPC entweder der eingehende Verkehr (meistens) oder den ausgehenden Datenverkehr vom oder zum internet beziehungsweise. So, hier ist, was ich Tat und es funktionierte für mich:
Erstellen eines neuen Subnetzes in der VPC
Nun, wenn lambda läuft, stellen Sie sicher, dass die lambda arbeitet aus diesem Subnetz.
Sie können dies tun, indem Sie mithilfe von aws-cli-etwa so:
Stellen Sie sicher, fügen Sie alle Sicherheits-Gruppen, deren eingehenden und ausgehenden Datenverkehr Regeln gelten für Ihre lambda-Funktion.
Nächsten, gehen Sie bis Route-Tabellen in der VPC-Konsole und erstellen Sie eine neue route-Tabelle.
Hier ist, wo Sie hinzufügen, das NAT-gateway zum Ziel.
schließlich gehen die Subnetz-Registerkarte "Verknüpfungen" in der neuen ROUTING-Tabelle und fügen Sie die neu erstellte Subnetz gibt.
Thats all dies sollte um es arbeiten . Bedenken Sie, bitte behandeln Sie dies als nur ein workaround. Ich habe nicht viel getan, Graben und ich haben eine sehr begrenzte Vorstellung, wie die Dinge gelöst werden intern während dies zu tun. Dies ist vielleicht nicht eine ideale Lösung.
Die ideale Lösung zu sein scheint, das design des VPC-vor der hand. Verwenden Subnetze zu isolieren Ressourcen/Instanzen benötigen einen internet-Zugang und, die nicht(private und öffentliche Subnetze) und entsprechende gateways, wo nötig.( so dass Sie möglicherweise nicht über die zum erstellen einer separaten Subnetz für diesen Zweck später). Dank
Ich war nicht in der Lage zu bekommen, entweder von der andere zwei Antworten auf diese Frage zu arbeiten. Vielleicht ist dies aufgrund eines oder mehrerer Fehler auf meinem Teil. Unabhängig davon, habe ich einen workaround finden, die ich wollte zu teilen, falls ich nicht alleine bin mit diesem problem.
Lösung: ich erstellt zwei Lambda-Funktionen. Die ersten Lambda-Funktion läuft in meinem VPC und führt die gewünschte Arbeit (in mandeep_m91 Fall, dass ein einfügen von Daten zu Cassandra; in meinem Fall war der Zugriff auf eine RDS-Instanz). Die zweiten Lambda-Funktion ein Leben außerhalb der VPC, also ich könnte es Haken bis zu der SQS queue. Ich hatte dann die zweite Lambda-Funktion aufrufen, die ersten, die Verwendung von Informationen dieser diese StackOverflow-Q&A Antwort. Beachten Sie, dass die verknüpfte Frage hat sowohl node.js und Python-Beispiele in den Antworten.
Dies wird effektiv die doppelte, die Kosten der Herstellung eine Funktion aufrufen, da jeder Aufruf führt in der Funktion zwei Ausführungen. Allerdings, für meine situation, die Lautstärke ist so gering, es wird nicht einen echten Unterschied machen.