AWS Lambda中的Python请求无法连接到代理后面的站点

时间:2017-11-14 21:53:34

标签: python amazon-web-services proxy 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,'名称或服务未知')))

我尝试用google.com替换代理网址,以确认我可以连接到其他网站(没有代理)。

看起来Lambda运行它的地址空间被代理阻止。

我需要设置一些其他的请求和lambda来使其工作吗?

3 个答案:

答案 0 :(得分:1)

我们可以使用lambda环境变量,并可以将https_proxy作为环境变量添加到lambda函数中。 lambda函数可以通过代理访问网站。

答案 1 :(得分:1)

他们有两个孩子security groupssubnets。您需要允许lambda通过提供安全组来访问代理的子网。 Here是一步一步的教程......

答案 2 :(得分:1)

编辑:再次阅读问题后,我意识到错误是由名称解析(-2, 'Name or service not known')引起的。如果您使用内部Route53作为您的VPC,下面的解决方案应该仍然有效,因为lambda函数将使用VPC的DNS服务器。

似乎lambda函数没有在代理实例的同一子网上运行,或者安全组阻止了连接。解决它:

  • 创建一个安全组以允许lambda函数连接到代理主机上的端口443
  • 更新lambda函数以使用该安全组 AND 在您的子网内执行:

这个脚本应该这样做:

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

然后将创建的安全组分配给您的实例。

希望有所帮助