AWS S3通过Spark跨账号传输文件:被传输的目标桶对象被拒绝访问



我有一个用例,我想利用Spark在2个不同AWS账户的S3 bucket之间传输文件。

我在另一个AWS帐户(例如帐户a)中运行Spark。我没有访问该AWS帐户的权限。我有AWS账户B,它持有源S3桶(S3_SOURCE_BUCKET)和AWS账户C,它持有目标S3桶(S3_DESTINATION_BUCKET)。

我在帐户C中创建了一个IAM角色(例如:CrossAccountRoleC),用于从目标S3桶读取和写入。

我已经在帐户B中设置了主IAM角色(例如:CrossAccountRoleB)。

  • 在信任实体中添加账号A的spark IAM角色
  • 给Account B和Account C的S3桶添加读写权限
  • 添加一个内联策略来假设CrossAccountRoleC

在CrossAccountRoleC中添加CrossAccountRoleB作为可信实体

还在S3_DESTINATION_BUCKET的桶策略中增加了CrossAccountRoleB。

我正在使用Hadoop的FileUtil。通过copy在源S3桶和目标S3桶之间传输文件。当传输成功时,我在复制的对象上得到403访问拒绝。

当我指定hadoopConfiguration.set("fs.s3.canned.acl", "BucketOwnerFullControl")时,我得到一个错误,说"请求者未被授权在资源[s3源或接收]上执行操作[s3:GetObject, s3:PutObject或kms:Decrypt]";. 从日志来看,似乎是在向目标桶写入时操作失败。

我错过了什么?

您最好为每个桶使用3a设置,并为不同的桶使用不同的凭据集。不是"纯粹的";作为IAM角色游戏,但由于没有人了解IAM角色或知道如何调试它们,它更有可能工作。

(不要把IAM角色不工作作为个人技能失败的事实。每个人都害怕与他们相关的支持问题)

最新更新