Запросы Python в AWS Lambda не могут подключиться к сайту за прокси

У меня есть функция AWS Lambda, которой необходимо подключиться к внутреннему веб-сайту, находящемуся за прокси-сервером. В моем коде я делаю следующее:

from botocore.vendored import requests

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

Запуск этого дает мне следующее сообщение об ошибке:

HTTPSConnectionPool (host = 'myproxyhost', port = 443): превышено максимальное количество повторных попыток с URL-адресом: myurl.json (вызвано ProxyError («Не удается подключиться к прокси-серверу», gaierror (-2, «Имя или служба неизвестна»))))

Я попытался заменить проксируемый URL-адрес на google.com, чтобы убедиться, что я могу подключаться к другим сайтам (без прокси-сервера).

Похоже, что адресное пространство, которое запускает Lambda, блокируется прокси.

Есть ли что-то еще, что мне нужно установить с помощью запросов и лямбда, чтобы заставить это работать?


person William Ross    schedule 14.11.2017    source источник
comment
Вы можете добавить https_proxy в качестве переменной среды в свою лямбда-функцию. это должно работать для вас.   -  person Usman Azhar    schedule 15.11.2017
comment
ваш внутренний веб-сайт, работающий в рамках VPC. Если это так, вы можете настроить лямбду для работы в том же VPC и разрешать внутренние имена.   -  person toske    schedule 15.11.2017
comment
Проксируемый веб-сайт, к которому я пытаюсь подключиться, не является частью VPC.   -  person William Ross    schedule 16.11.2017


Ответы (3)


EDIT: еще раз прочитав вопрос, я понял, что ошибка связана с разрешением имени (-2, 'Name or service not known'). Если вы используете внутренний Route53 для вашего VPC, приведенное ниже решение все равно должно работать, поскольку лямбда-функция будет использовать DNS-серверы VPC.

Похоже, либо лямбда-функция не работает в той же подсети, что и ваш экземпляр прокси-сервера, либо группа безопасности блокирует соединение. Починить это:

  • Создайте группу безопасности, чтобы разрешить лямбда-функции подключаться к порту 443 на вашем прокси-сервере.
  • Обновите свою лямбда-функцию, чтобы использовать эту группу безопасности И для выполнения внутри вашей подсети:

Этот скрипт должен это сделать:

#!/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

Затем назначьте созданную группу безопасности вашему экземпляру.

Надеюсь, поможет

person Filipe    schedule 25.11.2017
comment
Спасибо за информацию... сейчас экспериментирую. - person William Ross; 27.11.2017
comment
Даю вам кредит на ответ, так как это указывает мне в правильном направлении. Удалось подключиться к проксируемому URL-адресу из другого VPC, что заставило меня поверить в то, что VPC, который у меня заканчивается, имеет неправильную конфигурацию группы безопасности. - person William Ross; 28.11.2017

Мы можем использовать переменные среды лямбда и можем добавить https_proxy в качестве переменной среды для лямбда-функции. С помощью которого ваша лямбда-функция может получить доступ к веб-сайту через прокси.

person Usman Azhar    schedule 15.11.2017
comment
Разве это не просто устанавливает пару ключ-значение, которую можно распознать в коде? Есть ли у него какая-то другая польза? - person William Ross; 21.11.2017
comment
Это эквивалентно запуску export http_proxy ‹value› и может использоваться как с кодом, так и без него. Вам не нужно читать и снова устанавливать его явно в коде. - person Usman Azhar; 21.11.2017

Из них двое детей security groups и subnets. Вам нужно разрешить вашей лямбде доступ к подсети прокси, указав группу безопасности. Вот пошаговое руководство...

person Michał Zaborowski    schedule 21.11.2017
comment
Похоже, что это руководство предназначено для случаев, когда функции Lambda необходимо подключиться к чему-либо в VPC, однако сайт, к которому мне нужно подключиться, не находится в VPC, но требует прокси. Когда у меня есть EC2 с той же ролью, что и Lambda, EC2 может получить доступ к Lambda с помощью команды curl и ссылки на сайт, к которому я хочу подключиться. - person William Ross; 22.11.2017
comment
извините, что не понял - aws lambda outbound connection. Например, это руководство medium.com/@ филипфолли/ - person Michał Zaborowski; 22.11.2017