使用VPC配置AWS lambda函数ConnectionError

时间:2016-08-17 02:27:56

标签: python aws-lambda amazon-vpc

我有一个AWS lambda函数来触发每日导入器作业

我使用的是“启动AWS Lambda函数”。为此,lambda_handler非常简单。 这是我正在做的伪代码:

try:
    cron_job = CloudCron()
    status = redis_get_importer_status(db_key, key)
    if status != 'running': 
        cron_job.login()
        redis_set_importer_status(db_key, key, 'running')
        cron_job.start_importer()
except Exception:
    exc_traceback = traceback.print_exc()
    print(exc_traceback)

此功能每15分钟由一次CloudWatch事件触发。

lambda函数无法运行lambda_handler并抱怨没有VPC的执行策略。为解决此问题,我为此角色附加了AWSLambdaVPCAccessExecutionRole Policy。虽然这运行了我的lamda_handler,但还有其他问题。尝试登录站点时,python请求模块抛出了ConnectionError。 我将超时时间增加到5分钟,内存增加到1GB,仍然看到了这个问题。

ConnectionError:HTTPSConnectionPool(host ='test.site.com.au',port = 443):使用url:/ auth / login超出最大重试次数(由NewConnectionError引起(':无法建立新连接) :[Errno 110]连接超时',))

我在我的VPC中运行了相同的lambda_handler,似乎无缝地工作。

我最终删除了redis设置状态并获取了lambda函数中的状态和lamba中的VPC配置并再次运行了lamda_handler,这似乎没有任何问题。

我需要VPC配置来设置和从redis服务器获取密钥。

感谢任何帮助!

干杯!

1 个答案:

答案 0 :(得分:2)

将Lambda函数放入VPC后,它只能访问VPC内的资源。它无法连接到test.site.com.au,因为它会解析为VPC外部的公共IP地址。您有几个方法可以解决此问题:

  • 将NAT网关添加到您的VPC。这将为您的Lambda函数提供Internet访问。
  • 如果您尝试访问的站点正在VPC内的服务器上运行,则使用专用IP地址而不是DNS名称。或者,在您的VPC中设置Route53私有托管区域,将该DNS名称解析为私有IP地址。