AWS Redshift:Masteruser 无权担任角色

dr3*_*m3r 10 amazon-web-services amazon-iam amazon-redshift

我创建了一个带有 redshift 集群和主用户的 cloudformation 堆栈:testuser

"RedshiftCluster" : {
  "IamRoles" : [
      {
        "Fn::GetAtt": [
          "IAMInstanceRole",
          "Arn"
        ]
      }
    ]
  ... other configurations
Run Code Online (Sandbox Code Playgroud)

它使用以下处于同步状态的 IAM 角色 (IAMInstanceRole),并且 redshift 集群已启动并正在运行:

"IAMInstanceRole": {
  "Properties": {
    "RoleName": "test-iam-role",
    "AssumeRolePolicyDocument": {
      "Statement": [
        {
          "Action": [
            "sts:AssumeRole"
          ],
          "Effect": "Allow",
          "Principal": {
            "Service": [
              "ec2.amazonaws.com",
              "redshift.amazonaws.com",
              "s3.amazonaws.com"
            ]
          }
        }
      ]
    },
    "Path": "/",
    "Policies": [ 
      {
      "PolicyName": "root",
        "PolicyDocument": {
          "Version" : "2012-10-17",
          "Statement": [ 
            {
              "Effect": "Allow",
              "Action": "*",
              "Resource": "*"
            }
          ]
        }
      } 
    ]
  }
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用复制命令和 iam_role 作为凭据将 csv 文件从 s3 加载到 redshift。iam_role 具有 IAMInstanceRole 的 arn(在上面声明)。每当我执行以下命令时:

copy test_table from 's3://test-bucket/test.csv' CREDENTIALS 'aws_iam_role=arn:aws:iam::<account-id>:role/test-iam-role' MAXERROR 100000 removequotes TRIMBLANKS emptyasnull blanksasnull delimiter '|';
Run Code Online (Sandbox Code Playgroud)

我收到错误:

ERROR:  User arn:aws:redshift:us-west-2:189675173661:dbuser:automated-data-sanity-redshiftcluster-fbp9fgls6lri/sanityuser is not authorized to assume IAM Role arn:aws:iam::189675173661:role/sanity-test-iam-instance-role
DETAIL:




-----------------------------------------------
  error:  User arn:aws:redshift:us-west-2:<account-id>:dbuser:test-redshiftcluster-fbp9fgls6lri/testuser is not authorized to assume IAM Role arn:aws:iam::<account-id>:role/test-iam-role
  code:      8001
  context:   IAM Role=arn:aws:iam::<account-id>:role/test-iam-role
  query:     1139
  location:  xen_aws_credentials_mgr.cpp:236
  process:   padbmaster [pid=29280]
  -----------------------------------------------
Run Code Online (Sandbox Code Playgroud)

请提出一些解决方案。

小智 10

我遇到了同样的问题,但经过 1 小时的故障排除后,我意识到我在创建集群时未能将 Redshift 角色添加到集群中。如果您从 Redshift 中选择集群,请选择“操作”下拉菜单并选择“管理 IAM 角色”,您将能够附加您可能为此集群创建的 Redshift 角色。

无论如何,这为我解决了问题。希望这可以帮助。


小智 5

我解决了这个问题!!默认情况下,Amazon Redshift 集群可用的 IAM 角色可供该集群上的所有用户使用。您可以选择将 IAM 角色限制为特定集群或特定区域上的特定 Amazon Redshift 数据库用户。

要仅允许特定数据库用户使用 IAM 角色,请执行以下步骤。

识别有权访问 IAM 角色的特定数据库用户

  1. 确定 Amazon Redshift 集群中数据库用户的 Amazon 资源名称 (ARN)。数据库用户的 ARN 格式为:arn:aws:redshift:region:account-id:dbuser:cluster-name/user-name。

  2. 通过 url="https://console.aws.amazon.com/ 打开 IAM 控制台。

  3. 在导航窗格中,选择角色。

  4. 选择您想要限制为特定 Amazon Redshift 数据库用户的 IAM 角色。

  5. 选择信任关系选项卡,然后选择编辑信任关系。允许 Amazon Redshift 代表您访问其他 AWS 服务的新 IAM 角色具有如下信任关系:

{

  "Version": "2012-10-17",

  "Statement": [

    {
      "Effect": "Allow",
      "Principal": {
        "Service": "redshift.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}               
Run Code Online (Sandbox Code Playgroud)
  1. 将条件添加到信任关系的 sts:AssumeRole 操作部分,将 sts:ExternalId 字段限制为您指定的值。为您想要授予角色访问权限的每个数据库用户包含一个 ARN。

例如,以下信任关系指定只有 us-west-2 区域中集群 my-cluster 上的数据库用户 user1 和 user2 有权使用此 IAM 角色。

{

  "Version": "2012-10-17",

  "Statement": [

  {

    "Effect": "Allow",
    "Principal": { 
      "Service": "redshift.amazonaws.com" 
    },
    "Action": "sts:AssumeRole",
    "Condition": {
      "StringEquals": {
        "sts:ExternalId": [
          "arn:aws:redshift:us-west-2:123456789012:dbuser:my-cluster/user1",
          "arn:aws:redshift:us-west-2:123456789012:dbuser:my-cluster/user2"
        ]
      }
    }
  }]
}      
Run Code Online (Sandbox Code Playgroud)

7.选择更新信任策略。

  • 这对我没有帮助。它只是增加了另一层限制。 (4认同)

dr3*_*m3r 0

搜索了一段时间后得到了解决方案。我按照 John 的建议为 redshift 创建了单独的 IAM 角色,这是一个正确的建议,但在我的情况下不是问题。然后按照线程解决问题:使用 IAM 角色从远程 S3 复制 - 未授权承担 IAM 角色

我要在帐户设置中激活我的集群所在的区域