web-dev-qa-db-ja.com

(Node.jsにaws-sdkを使用して)s3でアクセスが拒否されるのはなぜですか?

S3バケットから既存のファイルを読み込もうとしていますが、何をすべきかについての説明や指示がなく、「アクセスが拒否されました」と表示され続けます。 ここ は私が使用しているコードです:

'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)
  }
}

そして、これはgetメソッドを使用し、コールバックで提供されたエラーをログに記録したときに出力として得られるものです(機密情報は打ち切られています):

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)

今私はドキュメントに従って正しくやっていると思うので何をすべきかわかりませんが、それは機能しておらず、エラーメッセージには私のアクセスが拒否された理由が示されていません...次のステップのアイデアこれを機能させるために?

10
Shawn

問題は、新しいIAMユーザーにポリシーがアタッチされていないことでした。私はそれにAmazonS3FullAccessポリシーを割り当て、それが機能するようになりました。

コメントで指摘されているように、より制限的なポリシーの方がはるかに安全です

15
Shawn

FullAccessあなたの警察にいる必要はありません。あなたはこのようなことを試すことができます:

{
    "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

これらのエラーは、読み取ろうとしているオブジェクトが存在しない場合に発生する可能性があります。 AWSエラーは、これらの状況ではそれほど明確ではないことを理解しました。

キー/バケットが正しいか、APIメソッドで正しいパラメータを送信しているかを検証します。

私はすでにこの問題を2回受けました:

  • getObject()メソッドを使用してs3オブジェクトを読み取ろうとしたときに、キーparamをバケットparamに、またはその逆に置き換えていました。
  • copyObject()メソッドを使用して、存在しない場所にファイルをコピーしようとしたとき。
2
valdeci