【问题标题】:AWS Redshift: Masteruser not authorized to assume roleAWS Redshift:Masteruser 无权担任角色
【发布时间】:2018-09-10 10:05:08
【问题描述】:

我用 redshift 集群和一个 masteruser:testuser 创建了一个 cloudformation 堆栈

"RedshiftCluster" : {
  "IamRoles" : [
      {
        "Fn::GetAtt": [
          "IAMInstanceRole",
          "Arn"
        ]
      }
    ]
  ... other configurations

它使用以下 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": "*"
            }
          ]
        }
      } 
    ]
  }

我正在尝试使用复制命令和 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 '|';

我得到错误:

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]
  -----------------------------------------------

请提出一些解决方案。

【问题讨论】:

  • 正如约翰的回答所定义的,您的代理角色文档不能有超过 1 个 AWS 服务。为每个服务创建单独的 IAM 角色。
  • 即使在创建了单独的红移角色后,我仍然遇到同样的错误,您能否建议可能出了什么问题?

标签: amazon-web-services amazon-redshift amazon-iam


【解决方案1】:

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

无论如何,这为我解决了问题。 希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我解决了这个问题! 默认情况下,可用于 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"
        }
      ]
    }               
    
    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"
            ]
          }
        }
      }]
    }      
    

    7.选择更新信任策略。

    【讨论】:

    【解决方案3】:

    这是一个可以正常工作的模板:

    {
        "AWSTemplateFormatVersion": "2010-09-09",
        "Resources": {
            "RedshiftRole": {
                "Type": "AWS::IAM::Role",
                "Properties": {
                    "RoleName": "Redshift-Role",
                    "AssumeRolePolicyDocument": {
                        "Version": "2012-10-17",
                        "Statement": [
                            {
                                "Effect": "Allow",
                                "Principal": {
                                    "Service": [
                                        "redshift.amazonaws.com"
                                    ]
                                },
                                "Action": [
                                    "sts:AssumeRole"
                                ]
                            }
                        ]
                    },
                    "Path": "/",
                    "Policies": [
                        {
                            "PolicyName": "root",
                            "PolicyDocument": {
                                "Version": "2012-10-17",
                                "Statement": [
                                    {
                                        "Effect": "Allow",
                                        "Action": "s3:*",
                                        "Resource": "*"
                                    }
                                ]
                            }
                        }
                    ]
                }
            },
            "RedshiftSG": {
                "Type": "AWS::EC2::SecurityGroup",
                "Properties": {
                    "GroupName": "Redshift Security Group",
                    "GroupDescription": "Enable access to redshift",
                    "VpcId": "vpc-11223344",
                    "SecurityGroupIngress": [
                        {
                            "IpProtocol": "tcp",
                            "FromPort": 5439,
                            "ToPort": 5439,
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "Tags": [
                        {
                            "Key": "Name",
                            "Value": "Redshift Security Group"
                        }
                    ]
                }
            },
            "RedshiftCluster": {
                "Type": "AWS::Redshift::Cluster",
                "Properties": {
                    "ClusterType": "single-node",
                    "NodeType": "dc2.large",
                    "MasterUsername": "master",
                    "MasterUserPassword": "YourPassword",
                    "IamRoles": [
                        {
                            "Fn::GetAtt": [
                                "RedshiftRole",
                                "Arn"
                            ]
                        }
                    ],
                    "VpcSecurityGroupIds": [
                        {
                            "Ref": "RedshiftSG"
                        }
                    ],
                    "PubliclyAccessible": true,
                    "Port": 5439,
                    "DBName": "foo"
                }
            }
        }
    }
    

    请务必在安全组中插入您自己的VpcId

    该角色可以由 Redshift 担任并授予对s3:* 的访问权限(您应该缩小范围)。

    【讨论】:

    • 我按照建议创建了一个单独的红移角色,只有我的安全组的 SecurityGroupIngress 不同:“SecurityGroupIngress”:[{“IpProtocol”:“tcp”,“FromPort”:“5439”,“ ToPort”:“5439”,“CidrIp”:“10.1.0.0/16”},{“IpProtocol”:“tcp”,“FromPort”:“5439”,“ToPort”:“5439”,“CidrIp”:“ 52.89.255.224/27" } ] 我仍然遇到与上述相同的错误
    • “无权承担 IAM 角色”错误与安全组无关。您可以进入 Redshift 控制台并将集群与所需角色相关联,这应该可以修复错误。
    • 问题出在安全令牌区域服务上,我使用此线程解决了该问题:forums.aws.amazon.com/thread.jspa?messageID=782458&tstart=0,感谢您的帮助。我将其添加为答案。
    【解决方案4】:

    我试图从 Redshift 访问 Glue 数据目录。我创建了附加了必要策略(AWSGlueServiceRole、AmazonS3FullAccess)的角色,并将其添加到集群中。但是,我已将 AWS 服务设置为 Glue,但它应该是 Redshift,因为 Redshift 是需要访问的服务。将这些策略附加到我拥有的 Redshift 角色(并在必要时将角色添加到集群)解决了我的问题。

    【讨论】:

      【解决方案5】:

      搜索了一段时间后得到了解决方案。我按照 John 的建议为 redshift 创建了单独的 IAM 角色,这是一个正确的建议,但在我的情况下不是问题。 然后按照线程解决问题:Copy from remote S3 using IAM Role - not authorized to assume IAM Role

      我要激活我的集群所在的区域Account Settings

      【讨论】:

        【解决方案6】:

        解决了

        完成的步骤:

        • 在与 redshift (move-redshift-data) 相同的区域中创建 s3 存储桶
        • 在其中创建一个文件夹。 (移动红移数据)
        • 创建一个 IAM 角色 (move-redshift-data-role),附加 S3Fullaccesss 并将以下内容添加到信任关系中

          {
            "Version": "2012-10-17",
            "Statement": [
              {
                "Effect": "Allow",
                "Principal": {
                  "AWS": "arn:aws:iam::126111577039:root”
                },
                "Action": "sts:AssumeRole"
              }
            ]
          }
          

        其中126111577039是redshift集群的账号ID

        • 发现您已将角色附加到集群
          • 打开你的 redshift 集群
          • 点击操作 -->管理 IAM 角色
          • 您可以看到角色(我的是 RedshiftDynamoDBAccess)
        • 在 IAM 控制台中打开角色并将以下内联策略附加到它。

        将以下策略添加到已与 redshift 集群关联的角色(参见管理集群)

        {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Action": [
                        "sts:AssumeRole"
                    ],
                    "Resource": "arn:aws:iam::888850378087:role/move-redshift-data-role"
                }
            ]
        }
        

        其中 888850378087 :其中包含 s3 存储桶和 move-redshift-data 角色的帐户

        • 最后运行命令

          unload ('select * from sellercompliancestate') 
          to 's3://unload-swarnimg/unload-swarnimg/'
          iam_role 'arn:aws:iam::126111577039:role/RedshiftDynamoDBAccess,arn:aws:iam::888850378087:role/move-redshift-data-role'
          allowoverwrite
          format as csv;
          

        【讨论】:

          【解决方案7】:

          我想通了。

          删除集群、重启或管理 redshift 集群中的 IAM 角色是没有用的。

          尽管我多次执行上述操作,但仍然出现错误。然后我尝试了以下步骤。

          在 COPY 命令中提供访问密钥 ID 和密钥,而不是 IAM 角色。示例如下。

          从“s3://awssampledbuswest2/tickit/allusers_pipe.txt”复制用户 凭证 'aws_access_key_id=;SKDFHSJKD;aws_secret_access_key=SDJHFJHajhsdjh' 分隔符“|”区域'us-west-2';

          【讨论】:

          • 您应该删除您的 aws_access_key_id 和 aws_secret_access_key 并放入占位符。
          猜你喜欢
          • 2021-03-09
          • 2023-03-13
          • 2018-09-19
          • 2016-03-24
          • 2019-10-19
          • 2019-09-10
          • 2021-03-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多