没有访问权限的AWS S3上载和Java中的密钥

时间:2017-05-19 06:23:32

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

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

  

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

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

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

2 个答案:

答案 0 :(得分:5)

当您尝试从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"
    }

答案 1 :(得分:4)

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

  1. 环境变量 - AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY (推荐,因为它们被所有AWS软件开发工具包和CLI识别 除了.NET),或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元数据服务提供的实例配置文件凭据
  6. 检查您是否在上述任何一项中指定了有效凭据 参考:http://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html