将文件从 HDFS 放入 S3 存储桶时访问被拒绝
Posted
技术标签:
【中文标题】将文件从 HDFS 放入 S3 存储桶时访问被拒绝【英文标题】:Access Denied while putting file from HDFS to S3 bucket 【发布时间】:2017-10-09 06:32:16 【问题描述】:我编写了一个 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
,那么这个文件应该上传到以下路径的bucket中
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】:亚马逊 S3 服务有一个可用于 S3 对象密钥的安全字符列表
安全字符 以下字符集通常是安全的 在键名中使用: • 字母数字字符 [0-9a-zA-Z] • 特殊 字符 !, -, _, ., *, ', (, and )
但是我可以看到,您使用的是=
,另一方面,这是一个需要处理的特殊字符
可能需要特殊处理的字符以下 键名中的字符可能需要额外的代码处理,并且会 可能需要进行 URL 编码或引用为 HEX。其中一些是 不可打印的字符,您的浏览器可能无法处理它们,这 也需要特殊处理
其中一个字符是=
也许,当您手动上传文件时,=
会自动编码。所以你必须选择,删除那些=
标志或对其进行编码(我会选择第一个选项)
【讨论】:
您能否确认一下在上传文件之前是否需要预先存在密钥路径(tsvFile/year=2017/month=10/day=09/)或者可以动态创建?跨度> 当您将文件上传到 S3 时,您并没有创建任何目录,您在 Web 界面上看到的只是对象键的解释(因此文件 a/b/c.txt只是 S3 上的一个文件,但在 Web 界面上它被解释为嵌套目录)。回到您的问题,因为“目录” tsvFile/year=2017/month=10/day=09/ 中的每个文件都需要转义“=”符号,因为没有“预先存在”目录跨度> 这是我目前面临的问题 - 原因:com.amazonaws.services.s3.model.AmazonS3Exception:此操作不支持 x-amz-server-side-encryption 标头。 (服务:Amazon S3;状态代码:400;错误代码:InvalidArgument;请求 ID:A4563A21BFA23BCE),S3 扩展请求 ID:HoAo1ia5jOO3zuNsBzOspmB5b+ZG9YQHgCuFvJnrd0iGEGegCpUoqMf7VWybOj0Np0KVjk5ovm8=以上是关于将文件从 HDFS 放入 S3 存储桶时访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章
AWS S3 访问被拒绝。存储桶权限被授予,那么当我是用户时,我需要存储桶策略吗?