尝试将 AWS S3 SDK 与 lambda (Node.js) 结合使用时出现超时响应

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

我的 Lambda 可以在除 S3 之外的所有服务上正常运行。我尝试执行的任何操作都会挂起并且超时。出于测试目的,我使用默认的 vpc 配置。

我已将 S3 完全访问策略附加到 Lambda 的角色。

我的功能:

import AWS from "aws-sdk";

export const handler = async (event) => {
  var s3 = new AWS.S3();
  try {
    var params = { 
      Bucket: 'bucket-name',
      Key: 'original-b31a4e7537250988ddd0a7e6c241c64b.png'
    }

    let res = await s3.getObject(params).promise();

    console.log(res);
  } catch (error) {
    console.error(error);
  }
}

回应:

{
  "errorMessage": "2024-11-16T17:53:39.400Z a4412f66-e960-4f0f-ac3d-c1c71e6bc81a Task timed out after 63.07 seconds"
}
node.js amazon-web-services amazon-s3 aws-lambda timeout
1个回答
1
投票

您的 Lambda 驻留在 VPC 内,因此它没有直接连接到互联网。 S3是一个外部服务。如果没有互联网访问,您的 Lambda 将因无法访问 S3 而挂起。

其他服务可以正常运行,因为 AWS 提供 VPC 端点,但是如果您的 Lambda 驻留在 VPC 中,S3 需要额外的步骤。

要解决这个问题,您需要:

  1. 添加 S3 VPC 端点

    • 在运行 Lambda 函数的 VPC 中创建 S3 VPC 终端节点。

    • 这允许您的 Lambda 无需访问互联网即可私下连接到 S3。

  1. 使用 NAT 网关或 NAT 实例

    • 如果您希望 Lambda 具有完整的互联网访问权限,请在公有子网中部署 NAT 网关或 NAT 实例。

    • 确保 Lambda 的私有子网路由表指向互联网流量的 NAT 网关。

如果您的 Lambda 不需要访问私有 VPC 内的资源(例如 RDS 或私有 EC2 实例),最简单的解决方法是在 VPC 外部运行 Lambda。

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