我在API上拥有一个端点,该端点仅使用AWS开发工具包为我们的一个S3存储桶生成一个预签名URL。当在本地命中端点时,每次都可以正常工作。但是,在对部署版本(在Fargate上运行)的第一个请求时,第一次调用始终会返回基本S3 URL:
https://s3.amazonaws.com/
如果您 second 次点击API,它将生成正确的URL,只要API处于温暖状态,它就会继续这样做。如果您等待了足够长的时间,然后尝试再次击中它,则会再次发生。
我已经验证了生成URL的参数是正确的,即使生成的URL错误。我还在相同的方法中添加了重试逻辑,但这继续返回无效的URL。
以下是有问题的代码(包括重试):
const s3Params = {
Key: fileName,
Expires: 120,
ContentType: contentType,
ACL: "public-read",
Bucket: process.env.IMAGE_UPLOAD_BUCKET,
};
let uploadUrl = this.awsService.getS3Instance().getSignedUrl("putObject", s3Params);
// Sometimes this call fails and returns a blank URL
if (uploadUrl === "https://s3.amazonaws.com/") {
// Try one more time
uploadUrl = this.awsService.getS3Instance().getSignedUrl("putObject", s3Params);
}
return [uploadUrl, s3Params.Key];
是否有进一步解决此问题的建议?
答案 0 :(得分:0)
您需要使用异步回调,因为Fargate使用异步凭据提供程序。在文档中说明如下:
注意:您必须确保您拥有静态的或先前解析的 凭据(如果您同步调用此方法(没有回调)), 否则可能无法正确签署请求。如果你不能 确保这一点(您正在使用异步凭据提供程序, (例如EC2 IAM角色),则应始终使用 异步回调。
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrl-property