Fargate返回根目录以预签名的S3 URL-节点

时间:2019-07-09 22:08:29

标签: node.js amazon-s3 aws-fargate

我在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];

是否有进一步解决此问题的建议?

1 个答案:

答案 0 :(得分:0)

您需要使用异步回调,因为Fargate使用异步凭据提供程序。在文档中说明如下:

注意:您必须确保您拥有静态的或先前解析的 凭据(如果您同步调用此方法(没有回调)), 否则可能无法正确签署请求。如果你不能 确保这一点(您正在使用异步凭据提供程序, (例如EC2 IAM角色),则应始终使用 异步回调。

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrl-property