AWS Lambda получает ошибку «Отказано в доступе» при вызове операции Redshift «CreateCluster», даже если роль IAM имеет полное разрешение Redshift - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть лямбда-функция (rsops), написанная на Python 2.7 для создания кластера Redshift путем вызова метода create_cluster () boto3:

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)

Роль 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": "*"
        }
    ]
}

Политика доверия предоставляет перманент «AssumeRole» для EC2, Lambda и Redshift:

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

Но я получаю сообщение об ошибке «Access Deinied»:У меня нет разрешения на выполнение вызова 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 () и description_clusters () без проблем, я также вызывал get_caller_identity () из STS API boto3 дляубедитесь, что используется правильная роль IAM.

Я запускаю функцию Lambda в частной подсети, которая имеет доступ в Интернет через экземпляр NAT, но частная подсеть не должна быть проблемой, так как у меня запущены другие функции Lambdaв этом.Я раскрутил экземпляр со следующей средой в той же подсети с той же ролью IAM, но все еще получаю ту же ошибку:

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

Пожалуйста, дайте мне знать, если необходимы дополнительные подробности.Я пытался отладить это в течение недели, но я не мог понять это, любая помощь будет оценена!

1 Ответ

0 голосов
/ 19 декабря 2018

Только что вернулся из лофта AWS поблизости, хороший парень помог мне сообразить, что мне нужна куча 'ec2: Describe *' в моем IAM:

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

Я думаю, что Lambda нуждается в нихпроверить, действительно ли существует VPC / Subnet / Security Group, которую вы указали в вызове create_cluster.Я фактически изменил встроенную политику AmazonRedshiftFullAccess для своей роли, чтобы ограничить разрешения.

...