【问题标题】:301 PermanentRedirect is returned from the URL obtained by getSignedURL to putObject301 PermanentRedirect 从getSignedURL获取的URL返回给putObject
【发布时间】:2018-05-10 23:44:20
【问题描述】:

我正在尝试获取签名 URL 以将来自 aws-sdk 的文件与 Node.js 一起放置。 当我使用 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"));

我的代码有问题吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 你是对的。但这有点棘手。我在调试服务器上配置了 AWS_DEFAULT_REGION 环境变量。该配置用于其他 AWS S3 API,例如 getObject、putObject,没有签名 URL。但是,签名 URL 似乎只读取 AWS.config.update 配置。通过AWS.config.update 配置后,返回的 URL 发生了变化。我可以访问和放置对象。
    • 上帝保佑你兄弟......这为我指明了正确的方向,以找出我几天来一直在处理的 S3 问题
    猜你喜欢
    • 1970-01-01
    • 2015-11-21
    • 2019-04-29
    • 1970-01-01
    • 2016-09-03
    • 2014-01-15
    • 1970-01-01
    • 2013-06-11
    • 2012-02-09
    相关资源
    最近更新 更多