Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点的正确凭据&;s3_Javascript_Node.js_Amazon Web Services_Amazon S3 - Fatal编程技术网

Javascript 节点的正确凭据&;s3

Javascript 节点的正确凭据&;s3,javascript,node.js,amazon-web-services,amazon-s3,Javascript,Node.js,Amazon Web Services,Amazon S3,我的目标是建立一个S3存储桶,我的节点应用程序可以从中下载对象。我不熟悉建立网站和api请求,花了很多时间阅读AWS的文档,但我真的很困惑 设置凭据的最佳方法是什么,以便我的节点应用程序可以连接到S3并下载我需要的特定对象?我应该使用iAm角色吗?iAm访问密钥是否存储在我的本地.aws/credentials文件中?到目前为止,我一直在尝试运行下面的代码,首先是我个人aws用户的访问密钥,然后是保存到.aws/credentials文件中的iAm角色的访问密钥,但我一直得到拒绝访问(下面的堆栈

我的目标是建立一个S3存储桶,我的节点应用程序可以从中下载对象。我不熟悉建立网站和api请求,花了很多时间阅读AWS的文档,但我真的很困惑

设置凭据的最佳方法是什么,以便我的节点应用程序可以连接到S3并下载我需要的特定对象?我应该使用iAm角色吗?iAm访问密钥是否存储在我的本地.aws/credentials文件中?到目前为止,我一直在尝试运行下面的代码,首先是我个人aws用户的访问密钥,然后是保存到.aws/credentials文件中的iAm角色的访问密钥,但我一直得到
拒绝访问
(下面的堆栈跟踪)。我是否未正确设置凭据?谢谢

var AWS = require('aws-sdk');

var s3 = new AWS.S3();

var credentials = new AWS.SharedIniFileCredentials({profile: 'personal-account'});
AWS.config.credentials = credentials;

var params = { Bucket: "my_bucket", Key: "testing.txt" }

s3.getObject(params, function(err, data) {
  if (err) console.log(err, err.stack);
  else     console.log(data);
});
堆栈跟踪:

 { AccessDenied: Access Denied
at Request.extractError (/Users/jemery62/dev/jimmyemery_com/node_modules/aws-sdk/lib/services/s3.js:577:35)
at Request.callListeners (/Users/jemery62/dev/jimmyemery_com/node_modules/aws-sdk/lib/sequential_executor.js:105:20)
at Request.emit (/Users/jemery62/dev/jimmyemery_com/node_modules/aws-sdk/lib/sequential_executor.js:77:10)
at Request.emit (/Users/jemery62/dev/jimmyemery_com/node_modules/aws-sdk/lib/request.js:683:14)
at Request.transition (/Users/jemery62/dev/jimmyemery_com/node_modules/aws-sdk/lib/request.js:22:10)
at AcceptorStateMachine.runTo (/Users/jemery62/dev/jimmyemery_com/node_modules/aws-sdk/lib/state_machine.js:14:12)
at /Users/jemery62/dev/jimmyemery_com/node_modules/aws-sdk/lib/state_machine.js:26:10
at Request.<anonymous> (/Users/jemery62/dev/jimmyemery_com/node_modules/aws-sdk/lib/request.js:38:9)
at Request.<anonymous> (/Users/jemery62/dev/jimmyemery_com/node_modules/aws-sdk/lib/request.js:685:12)
at Request.callListeners (/Users/jemery62/dev/jimmyemery_com/node_modules/aws-sdk/lib/sequential_executor.js:115:18)
message: 'Access Denied',
code: 'AccessDenied',
region: null,
time: 2017-10-26T02:01:15.586Z,
requestId: '10371DCDBBC02508',
extendedRequestId: '0GC8BZ/39/eFOzWgTedHSFxhFSGBAMcZqxCVAlUxp8YamwBGeGZUZVe7Ti9O/6+BxhUTk9jb4hk=',
cfId: undefined,
statusCode: 403,
retryable: false,
retryDelay: 75.06631783335284 } 'AccessDenied: Access Denied
at Request.extractError (/Users/jemery62/dev/jimmyemery_com/node_modules/aws-sdk/lib/services/s3.js:577:35)
at Request.callListeners (/Users/jemery62/dev/jimmyemery_com/node_modules/aws-sdk/lib/sequential_executor.js:105:20)
at Request.emit (/Users/jemery62/dev/jimmyemery_com/node_modules/aws-sdk/lib/sequential_executor.js:77:10)
at Request.emit (/Users/jemery62/dev/jimmyemery_com/node_modules/aws-sdk/lib/request.js:683:14)    
at Request.transition (/Users/jemery62/dev/jimmyemery_com/node_modules/aws-sdk/lib/request.js:22:10)    
at AcceptorStateMachine.runTo (/Users/jemery62/dev/jimmyemery_com/node_modules/aws-sdk/lib/state_machine.js:14:12)
at /Users/jemery62/dev/jimmyemery_com/node_modules/aws-sdk/lib/state_machine.js:26:10    
at Request.<anonymous> (/Users/jemery62/dev/jimmyemery_com/node_modules/aws-sdk/lib/request.js:38:9)    
at Request.<anonymous> (/Users/jemery62/dev/jimmyemery_com/node_modules/aws-sdk/lib/request.js:685:12)    
at Request.callListeners (/Users/jemery62/dev/jimmyemery_com/node_modules/aws-sdk/lib/sequential_executor.js:115:18)'
.aws/config:

[profile corp]
role_arn = corp-role-arn
region = us-east-1
source_profile = default
我不太清楚IAm策略是如何工作的,但我已通过AdministratorAccess和以下配置文件设置了我的IAm角色:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*"
        }
    ]
}
我是否需要对我的.aws/config进行其他更改?我是否错误地调用了我的凭据,还是错误地试图调用我想要的对象

