web-dev-qa-db-fra.com

Nodejs AWS SDK S3 Générer une URL prédéfinie

J'utilise le SDK AWS NodeJS AWS pour générer une URL S3 pré-signée. Les documents donnent un exemple de générer une URL prédéfinie .

Voici mon code exact (avec les informations sensibles omises):

const AWS = require('aws-sdk')

const s3 = new AWS.S3()
AWS.config.update({accessKeyId: 'id-omitted', secretAccessKey: 'key-omitted'})

// Tried with and without this. Since s3 is not region-specific, I don't
// think it should be necessary.
// AWS.config.update({region: 'us-west-2'})

const myBucket = 'bucket-name'
const myKey = 'file-name.pdf'
const signedUrlExpireSeconds = 60 * 5

const url = s3.getSignedUrl('getObject', {
    Bucket: myBucket,
    Key: myKey,
    Expires: signedUrlExpireSeconds
})

console.log(url)

L'URL qui génère ressemble à ceci:

https://bucket-name.s3-us-west-2.amazonaws.com/file-name.pdf?AWSAccessKeyId=[access-key-omitted]&Expires=1470666057&Signature=[signature-omitted]

Je copie cette URL dans mon navigateur et j'obtiens la réponse suivante:

<Error>
  <Code>NoSuchBucket</Code>
  <Message>The specified bucket does not exist</Message>
  <BucketName>[bucket-name-omitted]</BucketName>
  <RequestId>D1A358D276305A5C</RequestId>
  <HostId>
    bz2OxmZcEM2173kXEDbKIZrlX508qSv+CVydHz3w6FFPFwC0CtaCa/TqDQYDmHQdI1oMlc07wWk=
  </HostId>
</Error>

Je sais que le seau existe. Lorsque je navigue vers cet élément via l'interface graphique Web AWS et que je double-clique dessus, l'objet est ouvert avec l'URL et fonctionne parfaitement:

https://s3-us-west-2.amazonaws.com/[bucket-name-omitted]/[file-name-omitted].pdf?X-Amz-Date=20160808T141832Z&X-Amz-Expires=300&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Signature=[signature-omitted]&X-Amz-Credential=ASIAJKXDBR5CW3XXF5VQ/20160808/us-west-2/s3/aws4_request&X-Amz-SignedHeaders=Host&x-amz-security-token=[really-long-key]

Donc, je suis amené à croire que je dois faire quelque chose de mal avec la façon dont j'utilise le SDK.

67
Dustin

Dustin,

Votre code est correct, vérifiez les points suivants:

  1. Votre politique d'accès au compartiment.

  2. Votre autorisation de compartiment via votre clé API.

  3. Votre clé et votre secret API.

  4. Votre nom et votre clé de seau.

60
Reza Mousavi