授予 EC2 实例对 S3 存储桶的访问权限
Grant EC2 instance access to S3 Bucket
我想授予我的 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 实例中 curl s3 存储桶中的文件,但这也不起作用。
试试这个:
{
"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"
}
}
}
]
}
我发现了....
它仅适用于来自 ec2 实例的 public IP。
没有直接的方法来授予 "EC2" 对 AWS 服务器的实例访问权限,但您可以尝试以下方法。
- 在 AWS IAM 中创建一个新用户,并下载凭证文件。
- 此用户将代表您的 EC2 服务器。
- 向用户提供对您的 S3 存储桶的权限。
接下来,将凭据文件放在以下位置:-
EC2 - Windows 实例:
一种。将凭据文件放在您希望的任何位置。 (例如 C:/credentials)
b.创建一个环境变量 AWS_CREDENTIAL_PROFILES_FILE 并将值作为放置凭据文件的路径(例如 C:/credentials)
EC2 - Linux 实例
一种。按照 windows 实例
中的步骤操作
b.在您的应用程序服务器的根文件夹中创建一个文件夹 .aws(例如 /usr/share/tomcat6)。
C。在环境变量和 .aws 文件夹之间创建一个符号链接
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 = [您的存储桶名称]
和 prefix = [存储桶中的文件夹结构,其中包含您的文件]
希望对您有所帮助。
此外,如果您不使用 Java,您也可以查看其他编程语言的 AWS-SDKs。
至少在 2019 年,有一种更简单、更简洁的方法来做到这一点(凭据永远不必存储在实例中,而是可以自动查询):
- 为您的实例创建一个 IAM 角色并分配它
- 创建策略以授予对您的 s3 存储桶的访问权限
- 将策略分配给实例的 IAM 角色
- upload/download 个对象,例如通过 aws cli for s3 - cp 例如
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/*"]
}
]
}
您必须调整允许的操作,并替换 "bucket-name"
我遇到了同样的问题。我最终通过使用 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 对我不起作用)。我终于安装了第 2 版的 cli 来让它工作。
我想授予我的 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 实例中 curl s3 存储桶中的文件,但这也不起作用。
试试这个:
{
"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"
}
}
}
]
}
我发现了....
它仅适用于来自 ec2 实例的 public IP。
没有直接的方法来授予 "EC2" 对 AWS 服务器的实例访问权限,但您可以尝试以下方法。
- 在 AWS IAM 中创建一个新用户,并下载凭证文件。
- 此用户将代表您的 EC2 服务器。
- 向用户提供对您的 S3 存储桶的权限。
接下来,将凭据文件放在以下位置:-
EC2 - Windows 实例:
一种。将凭据文件放在您希望的任何位置。 (例如 C:/credentials)
b.创建一个环境变量 AWS_CREDENTIAL_PROFILES_FILE 并将值作为放置凭据文件的路径(例如 C:/credentials)
EC2 - Linux 实例
一种。按照 windows 实例
中的步骤操作 b.在您的应用程序服务器的根文件夹中创建一个文件夹 .aws(例如 /usr/share/tomcat6)。
C。在环境变量和 .aws 文件夹之间创建一个符号链接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 = [您的存储桶名称]
和 prefix = [存储桶中的文件夹结构,其中包含您的文件]
希望对您有所帮助。 此外,如果您不使用 Java,您也可以查看其他编程语言的 AWS-SDKs。
至少在 2019 年,有一种更简单、更简洁的方法来做到这一点(凭据永远不必存储在实例中,而是可以自动查询):
- 为您的实例创建一个 IAM 角色并分配它
- 创建策略以授予对您的 s3 存储桶的访问权限
- 将策略分配给实例的 IAM 角色
- upload/download 个对象,例如通过 aws cli for s3 - cp 例如
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/*"]
}
]
}
您必须调整允许的操作,并替换 "bucket-name"
我遇到了同样的问题。我最终通过使用 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 对我不起作用)。我终于安装了第 2 版的 cli 来让它工作。