更新2:
我已经发布了第二个问题,以明确我目前遇到的问题,因为我认为我发布的这篇文章开始变得有点混乱。

如果您的代码在EC2上运行,那么它应该使用EC2实例配置文件。如果它在其他任何地方运行,则应在
~/.aws/credentials
或环境变量中配置IAM用户密钥


在任何一种情况下,IAM角色或用户都应该有一个附加的策略,允许其访问S3存储桶和该存储桶中的对象。如果您还有其他问题,请将您使用的IAM策略添加到您的问题中。

如果您的代码在EC2上运行,则应该使用EC2实例配置文件。如果它在其他任何地方运行,则应在
~/.aws/credentials
或环境变量中配置IAM用户密钥


在任何一种情况下,IAM角色或用户都应该有一个附加的策略,允许其访问S3存储桶和该存储桶中的对象。如果您还有其他问题,请将您使用的IAM策略添加到您的问题中。

我个人发现加载JSON格式文件中存储的凭据的方法是最灵活的方法

您确实需要IAM角色(仔细选择it访问范围)来获取
accessKeyId
secretAccessKey

因此,您的JSON文件应该如下所示:

{
  "accessKeyId": "IAM_ACCESS_KEY_ID",
  "secretAccessKey": "IAM_SECRET_ACCESS_KEY"
}
然后你可以简单地做:

var AWS = require('aws-sdk');
AWS.config.loadFromPath('/path/to/credentials/aws.credentials.json');

var params = { Bucket: "my_bucket", Key: "testing.txt" }

s3.getObject(params, function(err, data) {
  if (err) console.log(err, err.stack);
  else     console.log(data);
});

我个人发现加载JSON格式文件中存储的凭证的
loadFromPath
方法是最灵活的方法

您确实需要IAM角色(仔细选择it访问范围)来获取
accessKeyId
secretAccessKey

因此,您的JSON文件应该如下所示:

{
  "accessKeyId": "IAM_ACCESS_KEY_ID",
  "secretAccessKey": "IAM_SECRET_ACCESS_KEY"
}
然后你可以简单地做:

var AWS = require('aws-sdk');
AWS.config.loadFromPath('/path/to/credentials/aws.credentials.json');

var params = { Bucket: "my_bucket", Key: "testing.txt" }

s3.getObject(params, function(err, data) {
  if (err) console.log(err, err.stack);
  else     console.log(data);
});

下面的代码最终为我工作。在配置AWS之后,我需要实例化s3

var AWS = require('aws-sdk');

var credentials = new AWS.SharedIniFileCredentials({profile: 'personal-account'});
AWS.config.credentials = credentials;

s3 = new AWS.S3();

var params = { Bucket: "my_bucket", Key: "testing.txt" }

s3.getObject(params, function(err, data) {
  if (err) console.log(err, err.stack);
  else     console.log(data);
});

下面的代码最终为我工作。在配置AWS之后,我需要实例化s3

var AWS = require('aws-sdk');

var credentials = new AWS.SharedIniFileCredentials({profile: 'personal-account'});
AWS.config.credentials = credentials;

s3 = new AWS.S3();

var params = { Bucket: "my_bucket", Key: "testing.txt" }

s3.getObject(params, function(err, data) {
  if (err) console.log(err, err.stack);
  else     console.log(data);
});

键:“testing.txt”
将不会获取
testing.txt的内容。你的钥匙就是这个字符串,这可能就是它不工作的原因。嘿@JeremyThille,我不确定我是否理解。该键不指示我要获取的文件的字符串名称值吗?“我做错了什么?”吉米说,这句话不正确
Key
是您要从bucket中获取的对象密钥。谢谢@Michael sqlbot。在哪里可以找到要获取的正确对象密钥?我一直在看文件,但找不到细节。我需要为bucket声明对象键还是只声明其字符名?键是path+filename,没有前导斜杠。如果这是bucket中的文件名,那么您似乎对了该部分。
键:“testing.txt”
将不会获取
testing.txt
的内容。你的钥匙就是这个字符串,这可能就是它不工作的原因。嘿@JeremyThille,我不确定我是否理解。该键不指示我要获取的文件的字符串名称值吗?“我做错了什么?”吉米说,这句话不正确
Key
是您要从bucket中获取的对象密钥。谢谢@Michael sqlbot。在哪里可以找到要获取的正确对象密钥?我一直在看文件,但找不到细节。我需要为bucket声明对象键还是只声明其字符名?键是path+filename,没有前导斜杠。如果这是bucket中的文件名,那么这一部分似乎是正确的。如果在ec2上运行代码,则使用键不是最佳做法,如果代码在ec2上,则使用角色。当然,AWS infrastructure允许您通过多种方式实现这一点。到目前为止,EC2评测是最常见的实践之一。但对我来说,使用JSON似乎更实用,特别是在AWS以外的服务器上工作时,或者如果您不想花时间配置console@gtrenco如果您使用JSON文件,那么相同的代码将无法在具有实例概要文件的EC2上运行。这就是为什么在EC2之外运行时,我更喜欢使用标准AWS凭据文件或环境变量,以便在EC2上使用IAM实例配置文件运行相同的代码时,无需进行任何更改即可正常工作。如果在EC2上运行代码,则使用键不是最佳做法,如果您的代码在EC2上运行良好,则使用角色,AWS基础设施确实让您可以通过多种方式实现这一点。到目前为止,EC2评测是最常见的实践之一。但对我来说,使用JSON似乎更实用,特别是在AWS以外的服务器上工作时,或者如果您不想花时间配置console@gtrenco如果使用JSON文件,那么相同的代码