使用 VPC 配置时的 AWS lambda 函数 ConnectionError

AWS lambda function ConnectionError when configured with VPC

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

我为此使用 "A starter AWS Lambda function.",而 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 策略。虽然这个 运行 我的 lamda_handler,但还有其他问题。 python 请求模块在尝试登录站点时抛出 ConnectionError。 我将超时时间增加到 5 分钟,内存增加到 1GB,但仍然看到这个问题。

ConnectionError: HTTPSConnectionPool(host='test.site.com.au', port=443): Max retries exceeded with url: /auth/login (由 NewConnectionError(': Failed建立新连接:[Errno 110] 连接超时',))

我 运行 在我的 VPC 中使用相同的 lambda_handler 并且似乎可以无缝工作。

我终于删除了我的 lambda 函数中的 redis set status 和 get status 以及 lamba 中的 VPC 配置和 运行 lamda_handler ,这似乎没有任何问题。

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

感谢任何帮助!

干杯!

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

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