是否正确使用InstanceProfileCredentialsProvider从Ec2实例连接到AWS S3?

时间:2017-10-29 01:25:47

标签: amazon-web-services amazon-s3 amazon-ec2 aws-sdk

在我的代码工作之前,我已经将存储桶策略设置得过于宽泛。

{
    "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

1 个答案:

答案 0 :(得分:0)

虽然您的代码应该按原样运行,但您可以一起删除此部分:如果您未指定任何凭据设置,AWS SDK for Java将自动选择实例配置文件。你可以这样做:

.withCredentials(new InstanceProfileCredentialsProvider(false))

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

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