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凭证提供程序链,按此顺序查找凭据:
- 环境变量 – AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY(推荐,因为它们被除.NET以外的所有AWS开发工具包和CLI识别),或AWS_ACCESS_KEY和AWS_SECRET_KEY(仅由Java SDK识别)
- Java系统属性 – aws.accessKeyId和aws.secretKey
- 凭据配置文件位于所有AWS开发工具包和AWS CLI共享的默认位置(〜/ .aws / credentials)
- 如果设置了AWS_CONTAINER_CREDENTIALS_RELATIVE_URI“环境变量且安全管理员有权访问变量,则通过Amazon EC2容器服务提供凭据,
- 通过Amazon EC2元数据服务提供的实例配置文件凭据
检查您是否在上述任何一项中指定了有效凭据。
参考: http : //docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html