预签名 URL 生成代码超时为 Lambda,在本地工作
Presigned URL generation code times-out as Lambda, works locally
我使用代理 - 使用 aws-lambda-fastify
包使我基于 Fastify 的 REST API 在 AWS Lambda 下工作。
我必须在 Lambda 下解决 运行 的其中一个问题是 HTTP 请求超时。原来是事件循环不为空导致的。我必须在 Lambda context
上设置一个特殊标志,现在请求 return 很好,除了一个 - 一条为 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);
});
});
};
此函数在调用 from/under Lambda 时会导致超时,而它在 Docker and/or virtual/physical 主机下在本地执行得非常好。
有什么建议吗?
这个有效:
const AWS = require('aws-sdk');
AWS.config.update({
region: process.env.AWS_DEFAULT_REGION,
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
}
});
module.exports = createPresignedPost = ({ key, contentType }) => {
const s3 = new AWS.S3();
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',
'Access-Control-Allow-Origin': '*',
key
}
};
return new Promise(async (resolve, reject) => {
s3.createPresignedPost(params, (err, data) => {
if (err) {
reject(err);
}
resolve(data);
});
});
};
我使用代理 - 使用 aws-lambda-fastify
包使我基于 Fastify 的 REST API 在 AWS Lambda 下工作。
我必须在 Lambda 下解决 运行 的其中一个问题是 HTTP 请求超时。原来是事件循环不为空导致的。我必须在 Lambda context
上设置一个特殊标志,现在请求 return 很好,除了一个 - 一条为 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);
});
});
};
此函数在调用 from/under Lambda 时会导致超时,而它在 Docker and/or virtual/physical 主机下在本地执行得非常好。
有什么建议吗?
这个有效:
const AWS = require('aws-sdk');
AWS.config.update({
region: process.env.AWS_DEFAULT_REGION,
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
}
});
module.exports = createPresignedPost = ({ key, contentType }) => {
const s3 = new AWS.S3();
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',
'Access-Control-Allow-Origin': '*',
key
}
};
return new Promise(async (resolve, reject) => {
s3.createPresignedPost(params, (err, data) => {
if (err) {
reject(err);
}
resolve(data);
});
});
};