AWS S3无需访问和密钥在Java中上载

我想在不使用AWS服务器的访问权限和密钥的情况下将文件上传到S3。 AWS键应作为默认值。 但是,在服务器中运行以下命令,我可以访问它而无需提供任何访问和密钥。

aws s3 cp somefile.txt s3:// somebucket /

从Java代码,它无法访问,因为它无法加载凭据。 以下是我的代码。

 AmazonS3 s3client = new AmazonS3Client(new DefaultAWSCredentialsProviderChain()); 

当您尝试从EC2实例连接到S3存储桶时,可以使用以下Java代码获取s3client实例。

 AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withCredentials(new InstanceProfileCredentialsProvider(false)) .build(); 

这是推荐的方法,因为应用程序不需要在属性文件中维护访问键。

  • 应创建IAM角色,并为该角色提供S3访问权限。 请参阅下面的示例政策。
  • 应将IAM角色分配给EC2实例

IAM角色的示例政策: –

 { "Action": ["s3:PutObject", "s3:ListBucket", "s3:GetObject", "s3:DeleteObject"], "Resource": ["arn:aws:s3:::yourBucketName", "arn:aws:s3:::yourBucketName/*"], "Effect": "Allow", "Sid": "AllowBucketLinux" } 

根据文档AWS凭证提供程序链,按此顺序查找凭据:

  1. 环境变量 – AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY(推荐,因为它们被除.NET以外的所有AWS开发工具包和CLI识别),或AWS_ACCESS_KEY和AWS_SECRET_KEY(仅由Java SDK识别)
  2. Java系统属性 – aws.accessKeyId和aws.secretKey
  3. 凭据配置文件位于所有AWS开发工具包和AWS CLI共享的默认位置(〜/ .aws / credentials)
  4. 如果设置了AWS_CONTAINER_CREDENTIALS_RELATIVE_URI“环境变量且安全管理员有权访问变量,则通过Amazon EC2容器服务提供凭据,
  5. 通过Amazon EC2元数据服务提供的实例配置文件凭据

检查您是否在上述任何一项中指定了有效凭据。
参考: http : //docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html