用户无权承担IAM角色

时间:2019-04-20 22:05:44

标签: python sqlalchemy amazon-redshift amazon-cloudformation

我有一个bash脚本,该脚本从CloudFormation堆栈中提取信息并将其放入Python脚本中。 Python脚本旨在连接到Redshift数据库,创建表,然后从从S3存储桶下载的文件中导入数据。

第一部分有效:

time_sleep

这将必要的字符串放到需要的地方:

endpoint=$(aws cloudformation describe-stacks --stack-name=BallotOnlineRS --region=us-west-2 \
            --query 'Stacks[0].Outputs[?OutputKey==`RedshiftClusterEndpointAddress`].OutputValue' \
            --output text)

role=$(aws cloudformation describe-stack-resources --stack-name=BallotOnlineRS --region=us-west-2 \
            --logical-resource-id RawDataBucketAccessRole |grep 'PhysicalResourceId' |cut -d: -f2 |sed 's/^ //; s/,//; s/"//g')

sed -i "s/ENDPOINT/${endpoint}/; s/ROLE/${role}/" /tmp/ballotonline_data.py

但是,当我执行Python脚本时,我从HOST = 'ballotonliners-redshiftcluster-xxxxxxxxxxxx.cgsdneukfjtv.us-west-2.redshift.amazonaws.com' ARN_CREDENTIALS = 'arn:aws:iam::xxxxxxxxxxx:role/BallotOnlineRS-RawDataBucketAccessRole-xxxxxxxxxxxx 中收到以下错误:

sqlalchemy

错误中提到的sqlalchemy.exc.InternalError: (psycopg2.errors.InternalError_) User arn:aws:redshift:us-west-2:xxxxxxxxxxx:dbuser:ballotonliners-redshiftcluster-1qb2hxkta10t9/admin is not authorized to assume IAM Role arn:aws:iam::xxxxxxxxxxx:role/BallotOnlineRS-RawDataBucketAccessRole-1U56NHFY528VW DETAIL: ----------------------------------------------- error: User arn:aws:redshift:us-west-2:xxxxxxxxxxx:dbuser:ballotonliners-redshiftcluster-xxxxxxxxxxxx/admin is not authorized to assume IAM Role arn:aws:iam::xxxxxxxxxxx:role/BallotOnlineRS-RawDataBucketAccessRole-xxxxxxxxxxxx code: 8001 context: IAM Role=arn:aws:iam::xxxxxxxxxxx:role/BallotOnlineRS-RawDataBucketAccessRole-xxxxxxxxxxxx query: 76 location: xen_aws_credentials_mgr.cpp:272 process: padbmaster [pid=13823] ----------------------------------------------- 用户是在创建Redshift堆栈时创建的,并且如果我通过登录查询编辑器通过Redshift UI访问数据库,则使用同一帐户不会出错。那种情况的不同之处在于,我使用用户名:password登录,而不是假设一个角色。具体来说,就是错误中的一个。

Redshift堆栈是使用模板provided by Thorntech构建的。执行时也成功。

对这个问题有什么想法吗?

编辑: 我发现AWS Developer forum上应该是一个相同的问题,表明我应该使用逻辑ID,而不是使用物理资源ID。在这种情况下,我应该使用admin而不是BallotOnlineRS-RawDataBucketAccessRole-xxxxxxxxxxxx。但是,这会导致相同的错误,不同之处在于逻辑ID会替换物理ID。

EDIT2: 为了回答约翰·罗滕斯坦有关角色关联的问题,以下部分定义了集群及其相关组件:

RawDataBucketAccessRole

在角色之前定义集群是否重要?我怀疑不是这样,因为该角色在CF UI的堆栈的“资源”选项卡下列出。

EDIT3: 我找到了另一个similar issue,但不是一个产品。 OP指出他找到了解决方案。由于他使用了错误的身份进行身份验证。当我研究该问题的途径时,它似乎并不适用,因为我只有一个角色。

1 个答案:

答案 0 :(得分:0)

我到达要扔东西在墙上的地方,看会粘住什么。最终我得到了它的工作。我不知道的是,我一次做出的最后两个更改中的哪一个解决了问题(或原因):将Path:属性添加到IAM::Role定义中或将策略与角色定义并删除外部策略定义。我最终得到的是(与我在上面的问题正文中所进行的比较)

  RawDataBucketAccessRole:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - 
            Effect: Allow
            Principal:
              Service:
                - 'redshift.amazonaws.com'
            Action:
              - 'sts:AssumeRole'
      Path: '/'
      RoleName: RawDataBucketAccessRole
      Policies:
        - 
          PolicyName: RawDataBucketRolePolicy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - 
                Effect: Allow
                Action:
                  - 's3:Get*'
                  - 's3:List*'
                Resource: '*'

这允许admin用户(在MasterUsername参数中定义)承担角色并访问S3存储桶。

相关问题