我有一个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来使其工作吗?
答案 0 :(得分:1)
我们可以使用lambda环境变量,并可以将https_proxy作为环境变量添加到lambda函数中。 lambda函数可以通过代理访问网站。
答案 1 :(得分:1)
他们有两个孩子security groups
和subnets
。您需要允许lambda通过提供安全组来访问代理的子网。 Here是一步一步的教程......
答案 2 :(得分:1)
编辑:再次阅读问题后,我意识到错误是由名称解析(-2, 'Name or service not known')
引起的。如果您使用内部Route53作为您的VPC,下面的解决方案应该仍然有效,因为lambda函数将使用VPC的DNS服务器。
似乎lambda函数没有在代理实例的同一子网上运行,或者安全组阻止了连接。解决它:
这个脚本应该这样做:
#!/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
然后将创建的安全组分配给您的实例。
希望有所帮助