在我的代码工作之前,我已经将存储桶策略设置得过于宽泛。
{
"Version": "2012-10-17",
"Id": "Policy15",
"Statement": [
{
"Sid": "Stmt1",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::bcktName",
"arn:aws:s3:::bcktName/*"
]
}
]
}
我正在使用Elastic BeanStalk,后者又使用AWS Ec2。 Ec2实例具有aws-elasticbeanstalk-ec2-role,为S3提供了FullAccess(我知道完全访问是危险的)。
我在我的webapp中使用以下java代码,该代码部署到Ec2。
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
.withCredentials(new InstanceProfileCredentialsProvider(false))
.build();
versionId = s3Client.putObject(new PutObjectRequest("bucketName", name, convFile))
.getVersionId();
1)这是在java代码中从Ec2连接S3的正确方法吗? 2)This文档让我感到困惑,因为我不确定是否必须设置环境变量和/或Java系统属性和/或默认凭据配置文件和/或Amazon ECS容器凭证和/或实例配置文件凭证?
请帮帮我。我对这个问题感到震惊了近一个星期。
PS: 以下是分配给我的个人资料的ec2InstanceRole
Role ARN arn:aws:iam::111111111111:role/aws-elasticbeanstalk-ec2-role
Role description
Instance Profile ARNs arn:aws:iam::111111111111:instance-profile/aws-elasticbeanstalk-ec2-role
Path /
Creation time 2017-10-17 11:27 PDT
分配给上述角色的政策是
AmazonS3FullAccess
AWSElasticBeanstalkWebTier
AWSElasticBeanstalkMulticontainerDocker
AWSElasticBeanstalkWorkerTier
答案 0 :(得分:0)
虽然您的代码应该按原样运行,但您可以一起删除此部分:如果您未指定任何凭据设置,AWS SDK for Java将自动选择实例配置文件。你可以这样做:
.withCredentials(new InstanceProfileCredentialsProvider(false))
如果这不起作用,请尝试完全从S3存储桶中删除存储桶策略。您不需要存储桶策略以允许使用IAM实例配置文件的服务器访问存储桶,如果您的存储桶策略中存在拼写错误,则可能会破坏事物。
如果这不起作用,请将分配给IAM实例配置文件的IAM策略添加到您的问题中。