我正在尝试设置一个 EC2 实例以访问包含一些私有数据的 S3 存储桶。我像这样设置了一个 IAM 角色:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:Get*",
"s3:List*"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::my_bucket_name/*"
}
]
}
我称这个角色为“s3_bin_download_role”
我使用以下命令启动我的 EC2 实例:
ec2-run-instances ami-4b143122 -n 1 -k us_east_key_pair -p s3_bin_download_role -g sg-????? -t t1.micro -z us-east-1a
这似乎很干净。但是我还没有弄清楚如何验证这个 EC2 实例实际上在其中具有这个角色。
无论如何,一旦实例启动,我 SSH 进入机器并输入:
curl http://my_bucket_name.s3.amazonaws.com/myfile.html
这给了我一个“拒绝访问”错误。
我设置了没有指定权限的 S3 存储桶。这显然是不正确的。但我不确定我需要在存储桶上指定的最小权限列表是什么,以允许此 EC2 实例上的程序读取它。
作为奖励,如果有人能告诉我如何确定 EC2 实例是否应用了特定的 IAM 角色,我将不胜感激。AWS 控制台似乎没有此信息。
编辑-
@slayedbylucifer 是对的,但细节非常混乱,所以我在这里添加细节。
令人困惑的是,您实际上可以创建 IAM 角色并立即使用这些角色启动 EC2 实例,而无需创建任何用户或组。只需使用带有 -p 标志的 ec2-run-instances(来自 cli 工具)来传递您刚刚创建的角色的名称 - 实例将以您可以通过发出以下命令来验证的角色启动 -
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/<rolename>
如果这可行,那么此实例现在将运行所有使用 aws 工具的请求,并获得该角色授予的权限。
但是,幕后发生的事情是,由于没有定义用户或组,因此用户隐含地是“root”用户或您在创建角色时登录到管理控制台的任何人。因此,创建但不分配角色并不意味着没有人有权访问 - 如果角色授予访问权限,则由创建者启动的 ec2 实例具有访问权限。
因此,现在您所要做的就是转到 S3 管理控制台并为您自己授予存储桶权限。就是这样。
此外,您实际上可以使用 curl 来检索 S3 对象,即使它们不是公开的 - 但是,由于它不是 aws 工具,因此您需要使用像 s3 这样的工具的请求显式传递 hmac'ed aws 令牌 - curl.pl 会为你做的。