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

Lambda using python 3.6 & boto3 in VPC times out when connecting to Redshift

我正在尝试在 python3.6 中使用 boto3,通过 get_cluster_credentials API 连接到我的 Redshift 集群。当 Lambda 函数添​​加到 VPC 时,以下代码会在 100% 的时间内超时。当 Lambda 未添加到 VPC 时,它运行没有问题。

我无法确定 get_cluster_credentials 是否使用 public 或私有 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 个互联网网关:igw-0d1e6dcbfdea792b2

我在 VPC 中有 1 个子网和 1 个路由 table。路由 table 有一条规则映射 0.0.0.0/0 --> igw-0d1e6dcbfdea792b2.

我可以使用 SQL Workbench/J 从 AWS 外部连接到集群,没有问题。

我看了很多帖子、主题和文档,但无法弄清楚发生了什么:

Connect Lambda to Redshift in Different Availability Zones

https://github.com/awslabs/aws-lambda-redshift-loader/issues/86

https://aws.amazon.com/blogs/big-data/a-zero-administration-amazon-redshift-database-loader/

Conecting AWS Lambda to Redshift - Times out after 60 seconds

请帮忙。

非常感谢。

根据 ,当 AWS Lambda 函数添​​加到 VPC 时,它不会收到 Public IP 地址。因此,如果该函数希望访问 Internet(在本例中为进行 get_cluster_credentials() 调用),您应该:

  • 在 Public 子网
  • 中添加 NAT 网关
  • 将 Lambda 函数附加到 私有子网
  • 在私有子网上设置路由以使用 0.0.0.0/0
  • 的 NAT 网关

如果只有一个子网,则无法使用,因为 Lambda 函数将无法访问 NAT 网关。

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

您应该能够从 VPC 直接 连接到 RedShift,而无需 Internet 或 NAT 网关。这就是 AWS PrivateLink 的用途,并且支持 RedShift。

流程的一般描述(服务特定变化适用):

  • 转到 AWS 控制台中的 VPC -> 端点
  • 创建新端点
  • Select 您要为其创建端点的服务
    • 配置端点安全组等

现在,在您创建客户端的代码中,您需要为客户端定义区域端点。

免责声明:我没有为 RedShift 做过这个,但我已经为 STS 做了,而且它有效。