2017-11-27 5 views
0

aws-sdkのファイルをNode.jsに格納するための署名付きURLを取得しようとしています。 SDKのアドレスを使用すると、301のPermanentRedirectが取得されます。301 getSignedURLで取得したURLからputObjectに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

問題は、ある地域でS3クライアントを作成し、別の地域のバケットを参照するURLに署名していることです。

S3クライアントを作成するときに、クライアントの作成前にこの行を挿入して、正しい領域を指定します。

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

あなたは正しいです。しかし、これは少し難しい理由です。私はAWS_DEFAULT_REGION環境変数をデバッグサーバ上で設定しました。この設定は、getObject、putObjectなどの署名付きURLなしの他のAWS S3 APIに使用されていました。 しかし、署名されたURLは 'AWS.config.update'設定のみを読み取るようです。 'AWS.config.update'で設定した後、返されたURLが変更されました。そして私はオブジェクトにアクセスして置くことができました。 – kyasbal

関連する問題