如何使用 Lambda 函数对 URI 的连接问题进行故障排除?

上次更新日期:2022 年 7 月 8 日

我在使用基于 Amazon VPC 的 AWS Lambda 函数时遇到了连接问题,导致出现错误。如何排查此问题?

简短描述

当您尝试针对远程端点或服务运行 Amazon Virtual Private Cloud (Amazon VPC) Lambda 函数时,您会收到与连接相关的错误提示。这可能是由于网络连接问题导致错误消息所致。例如,您尝试创建 DynamoDB 表,但操作超时。

解决方法

创建一个测试函数,以复制要测试的目标函数的网络配置。当您无法编辑目标函数以添加故障排除日志时,此功能非常有用。有关如何为 VPC 访问配置 Lambda 的更多信息,请参阅配置 Lambda 函数以访问 VPC 中的资源

这是定义的测试函数的示例:

import socket

def connect_tcp(event, context):
  sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  sock.settimeout(8)
  hostname = "www.amazon.com"
  port = 443
  server_address = (hostname, port) # Server address and port
  try:
    IPAddr = socket.gethostbyname(hostname)
    print("Hostname: " + hostname)
    print("Host IP:" + IPAddr)
    print("Attempting to connect ..")
    sock.connect(server_address)
    sock.shutdown(socket.SHUT_RDWR)
    print("connected")
  except Exception as e:
    print("-- Error --")
    print(e)
  finally:
    sock.close()

在此示例中,套接字超时设置为 8 秒,这要求在该时间内建立连接,否则连接将失败。如有必要,您可以调整此值。

套接字库是一个运行时依赖项,默认情况下不与 Python 运行时捆绑在一起。将其作为部署包的一部分或包含在与该函数关联的层中。有关如何使用 zip 存档部署依赖项的信息,请参阅使用 .zip 文件存档部署 Python Lambda 函数。有关如何将依赖项部署为层的信息,请参阅将层与 Lambda 函数结合使用

注意:尝试复制目标函数的运行时是一种最佳实践。测试函数是用 Python 编写的,但可以移植到其他运行时。

测试功能到位后,使用以下步骤进行故障排除:
  1. 设置主机名和端口变量,使其与目标函数尝试建立连接的变量相匹配。
  2. 镜像目标函数的网络配置(子网和安全组)。
  3. 设置函数超时值以适应任何开销。最佳做法是确保函数超时高于套接字连接超时以允许连接。
  4. 运行测试。

如果测试失败,则可能存在必须调查的连接问题。如果测试成功,则 Lambda Amazon VPC 环境(包括安全组)与端点之间可能存在连接。在这种情况下,目标函数及其任何依赖项可能存在问题。

注意:最佳做法是检查测试功能是否在与故障目标函数相似的子网中启动,其中涉及具有不同路由配置文件的多个子网。

如果未知出现故障的子网为哪个,请按照以下步骤轮流浏览子网以确定出现故障的子网:

  1. 指定第一个子网,忽略可用性警告,因为您不会将其部署到生产平台。
  2. 测试函数。
  3. 指定下一个子网,然后再次测试。
  4. 重复前面的步骤,直到检查完所有子网。

这篇文章对您有帮助吗?


您是否需要账单或技术支持?