gpt4 book ai didi

node.js - 无法从EC2访问具有IAM角色的S3文件

转载 作者:搜寻专家 更新时间:2023-10-31 23:41:08 25 4
gpt4 key购买 nike

我创建了一个IAM角色“测试”,并将其分配给EC2实例。我用存储桶策略创建了一个S3存储桶

{
"Version": "2012-10-17",
"Id": "Policy1475837721706",
"Statement": [
{
"Sid": "Stmt1475837720370",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::770370070203:role/test"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::test-role-123/*"
}
]
}

从EC2,我向 AWS article发送了curl请求,从而获得了AccessKey和SecretKey。
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/<role-name>

使用上面的响应,我编写了一个 Node 脚本来请求存储桶中的资源
var AWS = require('aws-sdk');

var d = {
"Code" : "Success",
"LastUpdated" : "2016-10-07T12:28:09Z",
"Type" : "AWS-HMAC",
"AccessKeyId" : "ASIAIMJBHYLH6GWOWNMQ",
"SecretAccessKey" : "7V/k5nvFdhXOcT+nhYjGqHM4QmUWjNBUM1ERJQJs",
"Token" : "FQoDYXdzEO7//////////wEaDGG+SgxD4Es4Z1RBZCKzAz855JuKfm8s7LDcP5T9TGvDdJELsYTzPi47HJ9Q5oaK8OTb0Us0RjvpGW278Mb1gg1dNip1VD2N/GW5/1TFC6xhNpnnZ9+LNkJAwVVZg5raGM91k56X/VOA++/5WivSpO4jWg8fZDibivVyHuoMJJTkurFtEXrweDOCqpiabypTCc5jFtX8NfQuHubwl4C1jp2pMasVS1jwhjU72TA8Pn9EsIIvh8JXDC1dVfppwnslolAeJyOOAHdL1AQSs3nI6IvPCtKhBjtDaVuoiH/lHrnKrw6AeMHoTYQay4wOYRnE4ffngtksekZEULXvERWE4NCs3leXGMqrdzOr8xdZ9m0j3IkshqSS56fkq6E9JtLhSVGyy44ELrL7kYW/dpHE03V+dwQPXMhRafjsVsPD7sUnBfH/+4yyL0VDX1vlFRKbRi50i/Eqvxsb9bcSTsE0W5yWmOWR8reTTYWcWyQXGvxKVYVxLWZKVRfmNfx6IX2sqan7e7pjCtUrqXB1TBMpXdy8KSH9qoJtNAQTYBXws7oFLYY+F2esnNCma0bdNcCeAQ6t/6aPfUdpdLgv8BcGciZxayiqqd6/BQ==",
"Expiration" : "2016-10-07T18:51:57Z"
};
AWS.config.accessKeyId = d.AccessKeyId;
AWS.config.secretAccessKey = d.SecretAccessKey;
var s3params = {Key: "test.json", Bucket:"test-role-123"};
AWS.config.region = 'ap-south-1';

var s3 = new AWS.S3();

s3.getSignedUrl('getObject', s3params, function(err, url) {
console.log(url);
});

在运行此代码时,我得到了签名的URL。但这给出了InvalidAccessKeyId错误。我怀疑s3存储桶策略是否错误,因此尝试使用具有IAM用户凭据的类似策略。它是完全正常的。

欢迎任何提示或建议。

最佳答案

