授予 Redshift Cluster 对另一个账户拥有的 S3 存储桶的访问权限

Posted

技术标签:

【中文标题】授予 Redshift Cluster 对另一个账户拥有的 S3 存储桶的访问权限【英文标题】:Give a Redshift Cluster access to S3 bucket owned by another account 【发布时间】:2017-08-03 01:25:05 【问题描述】:

我正在尝试使用 iam_role 将数据从 Redshift 卸载到 S3。只要我将数据卸载到与 Redshift 集群相同的帐户所拥有的 S3 存储桶,卸载命令就可以正常工作。

但是,如果我尝试将数据卸载到另一个帐户拥有的 S3 存储桶中,则它不起作用。我已经尝试过这些教程中提到的方法:

Tutorial: Delegate Access Across AWS Accounts Using IAM Roles Example: Bucket Owner Granting Cross-Account Bucket Permissions

但是,我总是得到S3ServiceException:Access Denied,Status 403,Error AccessDenied,Rid

以前有人做过吗?

【问题讨论】:

【参考方案1】:

我让它工作了。这是我所做的:

在具有AmazonS3FullAccess 策略的账户 A 中创建了一个 IAM 角色(用于测试) 在账户 A 中启动了一个 Amazon Redshift 集群 已将数据加载到 Redshift 集群中 测试 1: 卸载到帐户 A 中的存储桶 -- 成功 测试 2: 卸载到帐户 B 中的存储桶 -- 失败 向账户 B 中的存储桶添加了存储桶策略(见下文) 测试 3: 卸载到帐户 B 中的存储桶 -- 成功!

这是我使用的存储桶策略:


  "Id": "Policy11",
  "Version": "2012-10-17",
  "Statement": [
    
      "Sid": "PermitRoleAccess",
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::my-bucket",
        "arn:aws:s3:::my-bucket/*"
      ],
      "Principal": 
        "AWS": [
          "arn:aws:iam::123456789012:role/Redshift-loader"
        ]
      
    
  ]

Redshift-loader 角色已与我的 Redshift 集群关联。此策略授予角色(位于不同 AWS 账户中)访问此 S3 存储桶的权限。

【讨论】:

哇!我不敢相信你在 10 分钟内完成了所有这些工作。 我在做同样的事情,除了"Action": "s3:*" 我有"Action": "s3:PutObject"。看到您的回答后,我开始为角色一一添加权限。最后它在"Action": ["s3:PutObject", "s3:List*"] 工作。显然,Redshift 还需要列表权限来查看存储桶中是否已经存在这些项目。非常感谢您的回答。 @John Rotenstein 我也在做同样的事情,但是当我创建策略时,我收到此错误:“此策略包含以下错误:已禁止字段 Principal”。有什么理由让我得到这个? @dotore 请创建一个新问题,而不是提出一个问题作为对旧问题的评论。 (顺便说一句,如果您将策略放在 IAM 实体(例如用户或角色)上,则不需要 Principal。但是,如果您要创建存储桶策略,则需要它)。

以上是关于授予 Redshift Cluster 对另一个账户拥有的 S3 存储桶的访问权限的主要内容,如果未能解决你的问题,请参考以下文章

如何授予 Redshift 中所有模式的使用权限?

ALTER SCHEMA NAME 是不是会影响对 Redshift 中架构的权限授予

限制对 Redshift 表的访问,仅授予对视图的访问权限

如何授予 Amazon Redshift 用户读取系统表、视图、日志等的访问权限?

将 Redshift 系统表的权限授予非超级用户

AWS SDK/CLI 访问错误,AWS Redshift create-cluster 的 EC2 实例凭证