将文件从 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 存储桶时访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

尝试将对象放入 s3 时访问被拒绝

尝试将对象放入 s3 存储桶时,配置中缺少凭据

AWS S3 访问被拒绝。存储桶权限被授予,那么当我是用户时,我需要存储桶策略吗?

尝试使用 PUT 将 PDF 作为 blob 上传到 S3 存储桶时被禁止 403

上传到 S3 存储桶时出错,与 EndPoint 相关

AWS Lambda - 访问被拒绝错误 - GetObject