将文件从HDFS传输到S3存储桶时拒绝访问
问题描述:
我编写了一个Java程序,该程序包含在oozie工作流程中,该工作流程将文件从HDFS传输到S3存储桶。不过,我收到以下错误将文件从HDFS传输到S3存储桶时拒绝访问
com.amazonaws.services.s3.model.AmazonS3Exception:拒绝访问 (服务:亚马逊S3;状态代码:403;错误代码:存取遭拒; 请求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桶。
答
亚马逊S3 serive有可能被用于S3的安全角色列表对象键
安全字符以下字符集通常是在关键的名称 使用安全:•字母数字字符[0 -9a-ZA-Z]•特殊字符 , - ,_,*,”,(和)
但是我所看到的,使用的是=
,这从另一方面为需要处理的特殊字符
字符,可能需要特殊处理的 字符的按键名称可能需要额外的代码处理,并会 可能需要进行网址编码或十六进制引用。其中有些是 非打印字符和您的浏览器可能不处理他们,这 也将需要进行特殊处理
和那些人物之一是=
也许,当你手动上传文件时, =
被自动编码。所以你必须选择,删除thod =
标志或编码它们(我会去第一个选项)
您还可以确认关键路径(tsvFile /年= 2017 /月= 10 /日= 09 /)需要在上传文件之前预先存在,还是可以动态创建? – Shash
当你上传一个文件到S3,你没有创建任何目录,你在Web界面上看到的只是对象键的解释(所以文件a/b/c.txt只是S3上的一个文件,但在Web界面上它被解释为嵌套目录)。因为没有“预先存在”的目录,所以你的“目录”tsvFile/year = 2017/month = 10/day = 09 /中的每个文件都需要转义“=”号。 – pezetem
This是我目前面临的问题 - 由com.amazonaws引起。services.s3.model.AmazonS3Exception:此操作不支持x-amz-server-side-encryption标头。 (Service:Amazon S3; Status Code:400; Error Code:InvalidArgument; Request ID:A4563A21BFA23BCE),S3 Extended Request ID:HoAo1ia5jOO3zuNsBzOspmB5b + ZG9YQHgCuFvJnrd0iGEGegCpUoqMf7VWybOj0Np0KVjk5ovm8 = – Shash