web-dev-qa-db-ja.com

AWS S3で署名付きURLを生成する '' AccessDenied ''

NodeJを使用してファイルをAWS S3にアップロードしています。クライアントがファイルを安全にダウンロードできるようにしたい。だから私は署名付きのURLを生成しようとしています。私のコードは次のようになります:

アップロード中

const s3bucket = new AWS.S3({
    accessKeyId: 'my-access-key-id',
    secretAccessKey: 'my-secret-access-key',
    Bucket: 'my-bucket-name',
})
const uploadParams = {
    Body: file.data,
    Bucket: 'my-bucket-name',
    ContentType: file.mimetype,
    Key: `files/${file.name}`,
}
s3bucket.upload(uploadParams, function (err, data) {
    // ...
})

ダウンロード中

const url = s3bucket.getSignedUrl('getObject', {
    Bucket: 'my-bucket-name',
    Key: 'file-key',
    Expires: 300,
})

問題

URLを開くと、次のようになります。

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<Error>
    <Code>AccessDenied</Code>
    <Message>
        There were headers present in the request which were not signed
    </Message>
    <HeadersNotSigned>Host</HeadersNotSigned>
    <RequestId>D63C8ED4CD8F4E5F</RequestId>
    <HostId>
        9M0r2M3XkRU0JLn7cv5QN3S34G8mYZEy/v16c6JFRZSzDBa2UXaMLkHoyuN7YIt/LCPNnpQLmF4=
    </HostId>
</Error>

私はなんとか間違いを見つけることができませんでした。私は本当にどんな助けにも感謝します:)

5
Florian Ludewig

私は同様の問題を抱え続けましたが、私の設定は地域設定によるものでした。バックエンドには、アプリの構成設定がいくつかありました。

その1つは"region": "us-west-2"だったため、署名済みURLはこのリージョンで作成されましたが、フロントエンドで呼び出されたとき、リージョンは"us-west-1"に設定されました。

同じになるように変更すると、問題が修正されました。

2
Ju66ernaut