我正在尝试使用get_cluster_credentials API在python3.6中使用boto3连接到我的Redshift集群。将Lambda函数添加到VPC时,以下代码会使100%的时间超时。未将Lambda添加到VPC时,它可以正常运行。
我不知道get_cluster_credentials是使用公共IP还是私有IP访问Redshift。我也想不出是否有办法强迫它使用一个或另一个。
import json
import boto3
def lambda_handler(event, context):
redshiftClient = boto3.client('redshift', region_name='us-east-1')
cluster_creds = redshiftClient.get_cluster_credentials( DbUser='awsuser',
DbName='dev',
ClusterIdentifier='redshift-cluster-1',
AutoCreate=False)
print(cluster_creds)
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
我的配置非常简单。 NACL允许所有端口和协议上的所有内容(0.0.0.0/0)通过。我的SG也做同样的事情。
我定义了1个Internet网关:igw-0d1e6dcbfdea792b2
我在VPC中有1个子网和1个路由表。路由表有一条规则可以映射0.0.0.0/0-> igw-0d1e6dcbfdea792b2。
我能够使用SQL Workbench / J从AWS外部从外部连接到群集,
我查看了许多帖子,主题和文档,但无法弄清正在发生什么:
AWS Lambda times out connecting to RedShift
Connect Lambda to Redshift in Different Availability Zones
https://github.com/awslabs/aws-lambda-redshift-loader/issues/86
Accessing Redshift from Lambda - Avoiding the 0.0.0.0/0 Security Group
https://aws.amazon.com/blogs/big-data/a-zero-administration-amazon-redshift-database-loader/
Conecting AWS Lambda to Redshift - Times out after 60 seconds
请帮助。
非常感谢。
答案 0 :(得分:3)
根据your other question,将AWS Lambda函数添加到VPC时,它不会收到公共IP地址。因此,如果函数希望访问Internet(在这种情况下要进行get_cluster_credentials()
调用),则应该:
0.0.0.0/0
如果只有一个子网,它将无法使用,因为Lambda功能将无法访问NAT网关。
我也成功地手动为Lambda函数的ENI分配了一个弹性IP地址(而不是使用NAT网关),但这并不能扩展,因为Lambda可能会部署其他容器,因此会部署其他ENI 。如果该功能很少且永远不会同时运行,那就足够了。