web-dev-qa-db-fra.com

Pourquoi mon accès est-il refusé sur s3 (en utilisant le aws-sdk pour Node.js)?

J'essaie de lire un fichier existant à partir de mon compartiment s3, mais je reçois toujours "Accès refusé" sans explication ni instructions sur ce qu'il faut faire à ce sujet. Ici est le code que j'utilise:

'use strict'

var AWS = require('aws-sdk')
const options = {
  apiVersion: '2006-03-01',
  params: {
    Bucket: process.env['IMAGINATOR_BUCKET']
  },
  accessKeyId: process.env['IMAGINATOR_AWS_ACCESS_KEY_ID'],
  secretAccessKey: process.env['IMAGINATOR_AWS_SECRET_ACCESS_KEY'],
  signatureVersion: 'v4'
}
console.log('options', options)
var s3 = new AWS.S3(options)

module.exports = exports = {
  get (name, cb) {
    const params = {
      Key: name + '.json'
    }
    console.log('get params', params)
    return s3.getObject(params, cb)
  },
  set (name, body, cb) {
    const params = {
      Key: name + '.json',
      Body: body
    }
    console.log('set params', params)
    return s3.putObject(params, cb)
  }
}

Et voici ce que j'obtiens en sortie en utilisant la méthode get et en enregistrant l'erreur fournie dans le rappel (avec des informations sensibles censurées):

options { apiVersion: '2006-03-01',
  params: { Bucket: CENSORED_BUT_CORRECT },
  accessKeyId: CENSORED_BUT_CORRECT,
  secretAccessKey: CENSORED_BUT_CORRECT,
  signatureVersion: 'v4' }
get params { Key: 'whitelist.json' }
err { [AccessDenied: Access Denied]
  message: 'Access Denied',
  code: 'AccessDenied',
  region: null,
  time: Wed Sep 21 2016 11:17:50 GMT-0400 (EDT),
  requestId: CENSORED,
  extendedRequestId: CENSORED,
  cfId: undefined,
  statusCode: 403,
  retryable: false,
  retryDelay: 20.084538962692022 }
/Users/shawn/git/vigour-io/imaginate/node_modules/aws-sdk/lib/request.js:31
            throw err;
            ^

AccessDenied: Access Denied
    at Request.extractError (/Users/shawn/git/vigour-io/imaginate/node_modules/aws-sdk/lib/services/s3.js:538:35)
    at Request.callListeners (/Users/shawn/git/vigour-io/imaginate/node_modules/aws-sdk/lib/sequential_executor.js:105:20)
    at Request.emit (/Users/shawn/git/vigour-io/imaginate/node_modules/aws-sdk/lib/sequential_executor.js:77:10)
    at Request.emit (/Users/shawn/git/vigour-io/imaginate/node_modules/aws-sdk/lib/request.js:668:14)
    at Request.transition (/Users/shawn/git/vigour-io/imaginate/node_modules/aws-sdk/lib/request.js:22:10)
    at AcceptorStateMachine.runTo (/Users/shawn/git/vigour-io/imaginate/node_modules/aws-sdk/lib/state_machine.js:14:12)
    at /Users/shawn/git/vigour-io/imaginate/node_modules/aws-sdk/lib/state_machine.js:26:10
    at Request.<anonymous> (/Users/shawn/git/vigour-io/imaginate/node_modules/aws-sdk/lib/request.js:38:9)
    at Request.<anonymous> (/Users/shawn/git/vigour-io/imaginate/node_modules/aws-sdk/lib/request.js:670:12)
    at Request.callListeners (/Users/shawn/git/vigour-io/imaginate/node_modules/aws-sdk/lib/sequential_executor.js:115:18)

Maintenant, je ne sais pas quoi faire parce que je pense que je fais les choses correctement selon les documents, mais cela ne fonctionne pas et le message d'erreur ne dit pas pourquoi mon accès est refusé ... Aucune idée de ce que la prochaine étape devrait être pour que cela fonctionne?

10
Shawn

Le problème était que mon nouvel utilisateur IAM n'avait pas de politique attachée. Je lui ai attribué le AmazonS3FullAccess politique et maintenant ça marche.

Comme indiqué dans les commentaires, une politique plus restrictive serait beaucoup plus sûre

15
Shawn

FullAccess dans votre police n'est pas requis. Vous pouvez essayer quelque chose comme ceci:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:Put*",
                "s3:Get*",
                "s3:List*",
                "s3:Delete*"
            ],
            "Resource": [
                "arn:aws:s3:::bucket/*",
                "arn:aws:s3:::bucket"
            ]
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "*"
        }
    ]
}
7
Anderson Clayton

Ces erreurs peuvent se produire lorsque l'objet que vous essayez de lire n'existe pas. D'après ce que j'ai compris, les erreurs AWS ne sont pas aussi claires dans ces situations.

Validez si votre clé/compartiment est correct et si vous envoyez les paramètres corrects sur la méthode API.

J'ai déjà eu ce problème deux fois:

  • lorsque je remplaçais le paramètre clé par le paramètre bucket et vice versa lorsque j'essayais de lire un objet s3 en utilisant la méthode getObject().
  • lorsque j'essayais de copier un fichier vers un emplacement qui n'existait pas à l'aide de la méthode copyObject().
2
valdeci