即使 IAM 角色具有完整的 Redshift 权限,AWS Lambda 在调用 Redshift 的“CreateCluster”操作时也会出现“拒绝访问”错误

Posted

技术标签:

【中文标题】即使 IAM 角色具有完整的 Redshift 权限,AWS Lambda 在调用 Redshift 的“CreateCluster”操作时也会出现“拒绝访问”错误【英文标题】:AWS Lambda gets 'Access Denied' error when calling Redshift 'CreateCluster' operation even when IAM role has full Redshift permission 【发布时间】:2018-12-17 17:50:07 【问题描述】:

我有一个用 Python 2.7 编写的 Lambda 函数 (rsops),通过调用 boto3 的“create_cluster()”方法来创建 Redshift 集群:

def spinup_cluster(CID, RSU, RSP, RSDB, RSSG, RSAZ, RSPG):
    RSC = boto3.client('redshift', region_name=RSAZ[:-1])

    return RSC.create_cluster(
        DBName=RSDB,
        ClusterIdentifier=CID,
        ClusterType='multi-node',
        NodeType='ds2.xlarge',
        MasterUsername=RSU,
        MasterUserPassword=RSP,
        VpcSecurityGroupIds=[RSSG],
        ClusterSubnetGroupName='data',
        AvailabilityZone=RSAZ,
        PreferredMaintenanceWindow='sun:03:00-sun:03:30',
        ClusterParameterGroupName=RSPG,
        AutomatedSnapshotRetentionPeriod=1,
        Port=5439,
        ClusterVersion='1.0',
        AllowVersionUpgrade=True,
        NumberOfNodes=2,
        PubliclyAccessible=True,
        Tags=[
            
                'Key': 'product',
                'Value': 'data'
            ,
        ],
        Encrypted=False)

分配给此 Lambda 函数的 IAM 角色拥有对 Redshift 的完全访问权限(用于测试目的):


    "Version": "2012-10-17",
    "Statement": [
        
            "Sid": "LambdaInvokeLambda",
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction"
            ],
            "Resource": [
                "arn:aws:lambda:us-east-1:012345678901:function:spinuprs*",
                "arn:aws:lambda:us-east-1:012345678901:function:rsops*"
            ]
        ,
        
            "Sid": "PassRoleOverToUser",
            "Effect": "Allow",
            "Action": [
                "iam:GetRole",
                "iam:PassRole"
            ],
            "Resource": [
                "arn:aws:lambda:us-east-1:012345678901:function:rsops*",
                "arn:aws:redshift:us-east-1:012345678901:cluster:*",
                "arn:aws:redshift:us-west-2:012345678901:cluster:*"
            ]
        ,
        
            "Sid": "RSAccess",
            "Action": "redshift:*",
            "Effect": "Allow",
            "Resource": "*"
        
    ]

信任策略授予 EC2、Lambda 和 Redshift 'AssumeRole' 权限:


  "Version": "2012-10-17",
  "Statement": [
    
      "Effect": "Allow",
      "Principal": 
        "Service": [
          "ec2.amazonaws.com",
          "redshift.amazonaws.com",
          "lambda.amazonaws.com"
        ]
      ,
      "Action": "sts:AssumeRole"
    
  ]

但我不断收到“拒绝访问”错误,说我没有权限进行“CreateCluster”调用:

Spin up testcluster (us-east-1, 1-node) ...
Traceback (most recent call last):
  File "./rsops.py", line 163, in <module>
    resp=spinup_cluster(cid, rsu, rsp, rsdb, rssg, rsaz, rspg)
  File "./rsops.py", line 87, in spinup_cluster
    Encrypted=False)
  File "/usr/local/lib/python2.7/site-packages/botocore/client.py", line 320, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/usr/local/lib/python2.7/site-packages/botocore/client.py", line 624, in _make_api_call
    raise error_class(parsed_response, operation_name)
botocore.errorfactory.UnauthorizedOperation: An error occurred (UnauthorizedOperation) when calling the CreateCluster operation: Access Denied. Please ensure that your IAM Permissions allow this operation.

我可以毫无问题地调用 delete_cluster() 和 describe_clusters(),我还从 boto3 STS API 调用了“get_caller_identity()”以验证它使用的是正确的 IAM 角色。

我正在通过 NAT 实例访问 Internet 的私有子网中运行 Lambda 函数,但私有子网应该不是问题,因为我在其中运行了其他 Lambda 函数。我在同一子网中启动了一个具有以下环境的实例,并附加了相同的 IAM 角色,但我仍然收到相同的错误:

AMI: amzn-ami-hvm-2018.03.0.20181129-x86_64-gp2
Python version: 2.7.14
boto3 version: 1.9.64

如果需要更多详细信息,请告诉我。我已经尝试调试了一周,但我无法弄清楚,任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

刚从附近的 AWS 阁楼回来,那里的一个好人帮我弄清楚我的 IAM 中需要一堆“ec2:Describe*”烫发:

ec2:DescribeAccountAttributes
ec2:DescribeAddresses
ec2:DescribeAvailabilityZones
ec2:DescribeSecurityGroups
ec2:DescribeSubnets
ec2:DescribeVpcs
ec2:DescribeInternetGateways

我猜 Lambda 需要他们检查您在“create_cluster”调用中指定的 VPC/子网/安全组是否确实存在。我实际上为我的角色修改了内置的“AmazonRedshiftFullAccess”策略以收紧权限。

【讨论】:

以上是关于即使 IAM 角色具有完整的 Redshift 权限,AWS Lambda 在调用 Redshift 的“CreateCluster”操作时也会出现“拒绝访问”错误的主要内容,如果未能解决你的问题,请参考以下文章

AWS Lambda:即使在STS:AssumeRole成功之后,lambda函数仍然使用旧的IAM角色

仅使用实例角色从 Java 应用程序向 SES 发送邮件

AWS IAM 策略允许用户创建具有特定策略/角色的 IAM 用户

AWS IAM 找到具有特定策略的角色?

试图让红移用户访问 IAM 角色,受信任的实体列表已更新,但仍然出现相同的错误

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