不能从外部访问对象由砖砖

学习如何解决HeadObject操作错误和访问对象砖砖以外的写的。

写的亚当Pavlacka

去年发表在:2022年3月8日

问题

当您试图访问一个对象在一个S3位置由砖使用AWS CLI,出现以下错误:

ubuntu@0213 - 174944 - clean111 - 10 - 93 - 15 - 150: ~ $ aws s3 cp s3: / / <桶> / <位置> / 0 /δ/盒/ deileringDemo__m2 / _delta_log / 00000000000000000000。json。致命错误:发生错误(403)当调用HeadObject操作:被禁止的

导致

S3访问失败,因为桶ACL只允许访问桶的所有者(“DisplayName”:“bigdata_dataservices”)或您的帐户(“DisplayName”:“下文”)

这是预期行为如果你试图访问砖对象存储在砖(DBFS)文件系统的根目录。DBFS根桶被分配给砖用于存储元数据,库,等等。因此,对象的所有者(砖AWS帐户内)是规范用户ID分配给客户。

对象从一个砖笔记本写进DBFS根桶收到以下对象的权限:

{“所有者”:{“DisplayName”:“下文”、“ID”:“f65635fc2d277e71b19495a2a74d8170dd035d3e8aa6fc7187696eb42c6c276c}}

“ID”值确定砖客户,扩展客户的砖账户中的对象。

解决方案

在DBFS访问对象,使用砖CLI, DBFS API,砖公用事业、或Apache火花从砖笔记本内部API。

如果您需要访问数据从外部数据砖,DBFS根斗的数据迁移到另一个桶,桶的所有者可以完全控制。

事实上,砖不建议使用DBFS根目录用于存储任何用户文件或对象。它总是一个最佳实践,创建一个不同的S3 DBFS目录和安装它。

有两种迁移场景:

场景1:目的地砖数据平面和S3 bucket AWS帐户相同

一定要把我的角色目前位于集群数据。集群需要我的角色使它编写到目的地。

Amazon S3 ACL配置BucketOwnerFullControl火花配置:

spark.hadoop.fs.s3a.acl.default BucketOwnerFullControl

BucketOwnerFullControl递归调用putObjectACL财产。现在你有正确的文件,可以使用的权限S3命令来执行备份。

场景2:目的地砖数据平面和S3 bucket不同AWS帐户

仍由砖的对象,因为它是一个cross-account写。

为了避免这种情况,您可以假设一个角色使用实例配置文件和一个AssumeRole政策

小贴士跨帐户使用AWS API或CLI迁移

如果您正在使用我的角色实例化和写作的cross-account桶砖在不同的账户数据平面和S3 bucket,调用propertynamespropertynames ACL的一部分aws s3api cp命令:

aws s3api put-object-acl——斗bucketname关键keyname——acl bucket-owner-full-control


这篇文章有用吗?