Pra*_*kka 3 amazon-s3 amazon-ec2 amazon-web-services node.js
我创建了一个 IAM 角色“test”并分配给一个 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/*"
}
]
}
Run Code Online (Sandbox Code Playgroud)
从 EC2 中,我通过向以下地址发送curl 请求从这篇AWS 文章中获取了 AccessKey 和 SecretKey
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/<role-name>
Run Code Online (Sandbox Code Playgroud)
使用上面的响应,我编写了一个节点脚本来向存储桶中的资源发出请求
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);
});
Run Code Online (Sandbox Code Playgroud)
运行此代码时,我得到了签名的网址。但这会产生 InvalidAccessKeyId 错误。我怀疑 s3 存储桶策略是否错误,因此尝试使用 IAM 用户凭证获取类似的策略。它完全正常工作。
欢迎任何提示或建议。
有以下三点需要注意:
1. 如何从 Amazon EC2 实例提供和访问凭证
当使用 IAM 角色启动 Amazon EC2 实例时,实例元数据会自动提供由访问密钥、密钥和令牌组成的临时访问凭证。这些凭证大约每六个小时轮换一次。
任何使用AWS SDK(例如Python、Java、PHP)的代码都知道如何自动检索这些凭证。因此,在使用 IAM 角色启动的 Amazon EC2 实例上运行的代码不需要您检索或提供访问凭证- 它只是自动工作!
因此,在上面的代码示例中,您可以删除专门引用凭据的任何行。您的工作只是确保 IAM 角色具有足够的权限来执行您希望执行的操作。
这也适用于AWS 命令行界面 (CLI),它实际上只是一个提供对 AWS API 调用的命令行访问的 Python 程序。由于它使用适用于 Python 的 AWS 开发工具包,因此它会自动从实例元数据检索凭证,并且在通过 IAM 角色启动的 Amazon EC2 实例使用时不需要凭证。
2. 如何分配访问Amazon S3的权限
默认情况下, Amazon S3 中的对象是私有的。可以通过三种方式分配访问对象的权限:
由于您希望向特定 IAM 用户授予对 Amazon S3 对象的访问权限,因此最好通过附加到该用户的IAM 策略分配权限,而不是成为存储桶策略的一部分。
因此,您应该:
以下是政策示例:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1",
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::MY-BUCKET/*"
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
我推荐了一种内联策略,因为该策略仅适用于一个用户。如果您要向许多用户分配权限,建议将策略附加到IAM 组,然后分配到该组的用户将继承权限。或者,创建 IAM 策略,然后将该策略附加到所有相关用户。
3. 预签名 URL 的工作原理
Amazon S3预签名 URL是授予对 Amazon S3 对象临时访问权限的一种方法。生成的URL包括:
实现的关键点与生成预签名URL时使用的权限有关。正如 Amazon S3 文档与其他人共享对象中所述:
任何拥有有效安全凭证的人都可以创建预签名 URL。但是,为了成功访问对象,预签名 URL必须由有权执行预签名 URL 所基于的操作的人员创建。
这意味着生成预签名 URL 时使用的凭据也是用作预签名 URL 一部分的凭据。当然,与这些凭证关联的实体需要访问该对象的权限——预签名 URL 只是授予临时访问对象的一种方式。
这还意味着,在您的示例中,您不需要创建特定角色来授予对 Amazon S3 中对象的访问权限。相反,您可以在 Amazon EC2 实例中使用更宽松的 IAM 角色(例如,也可以将对象上传到 S3 的角色),但当它生成预签名 URL 时,它仅授予对该对象的临时访问权限(而不是其他对象)。权限,例如上传权限)。
如果您的 Amazon EC2 实例上运行的软件仅与 AWS 交互以创建签名 URL,则您的角色仅具有GetObject权限就可以了。但是,如果您的实例想要执行更多操作,则创建一个角色来授予实例适当的权限(包括GetObject对 S3 的访问权限)并使用该角色生成签名 URL。
如果您希望练习生成签名 URL,最新版本的AWS 命令行界面 (CLI)包含一个aws s3 presign s3://path可以生成预签名 URL 的命令。尝试使用各种--profile设置,看看它如何与不同的 IAM 用户配合使用。
| 归档时间: |
|
| 查看次数: |
5907 次 |
| 最近记录: |