У меня есть лямбда-функция (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
Пожалуйста, дайте мне знать, если необходимы дополнительные подробности.Я пытался отладить это в течение недели, но я не мог понять это, любая помощь будет оценена!