2017-11-14 88 views
6

Mam funkcję AWS Lambda, która musi łączyć się z wewnętrzną witryną, która znajduje się za serwerem proxy. W moim kodu mam następujący sposób:Żądania Pythona w AWS Lambda nie mogą się połączyć z witryną za serwerem proxy

from botocore.vendored import requests 

https_proxy = "https://myproxy:myport" 
proxyDict = { 
      "https" : https_proxy 
    } 
request.get("https://myurl.json", proxies=proxyDict) 

Running to daje mi się następujący komunikat o błędzie:

HTTPSConnectionPool (host = 'myproxyhost', port = 443): Max prób przekroczenia z adresem URL: myurl. json (Powodowane przez ProxyError ("Nie można połączyć się z serwerem proxy.", gaierror (-2, "Nazwa lub usługa nieznana")))

Próbowałem zastąpić proxied URL adresem google.com, aby potwierdzić, że mogę się połączyć z inne witryny (bez proxy).

Wygląda na to, że przestrzeń adresowa, którą uruchamia Lambda, zostaje zablokowana przez serwer proxy.

Czy jest jeszcze coś, co muszę ustawić z prośbami i lambda, aby to zadziałało?

+2

Możesz dodać https_proxy jako zmienną środowiskową do swojej funkcji lambda. to powinno działać dla ciebie. –

+0

to Twoja wewnętrzna strona internetowa działająca w ramach VPC. Jeśli tak, możesz skonfigurować lambdę na uruchamianie w tej samej VPC i rozwiązywać nazwy wewnętrzne. – toske

+0

Proxy witryny, z którą próbuję się połączyć, nie jest częścią VPC –

Odpowiedz

1

Możemy korzystać ze zmiennych środowiskowych lambda i możemy dodać https_proxy jako zmienną środowiskową do funkcji lambda. Dzięki której twoja funkcja lambda może uzyskać dostęp do strony internetowej za pośrednictwem serwera proxy.

+0

. Czy po prostu nie ustawi ona pary klucz-wartość, która może być rozpoznane w kodzie? Czy ma jakieś inne korzyści? –

+0

Jest to równoważne uruchomieniu eksportu http_proxy i może być używane z kodem lub bez niego. Nie musisz jej bezpośrednio czytać i ustawiać w swoim kodzie. –

1

Jest ich dwoje dzieci: security groups i subnets. Musisz zezwolić twojemu lambda na dostęp do podsieci proxy, zapewniając grupę bezpieczeństwa. Here jest krok po kroku tutorial ...

+0

Wygląda na to, że samouczek dotyczy sytuacji, w której funkcja Lambda musi łączyć się z czymś w VPC, jednak strona, z którą muszę się połączyć, nie jest w VPC, ale wymaga proxy. Kiedy mam EC2 z taką samą rolą jak Lambda, EC2 może dotrzeć do Lambdy za pomocą polecenia curl i odnośnika do strony, z którą chcę się połączyć. –

+0

Przepraszam za brakujący punkt - 'aws lambda outbound connection'. Na przykład ten tutorial https://medium.com/@philippholly/aws-lambda-enable-outgoing-internet-access-within-vpc-8dd250e11e12 –

1

EDIT: Po przeczytaniu pytanie jeszcze raz zdałem sobie sprawę, że błąd jest spowodowany rozpoznawania nazw (-2, 'Name or service not known'). Jeśli używasz wewnętrznej Route53 do swojej VPC, poniższe rozwiązanie powinno nadal działać, ponieważ funkcja lambda będzie korzystała z serwerów DNS VPC.

Wygląda na to, że funkcja lambda nie działa w tej samej podsieci instancji serwera proxy lub grupa zabezpieczeń blokuje połączenie. Aby to naprawić:

  • Utwórz grupę zabezpieczeń, aby umożliwić funkcja lambda do podłączenia do portu 443 na hosta proxy
  • Aktualizacja funkcji lambda użyć tej grupy zabezpieczeń I być wykonywane wewnątrz podsieci:

Ten skrypt powinien to zrobić:

#!/bin/bash 
# Fill the variables bellow with your vpc and subnet id 
VPC_ID="" 
SUBNET_IDS="" 
FUNCTION_NAME="" 

SEC_GROUP=$(aws ec2 create-security-group --group-name 'lambda-proxy' --vpc-id $VPC_ID --description 'Lambda/proxy communication' --output text) 
aws ec2 authorize-security-group-ingress --group-id ${SEC_GROUP} --protocol tcp --port 443 
aws lambda update-function-configuration --function-name $FUNCTION_NAME --vpc-config SubnetIds=$SUBNET_IDS,SecurityGroupIds=$SEC_GROUP 

Następnie przypisać utworzoną grupę zabezpieczeń do ins Tolerancja

Mam nadzieję, że pomoże

+0

Dzięki za informacje ... eksperymentowanie z nim teraz. –

+1

Udzielasz kredytu za odpowiedź, ponieważ to wskazuje mi na właściwy kierunek. Udało mi się uzyskać połączenie z serwerem proxy z innej VPC, co doprowadziło mnie do przekonania, że ​​VPC, z którego mam do czynienia, ma błędną konfigurację grupy bezpieczeństwa. –