我想授予我的ec2实例访问s3存储桶的权限。
在这个ec2实例上,启动了一个包含我的应用程序的容器。现在我没有获得s3桶的许可。
这是我的存储桶政策
{
"Version": "2012-10-17",
"Id": "Policy1462808223348",
"Statement": [
{
"Sid": "Stmt1462808220978",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::714656454815:role/ecsInstanceRole"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket-name/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "private-ip/32"
}
}
}
]
}
但是在我允许每个人访问它之前它不起作用。
我尝试从ec2实例内部卷曲s3存储桶中的文件,但这也不起作用。
答案 0 :(得分:1)
我发现了......
它仅适用于ec2实例中的公共IP。
答案 1 :(得分:1)
没有直接授予AWS服务器“EC2”实例访问权限的方法,但您可以尝试以下方法。
接下来,将凭证文件放在以下位置: -
EC2 - Windows实例:
一个。将凭证文件放在任何您希望的位置。 (例如C:/凭证)
湾创建环境变量 AWS_CREDENTIAL_PROFILES_FILE 并将值作为放置凭证文件的路径(例如C:/凭证)
EC2 - Linux实例
一个。按照Windows实例的步骤进行操作
湾在app-server的根文件夹中创建一个文件夹 .aws (例如 / usr / share / tomcat6 )。
C。在环境变量和 .aws 文件夹之间创建一个symmlink
sudo ln -s $AWS_CREDENTIAL_PROFILES_FILE /usr/share/tomcat6/.aws/credentials
现在您已放置凭证文件,您可以使用Java代码访问存储桶 注意 :此需要AWS-SDK库
AWSCredentials credentials = null;
try {
credentials = new ProfileCredentialsProvider().getCredentials();
} catch (Exception e) {
LOG.error("Unable to load credentials " + e);
failureMsg = "Cannot connect to file server.";
throw new AmazonClientException(
"Cannot load the credentials from the credential profiles file. " +
"Please make sure that your credentials file is at the correct " +
"location (environment variable : AWS_CREDENTIAL_PROFILES_FILE), and is in valid format.",
e);
}
AmazonS3 s3 = new AmazonS3Client(credentials);
Region usWest2 = Region.getRegion(Regions.US_WEST_2);
s3.setRegion(usWest2);
ObjectListing objectListing = s3.listObjects(new ListObjectsRequest().withBucketName(bucketName).withPrefix(prefix));
其中 bucketName = [你的水桶名称]
和前缀 = [您的存储区中的文件夹结构,包含您的文件]
希望有所帮助。 此外,如果您不使用Java,也可以使用其他编程语言查看AWS-SDK。
答案 2 :(得分:1)
至少到现在(2019年),有一种更轻松,更干净的方法(凭据不必存储在实例中,而是可以自动查询):
aws s3 cp <S3Uri> <LocalPath>
@ 2:Allow Read and Write Access to Objects in an S3 Bucket的JSON政策示例如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListObjectsInBucket",
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::bucket-name"]
},
{
"Sid": "AllObjectActions",
"Effect": "Allow",
"Action": "s3:*Object",
"Resource": ["arn:aws:s3:::bucket-name/*"]
}
]
}
您必须调整允许的操作,并替换“存储桶名称”
答案 3 :(得分:0)
试试这个:
{
"Version": "2012-10-17",
"Id": "Policy1462808223348",
"Statement": [
{
"Sid": "Stmt1462808220978",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::bucket-name/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "yourIp/24"
}
}
}
]
}
答案 4 :(得分:0)
我遇到了同样的问题。我终于解决了这一问题,方法是使用AWS CLI为有问题的存储桶创建一个访问点,请参见https://docs.aws.amazon.com/AmazonS3/latest/dev/creating-access-points.html,然后我创建了一个存储桶策略,如下所示:
{
"Version": "2012-10-17",
"Id": "Policy1583357393961",
"Statement": [
{
"Sid": "Stmt1583357315674",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<account-id>:role/ecsInstanceRole"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::<your-bucket>"
},
{
"Sid": "Stmt1583357391961",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<account-id>:role/ecsInstanceRole"
},
"Action": [
"s3:GetObject"
],
"Resource": "arn:aws:s3:::<your-bucket>/*"
}
]
}
请确保您使用的是aws cli的较新版本(1.11.xxx对我不起作用)。我终于安装了cli的第2版,以使其正常工作。