如何使用没有密钥的策略通过Java连接到S3存储桶

时间:2017-07-11 06:29:48

标签: java amazon-web-services amazon-s3

我的政策类似于

{
"Id":"Pid6",
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": "s3:PutObject",
        "Action": "s3:GetObject",
        "Action": "s3:ListBucket",
        "Resource": [
                     "arn:aws:s3:::test-bucket",
                     "arn:aws:s3:::test-bucket/*"
                    ]
    }
  ]
}

我连接到S3存储桶的Java代码是

BasicAWSCredentials awsCreds = new BasicAWSCredentials("accessKey", "secretKey");
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
            .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
            .withRegion(Regions.region).build();
s3Client.putObject( new PutObjectRequest( S3_BUCKET, s3Path, file )
            .withCannedAcl( CannedAccessControlList.PublicRead ) );

我可以使用访问密钥和&密钥... 如何使用策略连接到s3存储桶,而无需使用Java进行基于密钥的访问。 我的意思是如何使用s3Client文件

获取awsCreds对象或policy.json对象

2 个答案:

答案 0 :(得分:1)

如果您在EC2实例上运行了应用程序,则可以将该策略附加到IAM角色并将该角色分配给该实例。这样,您无需为应用程序指定凭据。

在从控制台或AWS CLI启动期间,可以为EC2实例分配IAM角色

以下是AWS文档的完整详细信息:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html

  

我们设计了IAM角色,以便您的应用程序可以安全地创建API   来自您的实例的请求,无需您管理   应用程序使用的安全凭证。

答案 1 :(得分:0)

如果EC2具有可以写入S3的角色,则

AwsCredentialsProvider awsCredentialsProvider=
InstanceProfileCredentialsProvider.builder().asyncCredentialUpdateEnabled(Boolean.TRUE).build();
S3AsyncClient   client=S3AsyncClient.builder()
               .credentialsProvider(awsCredentialsProvider).build();

InstanceProfileCredentialsProvider从实例元数据信息加载凭据。请参考文档 https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/InstanceProfileCredentialsProvider.html