我编写了一个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存储桶。
答案 0 :(得分:0)
亚马逊S3服务有一个安全字符列表,可用于S3对象密钥
安全字符以下字符集通常是安全的 在键名中使用:•字母数字字符[0-9a-zA-Z]•特殊字符 字符!, - ,_,。,*,',(和)
然而我能看到的是,你正在使用=
,另一方面,这是一个需要处理的特殊字符
可能需要特殊处理的字符以下内容 密钥名称中的字符可能需要额外的代码处理 可能需要进行URL编码或引用为HEX。其中一些是 不可打印的字符和您的浏览器可能无法处理它们 还需要特殊处理
其中一个字符为=
也许,当您手动上传文件时,=
会自动编码。所以你必须选择,删除thos =
标志或编码它们(我会选择第一个选项)