Lambda 函数无法连接到 S3“请求发送失败”

问题描述 投票:0回答:1

我想在 Lambda Function 上部署我在 GitHub 上共享的项目。为此,我将 AWS CDK 添加到项目中。一切运行良好,程序由 API 网关执行。但是,应用程序无法连接到 S3。这是错误详细信息:

START RequestId: 800fb738-cd7f-4368-8757-46563c802cfd Version: $LATEST
2024/03/12 21:03:25 Processing request data for user Berkan with test_match.dem file.
2024/03/12 21:04:57 Error downloading file: operation error S3: GetObject, exceeded maximum number of attempts, 3, https response error StatusCode: 0, RequestID: , HostID: , request send failed, Get "https://csense-demos.s3.eu-central-1.amazonaws.com/test_match.dem?x-id=GetObject": dial tcp 52.219.47.148:443: i/o timeout
2024/03/12 21:04:57 unexpected EOF
2024/03/12 21:04:57 unexpected EOF
RequestId: 800fb738-cd7f-4368-8757-46563c802cfd Error: Runtime exited with error: exit status 1
Runtime.ExitError
END RequestId: 800fb738-cd7f-4368-8757-46563c802cfd
REPORT RequestId: 800fb738-cd7f-4368-8757-46563c802cfd    Duration: 91709.49 ms    Billed Duration: 91710 ms    Memory Size: 128 MB    Max Memory Used: 48 MB    Init Duration: 176.00 ms    

起初,我认为这与 Lambda Function 所在的 VPC 及其公有子网有关(我附上了截图),但我认为一切都是应该的。当我使用 AWS Toolkit 在本地计算机上尝试 Lambda Function 时,一切正常;它连接到同一个 S3 并根据需要执行操作。

您可以在GitHub上直接看到Stack。

此外,您还可以在这里找到通过Lambda函数执行的代码。

amazon-web-services go aws-lambda amazon-vpc
1个回答
0
投票

在 VPC 内部署 lambda 时,我们需要弄清楚如下的路由方面,

  • 如果需要访问互联网,则必须将其部署在私有子网中 您有到 NAT-GW 或某种类型的默认路由 防火墙/代理(如果您不使用 AWS 提供的 NAT-GW)
  • 由于 VPC 内的 lambda 使用 ENI,请确保您在 SG 的附加出站规则和子网上的 NACL(入站/出站)(超时 通常是由于这个原因发生的)。
  • 如果 lambda 需要访问 S3,请使用 S3 网关端点或 S3 接口端点。如果使用网关类型,请确保您的 Lambda 子网具有路由条目,即使您当前的子网是公共子网,这也能正常工作。另一方面,如果您使用接口端点,则不需要路由,但您不能使用标准 s3 端点,而是必须显式传递 S3 端点,如 this。更重要的一件事是确保您的 VPC 终端节点策略不会阻止。
  • 最后但并非最不重要的一点是确保 lambda 执行角色具有必要的权限。在您的情况下,这可能不是问题,因为错误可能更多是 AccessDenied 而不是超时

如果您的 lambda 不访问 VPC 内的任何资源,则无需使用 VPC 配置进行部署,或者 VPC 内的任何资源需要调用 Lambda,则您可以为 Lambda 设置 VPC 接口端点。

希望这会有所帮助,如果没有添加 SG-Outbound/NACL-Inbound-Outbound/路由表条目,您也可以检查 lambda ENI 上的 VPC 流日志是否有任何被拒绝的流量。

© www.soinside.com 2019 - 2024. All rights reserved.