有三件事要注意:

  • 如何从Amazon EC2实例
  • 提供和访问 凭证
  • 如何分配权限以访问Amazon S3
  • 预签名URL的方式函数

  • 1.如何从Amazon EC2实例提供和访问凭证

    当启动具有IAM角色的Amazon EC2实例时, Instance Metadata自动提供 临时访问凭证,由访问 key , secret key 和 token 组成。这些凭据大约每六个小时轮换一次。

    使用AWS开发工具包的任何代码(例如Python,Java,PHP)都知道如何自动检索这些凭证。因此,在以IAM角色 启动的Amazon EC2实例上运行的代码不需要您检索或提供访问凭证 -它可以自动工作!

    因此,在上述代码示例中,您可以 删除任何专门引用凭据的行。您的工作只是确保IAM角色对您要执行的操作具有足够的权限。

    这也适用于 AWS Command-Line Interface (CLI),它实际上只是一个Python程序,可提供对AWS API调用的命令行访问。由于它使用适用于Python的AWS开发工具包,因此它会从实例元数据中自动检索凭证,并且在通过IAM角色启动的Amazon EC2实例中使用时不需要凭证。

    2.如何分配访问Amazon S3的权限

    默认情况下,Amazon S3中的对象是 私有(private)的。有三种分配访问对象权限的方法:
  • 对象ACL (访问控制列表):这些是对对象本身的权限
  • 存储桶策略:这是应用于整个存储桶的一组规则,但是它也可以指定与存储桶子集相关的权限(例如存储桶中的特定路径)
  • 适用于IAM用户,组或角色的IAM策略:这些权限专门适用于那些实体

  • 由于您想向特定IAM用户授予对Amazon S3对象的访问权限,因此最好通过附加到该用户的 IAM策略来分配权限,而不是成为 存储桶策略的一部分。

    因此,您应该:
  • 删除存储桶策略
  • 在IAM中创建内联策略,并将其附加到所需的IAM用户。然后,该策略将应用于该用户,并且不需要主体

  • 这是一个示例策略:
    {
    "Version": "2012-10-17",
    "Statement": [
    {
    "Sid": "Stmt1",
    "Effect": "Allow",
    "Action": [
    "s3:GetObject"
    ],
    "Resource": [
    "arn:aws:s3:::MY-BUCKET/*"
    ]
    }
    ]
    }

    我推荐了 内联策略,因为此策略仅适用于一个用户。如果要向许多用户分配权限,建议将策略附加到 IAM组,然后分配给该组的用户将继承该权限。或者,创建一个IAM策略,然后将该策略附加到所有相关用户。

    3.预签名URL的功能

    Amazon S3 预签名URL 是一种授予对Amazon S3对象的临时访问权的方法。生成的URL包括:
  • 有权访问对象
  • 的IAM用户的 访问 key
  • 到期时间
  • 通过具有授权URL
  • 的has操作创建的 签名

    要实现的关键点与生成预签名URL时使用的权限有关。如Amazon S3文档 Share an Object with Others所述:

    Anyone with valid security credentials can create a pre-signed URL. However, in order to successfully access an object, the pre-signed URL must be created by someone who has permission to perform the operation that the pre-signed URL is based upon.



    这意味着生成预签名URL时使用的凭据也是用作预签名URL的一部分的凭据。当然,与这些凭据关联的实体需要访问该对象的权限-预签名URL只是在一段时间内授予对对象的授予访问权限的一种手段。

    这也意味着,在您的示例 中,您无需创建特定角色即可授予对Amazon S3 中对象的访问权限。相反,您可以在Amazon EC2实例中使用更为宽松的IAM角色(例如,也可以将对象上传到S3的实例),但是当它生成预先签名的URL时,它仅授予对对象的临时访问权限(而不是其他对象)权限,例如上传权限)。

    如果在您的Amazon EC2实例上运行的软件仅与AWS交互以创建已签名的URL,则您仅具有 GetObject权限的角色就可以了。但是,如果您的实例要执行更多操作,请创建一个角色,为该实例授予适当的权限(包括对S3的 GetObject访问),并使用该角色生成签名URL。

    如果您希望练习生成签名的URL,则最新版本的 AWS Command-Line Interface (CLI)包括一个 aws s3 presign s3://path命令,该命令可以生成预签名的URL。尝试各种 --profile设置,以了解它如何与不同的IAM用户一起使用。

    关于node.js - 无法从EC2访问具有IAM角色的S3文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39920505/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com