我的 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"
}
您的 Lambda 驻留在 VPC 内,因此它没有直接连接到互联网。 S3是一个外部服务。如果没有互联网访问,您的 Lambda 将因无法访问 S3 而挂起。
其他服务可以正常运行,因为 AWS 提供 VPC 端点,但是如果您的 Lambda 驻留在 VPC 中,S3 需要额外的步骤。
要解决这个问题,您需要:
添加 S3 VPC 端点
• 在运行 Lambda 函数的 VPC 中创建 S3 VPC 终端节点。
• 这允许您的 Lambda 无需访问互联网即可私下连接到 S3。
或
使用 NAT 网关或 NAT 实例
• 如果您希望 Lambda 具有完整的互联网访问权限,请在公有子网中部署 NAT 网关或 NAT 实例。
• 确保 Lambda 的私有子网路由表指向互联网流量的 NAT 网关。
如果您的 Lambda 不需要访问私有 VPC 内的资源(例如 RDS 或私有 EC2 实例),最简单的解决方法是在 VPC 外部运行 Lambda。