问题
当您试图访问一个对象在一个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,调用propertynames和propertynames ACL的一部分aws s3api cp命令:
aws s3api put-object-acl——斗bucketname关键keyname——acl bucket-owner-full-control