0

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

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

我在 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 存储桶。

4

1 回答 1

0

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

安全字符 以下字符集通常可安全用于键名: • 字母数字字符 [0-9a-zA-Z] • 特殊字符 !、-、_、.、*、'、( 和 )

但是我可以看到,您正在使用=,另一方面,这是一个需要处理的特殊字符

可能需要特殊处理的字符 键名中的以下字符可能需要额外的代码处理,并且可能需要进行 URL 编码或引用为 HEX。其中一些是不可打印的字符,您的浏览器可能无法处理它们,这也需要特殊处理

其中一个字符是=

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

于 2017-10-09T06:52:50.810 回答