301 PermanentRedirect从getSignedURL获取的URL返回到putObject

时间:2017-11-27 16:49:44

标签: node.js amazon-web-services amazon-s3

我试图获取带有Node.js的aws-sdk文件的签名URL。 当我使用SDK中的地址时,我将获得301 PermanentRedirect。

<Error>
<script/>
<Code>PermanentRedirect</Code>
<Message>
The bucket you are attempting to access must be addressed using the 
specified endpoint. Please send all future requests to this endpoint.
</Message>
<Bucket>XXX.COM</Bucket>
<Endpoint>XXX.COM.s3.amazonaws.com</Endpoint>
<RequestId>A82721F2A44XXXX</RequestId><HostId>HPgWeSUk2cKu3AbijEu9+S41bHh7dUxSiwOEEVrS08dsrpJ3AvMP5V2iXXXXXX
</HostId>
</Error>

我认为我没有身份验证问题,因为我可以在调用getSignedURL API之前访问其他API。我不知道为什么我会收到此错误消息。这是我用于获取签名URL的代码。

   public static getSignedURL(path: string, op: string): Promise<string> {
    return new Promise<string>((resolve, reject) => {
        s3.getSignedUrl(op, {
            Bucket: "XXX.COM",
            Key: path,
            Expires: 60 * 60 * 24 * 365 * 10,
            ContentType: "text/javascript",
            ACL: 'public-read'
        }, (err, url) => {
            if (err) {
                reject(err);
            } else {
                resolve(url);
            }
        })
    });
    console.log(await getSignedURL(`XXX/${id}/${libName}.js`, "putObject"));

我的代码有问题吗?

1 个答案:

答案 0 :(得分:2)

问题是您在一个区域中创建了S3客户端,并且您正在签署一个引用其他区域中的存储桶的URL。

创建S3客户端时,在创建客户端之前插入此行,指定正确的区域。

AWS.config.update({region: 'us-east-1'});