将文件从HDFS放入S3存储桶时拒绝访问

时间:2017-10-09 06:32:17

标签: java amazon-s3 aws-sdk oozie-workflow

我编写了一个Java程序,该程序包含在oozie工作流程中,该程序将文件从HDFS放入S3存储桶。但是,我收到以下错误

  

com.amazonaws.services.s3.model.AmazonS3Exception:拒绝访问   (服务:Amazon S3;状态代码:403;错误代码:AccessDenied;   请求ID:310F08CD4FF8B5D9),S3扩展请求ID:   fAysD1vgtriV8x + sf1zqHk58eAT89Y6HD + ziEokaPvFPKwaPrHDxt5yygsiA1ktNVsyj + GTmbQ0 =

我正在oozie工作流中动态创建S3存储桶中的关键路径。
例如:如果我的文件名是abc_20171009.tsv.gz,那么该文件应该通过以下路径上传到存储桶

tsvFile/year=2017/month=10/day=09/abc_20171009.tsv.gz

以类似的方式,应该根据日期上传其他日文件。
我的查询是在上传文件之前是否应该在存储桶中预先存在密钥路径,还是可以动态创建?

 // Request server-side encryption.           

          BasicAWSCredentials awsCredentials = new BasicAWSCredentials(awsAccessKeyId, awsSecretKey);
          AmazonS3Client s3Client = new AmazonS3Client(awsCredentials);
          PutObjectRequest request  = new PutObjectRequest("bucket_name", "key_name","");

          ObjectMetadata objectMetadata  = new ObjectMetadata();
          objectMetadata.setSSEAlgorithm(ObjectMetadata.AES_256_SERVER_SIDE_ENCRYPTION);

          request.setMetadata(objectMetadata); 

          PutObjectResult response = s3Client.putObject(request);

          LOGGER.info("Server Side Encryption successful" +response.getSSEAlgorithm());

注意:我可以通过AWS CLI手动放置文件并连接到S3存储桶。

1 个答案:

答案 0 :(得分:0)

亚马逊S3服务有一个安全字符列表,可用于S3对象密钥

  

安全字符以下字符集通常是安全的   在键名中使用:•字母数字字符[0-9a-zA-Z]•特殊字符   字符!, - ,_,。,*,',(和)

然而我能看到的是,你正在使用=,另一方面,这是一个需要处理的特殊字符

  

可能需要特殊处理的字符以下内容   密钥名称中的字符可能需要额外的代码处理   可能需要进行URL编码或引用为HEX。其中一些是   不可打印的字符和您的浏览器可能无法处理它们   还需要特殊处理

其中一个字符为=

也许,当您手动上传文件时,=会自动编码。所以你必须选择,删除thos =标志或编码它们(我会选择第一个选项)