【发布时间】:2021-01-10 07:16:21
【问题描述】:
我使用代理 - 使用 aws-lambda-fastify 包使我基于 Fastify 的 REST API 在 AWS Lambda 下工作。
在 Lambda 下运行时我必须解决的一个问题是 HTTP 请求超时。原来是因为事件循环不是空的。我必须在 Lambda context 上设置一个特殊标志,现在请求返回正常,除了一个 - 为 S3 上传生成预签名 URL 的路由。
const S3 = require('aws-sdk/clients/s3');
module.exports = createPresignedPost = ({ key, contentType }) => {
const s3 = new S3();
s3.config.accessKeyId = process.env.AWS_SECRET_ACCESS_KEY;
s3.config.secretAccessKey = process.env.AWS_SECRET_ACCESS_KEY;
s3.config.region = process.env.AWS_REGION;
const params = {
Expires: 60,
Bucket: process.env.AWS_BUCKET_NAME,
Conditions: [['content-length-range', 100, 10000000]], // 100Byte - 10MB
Fields: {
'Content-Type': contentType,
'Cache-Control': 'max-age=31536000',
key
}
};
return new Promise(async (resolve, reject) => {
s3.createPresignedPost(params, (err, data) => {
if (err) {
reject(err);
return;
}
resolve(data);
});
});
};
当从 Lambda 调用/在 Lambda 下调用此函数时会导致超时,而它在 Docker 和/或虚拟/物理主机下本地执行得非常好。
有什么建议吗?
【问题讨论】:
-
lambda 函数是否与 VPC 关联?
-
@Marcin 有什么区别?显然,在主机上
s3.createPresignedPost()会返回,而在 Lambda 下则不会。 -
VPC 中的 Lambda 默认没有互联网连接。因此,如果您想访问 S3,您将超时,除非您正确设置您的 VPC 和 lambda。
-
是公共 RDS,还是您在私有子网中创建了私有 RDS,然后将 lambda 连接到该子网以与 RDS 交互?
-
我使用公共 FQDN 进行连接
标签: node.js amazon-web-services amazon-s3 aws-lambda pre-signed-url