连接到Redshift时,在VPC中使用python 3.6和boto3的Lambda超时

时间:2019-02-07 03:40:55

标签: python-3.x amazon-web-services aws-lambda amazon-vpc

我正在尝试使用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

请帮助。

非常感谢。

1 个答案:

答案 0 :(得分:3)

根据your other question,将AWS Lambda函数添加到VPC时,它不会收到公共IP地址。因此,如果函数希望访问Internet(在这种情况下要进行get_cluster_credentials()调用),则应该:

  • 在公共子网中添加 NAT网关
  • 将Lambda函数附加到私有子网
  • 在专用子网上设置路由,以将NAT网关用于0.0.0.0/0

如果只有一个子网,它将无法使用,因为Lambda功能将无法访问NAT网关。

我也成功地手动为Lambda函数的ENI分配了一个弹性IP地址(而不是使用NAT网关),但这并不能扩展,因为Lambda可能会部署其他容器,因此会部署其他ENI 。如果该功能很少且永远不会同时运行,那就足够了。