AWS Redshift:未授权Masteruser承担角色

时间:2018-03-31 16:41:13

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

我使用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": "*"
            }
          ]
        }
      } 
    ]
  }

我正在尝试使用copy命令和iam_role作为凭据将c3v文件从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]
  -----------------------------------------------

请提出一些解决方案。

7 个答案:

答案 0 :(得分:5)

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

那反正为我解决了这个问题。 希望这会有所帮助。

答案 1 :(得分:1)

这是一个可行的模板:

{
    "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:*的访问权限(您应该减少范围)。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

我知道了。

在redshift群集中没有使用删除群集,重新启动或管理IAM角色的操作。

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

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

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

答案 4 :(得分:0)

我解决了这个问题! 默认情况下,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。选择更新信任策略。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

解决了

完成以下步骤:

  • 在与redshift(move-redshift-data)相同的区域中创建s3存储桶
  • 在其中创建一个文件夹。 (move-redshift-data)
  • 创建一个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;