2017-10-29 354 views
0

直到我的代码正常工作,我已经将存储桶策略设置得太大了。正在使用InstanceProfileCredentialsProvider正确的方式从Ec2实例连接到AWS S3?

{ 
    "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-elasticbeanbean-ec2-提供FullAccess到S3的角色(我明白完全访问是危险的)。

我在我的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

虽然你的代码将正常运行的情况,可以删除该部分全部在一起:.withCredentials(new InstanceProfileCredentialsProvider(false))如果您未指定任何凭据设置,则AWS SDK for Java将自动选取实例配置文件。你可以这样做:

AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build(); 

如果这样不起作用,请尝试完全从S3存储桶中删除存储桶策略。您不需要存储桶策略以允许使用IAM实例配置文件的服务器访问存储桶,并且如果您在存储桶策略中存在拼写错误或其他内容,它可能会破坏事情。

如果这不起作用,请将分配给IAM实例配置文件的IAM策略添加到您的问题中。

+0

我试过AmazonS3 s3Client = AmazonS3ClientBuilder.standard()。build();与我现有的存储桶策略以及删除我的存储桶策略。没有运气。 –

+0

我已经添加了分配给角色的IAM策略,该角色又被分配给Quesiton中的Ec2实例。 –

+0

Btw,当Ec2InstanceRole分配给Ec2实例时,是否需要设置Ec2实例中的环境变量和/或Java系统属性和/或默认凭证配置文件? –